面向对象II

本文深入探讨Java编程的基础概念,包括代码块、局部代码块、构造代码块、静态关键字的作用,以及静态成员与普通成员的区别。同时,介绍数组操作工具类的使用,以及Math工具类的常用方法。最后,详细解析单例模式的设计与实现,包括饿汉式和懒汉式的区别及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码块:

就是通过一对大括号括起来的部分

局部代码块:

     在方法中使用的代码块就是局部代码块

作用:

可以控制变量的使用范围

构造代码块:

       在类中使用的代码块就是构造代码块

作用:

可以给成员变量赋值,在构造方法前执行

 

代码体现:

class Person {

     Stringname;

     intage;

          //构造代码块

     {

                         System.out.println(name + "***" + age);

     }

 

 

     publicPerson(){

 

          System.out.println(name+ "***" + age);

          name= "大龙猫";

          age= 3;

     }

 

     {

          name= "加菲猫";

          age= 15;

     }

 

     publicvoid method () {

          System.out.println(name+ "***" + age);

     }

 

}

 

class CodeBlockDemo {

     publicstatic void main(String[] args) {

                    //创建对象

          Personp = new Person();

          p.method();

 

     }

}

 

//程序执行的结果依次为:

//null***0

//加菲猫***15

//大龙猫 *** 3 

 

 

static关键字的由来(结合以下代码分析):

当前定义的对象都是中国的

每次给对象赋值, country--> "中国",占用了4个字节

那么,如果我们有100个对象,那就占用了400个字节。

而我们发现,国家是一样的,这个成员变量重复了,

能否让它不重复呢?能,java中提供了一个关键字,static

作用是:把所有对象共享的属性定义为静态。

 

通过观察下列代码的结果发现:

非静态的成员变量修改,只对当前对象有效;

而静态的成员变量修改,对所有的对象有效;

所以,可以将所有对象共享的属性定义为静态的。

 

代码体现:

class Person {

     Stringname;

     intage = 30;

     staticString country = "中国";

 

     publicPerson(){}

 

     publicPerson(String name) {

          this.name= name;

     }

 

     publicPerson (String name, int age, String country) {

          this.name= name;

          this.age= age;

          this.country= country;

     }

}

 

class StaticDemo {

     publicstatic void main(String[] args) {

          Personp = new Person("成龙",60,"中国");

          System.out.println(p.name+ "***" + p.age + "***" + p.country);

          Personp2 = new Person("李连杰", 52, "中国");

          System.out.println(p2.name+ "***" + p2.age + "***" + p2.country);

 

          Personp3 = new Person("成龙");

          p3.age= 58;

          p3.country= "美国";

          System.out.println(p3.name+ "***" + p3.age + "***" + p3.country);

 

          Personp4 = new Person("房祖名");

          System.out.println(p4.name+ "***" + p4.age + "***" + p4.country);

     }

}

 

静态成员与普通成员的区别:

1、什么时候存在和消失

     静态成员:静态的随着class的加载而存在,

                       随着class的消失而消失。生命周期长

     普通成员:普通的随着对象的创建而存在,

                      随着对象的消失而消失。

2、存储位置

     静态成员:存放在方法区中

     普通成员;存放在堆中

3、调用不一样

     普通成员:对象.成员

     静态成员:类名.成员或者 对象.成员

     

静态成员与普通成员理解上的区别

静态成员:是所有对象共享同一个变量。

                它是与类相关,类变量

普通成员:变量是每个对象单独拥有的。

                它是与对象相关,实例变量、成员变量

 

 在访问的时候:

          普通成员方法:

                 可以访问普通成员变量、成员方法

                 也可以访问静态成员变量、静态成员方法

          静态成员方法:

                只能方法静态成员变量、静态成员方法

 

          请记住:静态只能访问静态

 

代码体现:

class Demo {

     intnum = 10;

     staticint num2 = 20;

 

     publicvoid show () {

 

 

             //System.out.println(num); 

            //System.out.println(num2);

 

 

          show2();

          method2();

     }

 

     publicvoid show2(){

          System.out.println("haha");

     }

 

     publicstatic void method () {

            //错误:无法从静态上下文中引用非静态变量 num

          //System.out.println(num);

          //System.out.println(num2);

           //错误:无法从静态上下文中引用非静态方法 show2()

          //show2();

          method2();

     }

 

     publicstatic void method2(){

          System.out.println("hehe");

     }

}

 

 

 

class StaticDemo2 {

     publicstatic void main(String[] args) {

          

          Demod = new Demo();

          //System.out.println(d.num);

 

          //System.out.println(d.num2);

          //System.out.println(Demo.num2);

 

          d.show();

          d.method();

          

     }

}

 

数组操作工具类:

使用 ArrayTools.java文件中的方法

     注意:其实我们这里使用的不是ArrayTools.java文件,

               而是 ArrayTools.class文件,调用的是class文件中方法

 

          publicstatic void printArray(int[] arr){..}

          publicstatic int getMax(int[] arr){...}

          publicstatic void selectSort(int[] arr) {...}

          publicstatic void swap(int[] arr, int x, int y) {...}

 

     那么,我把数组工具类 ArrayTools.class 给你,你会用吗?

                将ArrayTools.class文件,与自己编写的java文件代码存放在同一个目录下调用。

代码体现:

class ArrayToolsDemo {

     publicstatic void main(String[] args){

          

          int[]arr = new int[]{1,3,9,6,7};

 

 

 

          //publicvoid printArray(int[] arr){..}

          ArrayTools.printArray(arr);

 

            //获得数组中最大值

          //publicstatic int getMax(int[] arr){

          intmax = ArrayTools.getMax(arr);

          System.out.println("max="+ max);

 

          //排序

          //publicstatic void selectSort(int[] arr) {...}

          ArrayTools.selectSort(arr);

 

          //遍历数组

          //publicstatic void printArray(int[] arr){..}

          ArrayTools.printArray(arr);

 

     }

     

     

}

 

帮组文档:也称API

API:(全称Application Programming Interface)

javadoc -d doc -author -versionArrayTools.java

javadoc 生成帮助文档的命令

-d doc  指定生成文档的目录存放在当前目录下的doc目录 

-author 包含 @author段

-version包含 @version段        

ArrayTools.java指定哪个java文件生成文档

 

main方法解析:

public: JVM调用main方法,所以,要求权限够大, 而public是最大的访问权限

static:方便JVM调用main方法,不需要创建对象

void:JVM调用的main方法,它拿到返回值没有意义

String[] args:字符串数组

 

 

Math工具类的使用:

abs:返回 值的绝对值

ceil:返回该值大于等于参数,并等于某个整数。

floor:返回该值小于等于参数,并等于某个整数。

max:返回两个 int 值中较大的一个。

min:返回两个 int 值中较小的一个。

pow:返回第一个参数的第二个参数次幂的值

random:返回带正号的 double 值,0.0<= x <1.0

round:四舍五入

sqrt:返回正确舍入的 double 值的正平方根

 

设计模式的分类:

总体来说设计模式分为三大类:

创建型模式,共五种:

     工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:

     适配器模式、装饰器模式、代理模式、外观模式、桥接模式、

     组合模式、享元模式。

行为型模式,共十一种:

     策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、

     命令模式、备忘录模式、状态模式、访问者模式、中介者模式、

     解释器模式。

 

其实还有两类:并发型模式和线程池模式

 

单例模式(Singleton):

我们如何保证类在内存中只有一个对象呢?

     1:为了控制该类对象的建立,不让其他的类创建该类的对象.

     2:在本类中应该提供一个本类对象.

     3:提供公共的方式供别人访问这个对象.

 

代码如何实现呢?

     1、构造函数私有化,防止其他类创建该类对象

     2、在本类中,通过new关键字创建一个对象

     3、提供一个public方法,对外访问

具体实现:

//饿汉式

class Student {

     //构造函数私有化,防止其他类创建该类对象

     privateStudent(){ }

 

     //在本类中,通过new关键字创建一个对象

     privatestatic Student stu = new Student();

 

     //提供一个public方法,对外访问

     publicstatic Student getInstance() {

          returnstu;

     }

 

}

 

class SingletonDemo {

     publicstatic void main(String[] args) {

          

          Students1 = Student.getInstance();

           Student s2 = Student.getInstance();

          Students3 = Student.getInstance();

 

          System.out.println(s1== s2 );

          System.out.println(s1== s2 );

     }

}

 

两种单例设计模式的区别?

     饿汉式:对象随着类的加载而创建

    懒汉式:需要使用的时候,再创造对象,以后使用的是同一个对象。

 

使用场合:

     工作的时候:饿汉式

     面试的时候:懒汉式

     原因:懒汉式,会出现线程安全问题

 

//懒汉式

class Student {

     

     //防止其他类创建本类对象

     privateStudent(){ }

 

     //在类中创建一个本类对象

     //privatestatic Student stu = new Student();

     //不想类文件,加载到内存中立刻创建对象

     //想调用获取对象的方法的使用,再创建对象

     privatestatic Student stu = null;

 

     //对外提供公共访问方法

     publicstatic Student getInstance() {

          if(stu == null) {

                stu= new Student();

          }

          returnstu;

     }

}

 

class SingletonDemo2 {

     publicstatic void main(String[] args) {

          

          Students1 = Student.getInstance();

          Students2 = Student.getInstance();

 

          System.out.println(s1==s2);

     }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值