类变量和类方法
类变量
类变量(静态变量static):多个对象共享一个公共变量
1、静态变量是所有对象共享的(同一个类的)
2、static变量在类加载的时候就生成了
定义语法:
访问修饰符 static 数据类型 变量名;推荐
static 访问修饰符 数据类型 变量名;
访问方式:
类名.类变量名【推荐】
对象名.类变量名
使用细节:
1、什么时候需要用类变量:
当我们需要让某个类的所有对象共享一个变量时,考虑使用类变量。
2.类变量与实例变量区别
类变量是该类的所有对象共享,实例变量是每个对象独享
3、加上static成为类变量或静态变量。
4、静态变量的访问修饰权限和普通变量相同。
5、java设计者推荐使用类名.变量名进行访问
6、类变量是随着类的加载而创建的,所以即使没有创建对象实例也可以访问。
7、类变量的生命周期是随着类加载开始,随着类消亡为销毁。
类方法
定义语法:
访问修饰符 static 数据类型 变量名 方法名(){};推荐
static 访问修饰符 数据类型 变量名 方法名(){};;
类方法调用:
类名.方法名
类方法的使用场景:
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。
如果我们希望不创建实例时用静态方法。
比如:工具类utils
Math类、Arrays类、Collections类
小结:
开发自己的工具类方便调用和使用,提升开发效率。
注意事项:
1)类方法和普通普通方法都是随着类的加载而加载,将结构信息储存在方法区。
注意:类方法中无this参数
2)类方法可以通过类名调用,也可以通过对象名调用
3)普通方法不能通过类名调用。
4)类方法中不允许使用和对象有关的关键字,比如this和super。
5)类方法中只能访问静态变量或静态方法。
6)普通成员方法,既可以访问普通变量(方法),也可以访问静态变量(方法)。
小结:
静态方法:只能访问静态的成员
非静态方法:能访问静态成员和非静态成员(必须遵守访问权限)
理解main方法语句
深入理解main方法:
解释main方法的形式:
public static void main(String[] args) {
}
1、main方法是虚拟机调用的
2、java虚拟机需要调用main方法,所以该方法访问权限必须为public
3、java虚拟机在执行main方法时,不必创建对象,所以该方法必须为static
4、该方法接收的String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
5、string数组参数是在程序执行main方法时传入
java 执行的程序 参数1 参数2 参数3【idea通过以下传入值】
理解main方法语法:
1、在main方法中,可以直接调用main方法所在类的静态属性,静态方法。
2、不能直接访问该类非静态成员,必须实例化对象后,通过对象调用【语法规则】
代码块
代码块是只有方法体的方法。
调用:
不用通过对象或类显示调用,而是在加载类时,或创建对象时隐式调用
基本语法:
【修饰符】{
};
说明注意:
1、修饰符可写可不写,只能是static类型。
2、分号可省略。
3、代码块的调用优先于构造器
4、每次实例化一个对象时都会调用代码块。
代码块的好处:
相当于另外一种形式的构造器(对构造器的补充机制)可以做初始化的操作。
应用场景:
如果多个构造器中有重复的语句,可以抽取到初始化块中,提高代码的重用性。
代码块使用注意事项:
1)static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次。
普通代码块每创建一个对象执行一次。
补充:类在什么时候被加载:
①当创建对象实例时(new)
②创建子类对象实例,父类也会被加载
③使用类的静态成员时(静态属性,静态方法)
2)普通的代码块,在创建对象实例时,会被隐式调用。
被创建一次就调用一次。
3)创建一个对象时,在一个类的调用顺序(重点、难点):
①调用静态代码块和静态属性初始化
注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用
②调用普通代码块和普通属性的初始化
注意:按定义顺序调用(优先级一致)
③调用构造方法
构造器上隐藏了super方法和调用普通代码块的方法。
4)创建一个子类对象时(继承关系),他们的静态代码块,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下:
①父类的静态代码块和静态属性(优先级一致,按定义顺序执行)
②子类的静态代码块和静态属性(优先级一致,按定义顺序执行)
③父类的普通代码块和普通属性初始化(优先级一致,按定义顺序执行)
④父类的构造方法
⑤子类的普通代码块和普通属性初始化(优先级一致,按定义顺序执行)
⑥子类的构造方法
5)静态代码块只能直接调用静态成员(静态属性和静态方法)
普通代码块不限制
单例设计模式
静态方法和属性的经典使用
单例(单个实例):
采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
单例设计模式:
1、饿汉式
2、懒汉式
饿汉式
步骤如下:
1、构造器私有化→防止直接new一个对象
2、在类的内容创建一个对象
3、向外暴露一个静态的公共方法,如getInstance
注意:可能创建了但是没有用,可能会造成资源浪费。
class GirlFriend{
private String name;
private GirlFriend(String name) {
this.name = name;
}
private static GirlFriend gf = new GirlFriend("alice");
public static GirlFriend