7.3 static修饰成员方法
一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,Student类中classRoom属性如何在类外访问呢?
public class Student{ private String name; private String gender; private int age; private double score; private static String classRoom = "Bit306"; //private修饰,只能在该类内部访问 // ... } public class TestStudent { public static void main(String[] args) { System.out.println(Student.classRoom); } } //编译失败
那static属性应该如何访问呢?
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
public class Student{ // ... private static String classRoom = "Bit306"; // ... public static String getClassRoom(){ return classRoom; } } public class TestStudent { public static void main(String[] args) { System.out.println(Student.getClassRoom()); } }
输出:Bit306
【静态方法特性】
- 不属于某个具体的对象,是类方法
- 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
- 不能在静态方法中访问任何非静态成员变量
- 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
关于第3、4点:
可以看到两行代码都报错了
可以这样写:
那我们要如何在静态成员内部调用非静态成员、方法呢?
我们可以new一个对象出来,通过对象名加点来调用。
还有一点: 静态方法无法重写,不能用来实现多态
7.4 static成员变量初始化
注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性。
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化。
- 就地初始化:
就地初始化指的是:在定义时直接给出初始值
- 静态代码块初始化
什么是代码块呢?请看下文
8. 代码块
8.1 代码块概念以及分类
使用 {} 定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可分为以下四种:
1.普通代码块
2.构造块
3.静态块
4.同步代码块(涉及多线程部分,此处不做讲解)
8.2 普通代码块
普通代码块:定义在方法中的代码块
public class Main{ public static void main(String[] args) { { //直接使用{}定义,普通方法块 int x = 10 ; System.out.println("x1 = " +x); } int x = 100 ; System.out.println("x2 = " +x); } } // 执行结果 x1 = 10 x2 = 100
8.3 构造代码块
构造块:定义在类中的代码块(不加修饰符)。也叫:实例代码块。构造代码块一般用于初始化实例成员变量。
public class Student{ //实例成员变量 private String name; private String gender; private int age; private double score; public Student() { System.out.println("I am Student init()!"); } //实例代码块 { this.name = "bit"; this.age = 12; this.gender = "man"; System.out.println("I am instance init()!"); } public void show(){ System.out.println("name: "+name+" age: "+age+" gender: "+gender); } } public class Main { public static void main(String[] args) { Student stu = new Student(); stu.show(); } }
输出:
可以看出,它是先调用实例代码块,再调用不带参数的构造方法。
我们再来看看加入静态代码块会怎样。
8.4 静态代码块
使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。
public class Student{ private String name; private String gender; private int age; private double score; private static String classRoom; //实例代码块 { this.name = "bit"; this.age = 12; this.gender = "man"; System.out.println("I am instance init()!"); } // 静态代码块 static { classRoom = "bit306"; System.out.println("I am static init()!"); } public Student(){ System.out.println("I am Student init()!"); } public static void main(String[] args) { Student s1 = new Student(); System.out.println("====================="); Student s2 = new Student(); } }
输出:
我们可以看出:
先执行静态代码块,初始化静态的数据成员,再执行非静态代码块,初始化非静态数据成员,再执行不带参数的构造方法。而静态代码块,不论你实例化了多少对象,它只执行一次(第一次实例化时执行)。
总结:
1.静态代码块不管生成多少个对象,其只会执行一次
2.调用构造方法时,静态代码块最先执行,再是非静态代码块,最后是构造函数
3.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
4.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)
5.实例代码块只有在创建对象时才会执行
最后
看到这里,相信大家都有所收获,对类和对象应该没啥问题了吧,下期给大家讲解继承和多态。