类变量和类方法 和理解main方法语句 代码块
一, 什么是类变量
类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量
二 , 如何定义类变量
访问修饰符 static 数据类型 变量名 :[ 推荐 ]
static 访问修饰符 数据类型 变量名;
三, 如何访问类变量
类名.类变量名
或者 对象名.类变量名 【静态变量的访问修饰符的访问权限和范围 和 普通属性时一样的】
推荐使用 : 类名.类变量名
ublic class Static01 { public static void main(String[] args) { System.out.println(A.name);//类变量是随着类的加载而创建,所以即使没有创建对象实例也可以访问 A a = new A(); System.out.println(a.name);//静态属性可以通过类名.属性名调用 也可 对象.属性名调用 } } class A{ //普通属性/普通成员变量/非静态属性/非静态成员变量/实例变量 public static String name = "阿文程序猿"; }
四, 类变量使用注意事项和细节讨论
1.什么时候需要使用类变量
当我们需要让某个类的所有对象都共享一个变量时,就可以考虑使用类变量(静态变量) 比如 :定义一个学生类,统计所有学生共交多少学费
2. 类变量与实例变量(普通属性)的区别
类变量是该类的所有对象共享的,而实例变量是每个对象独享的
3.加上static称位类变量或静态变量,否则称为实例变量/普通变量/非静态变量
4.类变量可以通过 类名.类变量名 或者 对象名.类变量名 来访问的,但是java设计者推荐我们使用 类名.类变量名方式访问【前提是满足访问修饰符的访问权限和范围
5.实例变量不能通过 类名.类变量名 方式访问
6.类变量是在类加载时就初始化了 ,也就是说 ,即使你没有创建对象 ,只要类加载了 , 就可以使用类变量
7. 类变量的声明周期是随类的加载开始 ,随着类消亡而消亡 。
五 , 类方法基本介绍
1. 类方法也叫静态方法 。
访问修饰符 static 数据返回类型 方法名(){ }
static 访问修饰符 数据返回类型 方法名(){ }
2.类方法的调用
类名.类方法名 或者 对象名.类名方法名
public class Static02 { public static void main(String[] args) { Student student = new Student("网红"); Student.payFeel(100); Student student1 = new Student("大力"); Student.payFeel(200); Student.showFeel(); } static class Student { //模拟学生交学费 体会一下静态方法和属性的好处 public String name; public static int feel = 0; public Student(String name) { this.name = name; } public static void payFeel(int feel) { //交学费 传入一个学费参数 Student.feel += feel; // 总学费总计到静态属性feel中 } public static void showFeel() { System.out.println("总学费" + Student.feel); } } }
六, 类方法的经典使用场景
当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法 提高开发效率
小结:: 当程序员实际开发,往往会将一些通用的方法,设计成静态方法,这样我们不需要创建对象就可以使用了,
七, 类方法使用注意事项和细节讨论
1.)类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区 : 类方法中无this的参数,普通方法中隐含着this的参数
2) 类方法可以通过类名调用,也可以通过对象名调用
3) 普通方法和对象有关 ,需要通过对象名调用,
4)类方法中不允许使用和对象有关的关键字,比如this和super, 普通方法(成员方法)可以
5)类方法(静态方法)中 只能访问 静态变量和 静态方法
6)普通成员方法,既可以访问非静态成员,也可以访问静态成员
小结:静态方法,只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员
八, 深入理解main方法
1. 解释main方法的形式:public static void main(String[] args){}
1)main方法是虚拟机调用
2)java虚拟机需要调整类的main()方法,所以该方法的访问权限必须是public
3)java虚拟机在执行main()方法时不必要创建对象,所以该方法必须是static
4)该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数
5)java 执行的程序 参数 1 参数2 参数3
2. 特别提示
1)在main() 方法中 ,我们可以直接调用main方法所在类的静态方法或静态属性
2) 但是 ,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的分静态成员
public class Main02 { //静态的变量/属性 private static String name = "韩顺平教育"; //非静态的变量/属性 private int n1 = 10000; //静态方法 public static void hi() { System.out.println("Main01 的 hi 方法"); } //非静态方法 public void cry() { System.out.println("Main01 的 cry 方法"); } public static void main(String[] args) { //可以直接使用 name //1. 静态方法 main 可以访问本类的静态成员 System.out.println("name=" + name); hi(); //2. 静态方法 main 不可以访问本类的非静态成员 //System.out.println("n1=" + n1);//错误 //cry(); //3. 静态方法 main 要访问本类的非静态成员,需要先创建对象 , 再调用即可 Main02 main01 = new Main02(); System.out.println(main01.n1);//ok main01.cry(); } }
十 , 代码块
1.基本介绍
代码块又被称位初始化块,属于类中的成员即时类的一部分,类似于方法,将逻辑语句封装在方法体中,通过{}包围起来
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显示调用,而是类加载类时,或创建对象时隐式调用
2.基本语法
修饰符{
代码
};
说明注意:
1)修饰符可选,要写的话 也只能写static
2) 代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块/非静态代码块
3)逻辑语句可以为任何逻辑语句(输入,输出,方法调用,循环,判断等)
4);分号可以写 也可以省略
说明
1)相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化操作
2)场景: 如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性
3.代码块使用注意事项和细节
1)static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且只会执行一次,如果是普通代码块,每创建一个对象就执行
2)类什么时候被加载
1》创建对象实例时
2》创建子类对象实例,父类也会被加载,而且父类优先于子类加载
3》使用类的静态成员时(静态属性,静态方法)
3)普通的代码块,在创建对象实例时,会被隐式的调用
被创建一次 就会调用一次
如果只是使用类的静态成员时,普通代码块并不执行
小结:1》static代码块时类加载时,执行 而且只会执行一次
2》普通代码块是在创建对象时调用的,创建一次,调用一次
3》类加载的三种情况 【记住】
4)创建要给对象时,在一个类中 调用顺序是 【重点】
1》调用静态代码块和非静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量 初始化,则按他们定义的顺序调用
2》调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用
3》调用构造方法
5) 构造器的最前面其实隐含了super()和调用普通代码块,静态相关的代码块,属性初始化,再累加载时就执行完毕,因此是优先于构造器和普通代码块执行的
class A{
public A(){ //构造器
//这里有一个隐藏的执行需求
//1 . super();
//2.调用普通代码块
System.out.println("ok");
}
6)我们看一下创建子类对象时(继承关系),他们的静态代码块代码,静态属性初始化,普通代码块,普通属性初始化,构造方法的调用顺序如下
1>父类的静态代码块和静态属性(优先级一样,按定义顺序执行)
2>子类的静态代码块和静态属性(优先级一样,按定义顺序执行)
3>父类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
4>父类的构造方法
5>子类的普通代码块和普通属性初始化(优先级一样,按定义顺序执行)
6>子类的构造方法
7> 静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员。

浙公网安备 33010602011771号