01 类变量、类方法、main方法、代码块
类变量(静态变量)
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。
关于静态变量在内存中的存放地址,有两种说法,①认为静态变量存放在堆中,②认为静态变量存放在方法区中的方法域中。
不管哪种说法,不影响类变量作为类对象的共享属性的特点。类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问。
实际上,JDK7版本以前是②存放在方法区里的,JDK以上的版本则是①存放在堆里的。在进行类加载时,会在堆里生成一个对应的class对象(原型对象),在这个对象的最后会加载类变量。
定义语法:
访问修饰符 static 数据类型 变量名;
static 访问修饰符 数据类型 变量名;
访问语法:
类名.类变量名
对象名.类变量名 //静态变量的访问修饰符发访问权限,和普通属性一样
使用细节:
- 什么时候使用类变量
当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量):比如:定义学生类,统计所有学生共交多少钱。Student(name, static fee) - 类变量与实例变量(普通属性)的区别
类变量是该类的所有对象共享的,而实例变量是每个对象独享的。 - 加上 static 称为类变量或静态变量,否则称为实例变量/普通变量/非静态变量。
- 类变量可以通过 类名.类变量名 或者 对象名.类变量名 来访问,前提是满足访问修饰符的访问权限和范围。
- 类变量的生命周期随类的加载开始,随类消亡而销毁。
类方法(静态方法)
形式:
访问修饰符 static 数据返回类型 方法名(){}
static 访问修饰符 数据返回类型 方法名(){}
类方法的调用:
类名.类方法名
对象名.类方法名 //前提是满足访问修饰符的访问权限和范围
使用细节:
- 当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。比如,工具类中的方法utils,这样我们不需要创建对象就可以使用了。
- 类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区。类方法中无 this 参数,普通方法中隐含着 this 的参数。
- 普通方法和对象有关,需要通过对象名调用,不能通过类名调用。
- 类方法中不允许使用和对象有关的关键字,比如 this 和super,普通方法可以。
- 类方法(静态方法)中只能访问静态变量或静态方法。普通成员方法,遵守访问权限的前提下,既可以访问非静态成员,也可以访问静态成员。
理解 main 方法
解释 main 方法的形式:public static void main(String[] args){}
- main方法是虚拟机在调用
- Java虚拟机需要调用类的 main() 方法,所以该方法的访问权限必须是public
- Java虚拟机在执行main() 方法时不必创建对象,所以该方法必须是 static
- 该方法接收 String 类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数,接收参数
- Java执行的程序 参数1 参数2 参数3
Eg:
IDEA传参数:edit configurations
代码块
代码块又称为初始化块,,属于类中的成员(即是类的一部分),类似于方法,将逻辑语句封装在方法体中,通过 {} 包围起来
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显示调用,而是加载类时,或创建对象时隐式调用。
语法:
[修饰符]
{代码
};
说明:
- 修饰符可选,只能选static或者不选
- 使用static修饰的叫静态代码块,没有static修饰的叫普通代码块
- 结尾 ; 可写可不写
理解: - 相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化操作
- 当多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性
- 代码块的执行顺序,优先于构造器
使用细节:
- static代码块,随着类的加载而执行,只会执行一次。如果是普通代码块,每创建一个对象,就执行一次。
- 类被加载的3种情况
① 创建对象实例时(new)
② 创建子类对象实例,父类也会被加载
③ 使用类的静态成员时(静态属性、静态方法)
创建对象时,先进行类的加载。先加载父类,再加载子类。(加载静态属性、执行静态代码块)。然后执行构造器,执行构造器时,会默认执行super();