目录
一.类变量和类方法:
1.类变量定义访问:
2.类变量的使用细节:
3.类方法:
4.静态main方法(public static void main(String [] args)):
二.代码块:
1.基本语法:
2.代码块使用细节与注意事项:
三.单例模式(在程序运行过程中,只能创建一个对象实例):
(1)饿汉式单例模式步骤:
(2)懒汉式:
(3)区别:
一.类变量和类方法:
static变量保存在class实例的尾部,class对象保存在堆中。
static变量是同一个类的所有对象共享,static变量在类加载(new创建实例时类加载)的时候就生成了。
1.类变量定义访问:
(1)语法:
访问修饰符 static 数据类型 变量名;
(2)访问:
类名.类变量名(推荐)或者对象.类变量名
静态变量的访问修饰符的访问权限和范围和普通属性是一样的。
类变量是随着类加载而创建的,没有加载的实例也可以使用。
2.类变量的使用细节:
- 实例变量不能通过类名.变量名来访问(非静态变量)
- 类变量在类加载时就初始化了,即使你没有创建对象,只要类加载了,就可以使用类变量了。
- 类变量的声明周期是随着类的加载而开始,随着类消亡而销毁。
3.类方法:
当方法使用static修饰后,方法就是静态方法,静态方法可以访问静态属性/变量。
(1)语法:
访问修饰符 static 数据返回类型 方法名(){ }(推荐)
static 访问修饰符 数据返回类型 方法名(){ }
(2)类方法的调用:
类名.类方法名或对象名.类方法名
(3)类方法的注意事项与使用细节:
非静态方法不能通过类名调用,类方法不允许使用与类相关的关键字(this、super)。
类方法(静态方法)只能访问静态变量或静态方法,普通成员既可以访问非静态成员(变量、方法),又可以访问静态变量(方法)。
4.静态main方法(public static void main(String [] args)):
(1)main方法是Java虚拟机来调用的,所以访问权限是public。
(2)Java虚拟机在执行main方法时不必创建对象,因此是方法必须是static。
(3)该方法接受String类型的数组参数
(4)main方法可以直接调用main方法所在类中的静态方法或静态属性,不能直接访问该类中的静态成员。
(4)main动态传值:
Edit configurations中的Program argument中填入参数,参数之间要以空格隔开。
二.代码块:
- 代码块又称为初始化块,属于类中的成员,类似于方法,将逻辑语句封装在方法体中,通过{}包裹起来。
- 与方法体不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象显示调用,而是加载类时,或创建对象时隐式调用。
- 相当于另一种形式的构造器(对构造器的补充机制),可以做初始化的操作,如果多个构造器中都有重复的语句,可以抽取到代码块中,提高代码的复用性。
- 代码块的执行顺序在构造器之前。
1.基本语法:
[修饰符]{
代码
};
书写注意事项:
- 修饰符可选,要写的话,只能写static
- 代码块分两类,使用static修饰的叫静态代码块,没有static修饰的叫普通代码块。
- 逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断)
2.代码块使用细节与注意事项:
- static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类加载而执行,并且只会执行一次。如果是普通代码块,每创建一个对象就执行一次。
- 如果使用类的静态成员,普通代码并不会执行,而静态代码块会执行。
- 调用静态代码块和静态属性初始化,静态代码块和静态属性初始化调用的优先级一样,如果多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用。(普通代码块)
- 构造器最前面其实隐含了super()和调用普通代码块,静态代码块在类加载时执行。
- 静态代码块只能调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员。
类加载:
- 创建对象实例(new)
- 创建子类对象实例,父类也会被加载。
- 使用类的静态成员时(静态属性、静态方法)
创建一个子类对象时,调用顺序如下:
三.单例模式(在程序运行过程中,只能创建一个对象实例):
(1)饿汉式单例模式步骤:
私有化构造器->类的内部创建对象(静态对象)->向外暴漏一个静态的公共方法->通过公共方法获取对象。
public class Stringto{
public static void main(String[] args){
girlfriend g = girlfriend.getInstance();//通过方法获取对象
girlfriend g2 = girlfriend.getInstance();//g与g2是同一个对象
}
}
class girlfriend{
private static name;
private static girlfriend gf = new girlfriend("小静");//类加载时完成静态属性初始化,只会初始化一次
private girlfriend(String name){
this.name = name;
}
public static girlfriend getInstance(){//只有使用静态对象,才能不创建对象直接调用该方法
return gf;
}
}
(2)懒汉式:
public class Stringto{
public static void main(String[] args){
Cat c1 = Cat.getInstance();
Cat c2 = Cat.getInstance();//c1与c2两个对象相同。
}
}class Cat {
private String name;
public static int n1 = 99;
private static Cat cat;
private Cat(String name){
this.name = name;
}
public static Cat getInstance(){
if(cat == null){
cat == new Cat("小可爱");
}
return cat;
}
}
//懒汉式只有当用户使用getInstance时,才返回cat对象。后面再次调用时,会返回上次创建的cat对象。
(3)区别:
- 饿汉式在类加载就创建了对象实例,懒汉式是在使用时才创建。
- 懒汉式存在线程安全问题,饿汉式存在资源浪费的可能。