static 与 final 修饰符
A) 用static(静态)修饰属性:一个类生成了N个对象,这些对象会共同使用一份静态的成员变量。一个对象对这个成员变量进行修改,其他对象的该成员变量的值也会随之变化。
B) 我们可以通过 类名.成员变量名 来调用这个静态成员变量。
C)static修饰方法: static修饰的方法叫静态犯法。 可以使用 类名.方法名 来调用。
D)静态方法只能继承,不能重写。(子类的静态方法不能覆盖父类的方法,父类的静态方法不能覆盖子类的方法,想要继承,必须都为静态方法)
例:
1 public class Animal
2 {
3 public static void testMethod()
4 {
5 System.out.println("The class method in Animal.");
6 }
7
8 public void testInstanceMethod()
9 {
10 System.out.println("The instance method in Animal.");
11 }
12
13 }
14
15 public class Cat extends Animal
16 {
17 public static void testMethod()
18 {
19 System.out.println("The class method in Cat.");
20 }
21
22 public void testInstanceMethod()
23 {
24 System.out.println("The instance method in Cat.");
25 }
26
27
28 public static void main (String[] args)
29 {
30 Cat myCat = new Cat();
31 Animal myAnimal = myCat;
32 Animal.testMethod();
33 myAnimal.testInstanceMethod();
34 }
35 }
输出的结果为:
The instance method in Animal.
The instance method in Cat.
---------------------------------------------
---------------------------------------------
A)final关键字可以修饰属性,方法,类。
B)final修饰类:一个被final修饰的类时一个终态类,不能被继承。
C)final修饰方法: 一个被final修饰的方法时一个终态方法,不能被重写。
D)final修饰属性:当一个属性被final修饰,这个属性的值不能被改写。
E)当final修饰一个原生数据类型,该原生数据类型的值不能发生变化;当final修饰一个引用类型时,表示该引用类型不能指向别的对象了,但是该对象的内容是可以发生变化的。
F)对于final类型的成员变量,一般有两种赋初值的方法:
a. 在声明final类型的成员变量时就为其赋上初值。
b. 在声明时不赋值,但在类的所有构造方法中都为其赋上初值。
G)static代码块:静态代码块。静态代码块的作用也是完成一些初始化工作。首先执行静态代码块,然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象时执行;想要调用某个类来生成对象,首先需要将类加载到Java的虚拟机上(JVM),然后有JNM加载这个类来生成对象。
H)类的静态代码块只会执行一次,在类被加载的时候执行的,因为每个类只会加载一次,所以静态代码块只会被执行一次;而构造方法不同,每次生成一个对象时都会调用类的构造方法,所以new一次就会调用构造方法一次。
I)如果继承体系中既有构造方法也有静态代码块,那么首先执行最顶层的类静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层类的构造方法。注意:静态代码块只会执行一次。
例子:
1 public class StaticTest
2 {
3 public static void main(String[] args)
4 {
5 new R();
6 new R();
7 }
8 }
9
10 class P
11 {
12 static
13 {
14 System.out.println("P static block");
15 }
16
17 public P()
18 {
19 System.out.println("P constructor");
20 }
21 }
22
23 class Q extends P
24 {
25 static
26 {
27 System.out.println("Q static block");
28 }
29
30 public Q()
31 {
32 System.out.println("Q constructor");
33 }
34 }
35
36 class R extends Q
37 {
38 static
39 {
40 System.out.println("R static block");
41 }
42
43 public R()
44 {
45 System.out.println("R constructor");
46 }
47 }
输出的结果为:
P static block
Q static block
R static block
P constructor
Q constructor
R constructor
P constructor
Q constructor
R constructor
J)不能再静态的方法中访问非静态的成员变量;可以在静态方法中访问静态的成员变量。可以在非静态的方法中访问静态的成员变量。
K)不能再静态的方法中使用this关键字
总结:静态的只能访问静态的;非静态的可以访问一切。
L)一个类不能既是final,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,必然需要被继承。而final修饰后不能不继承,这样是不允许的。
学习之所以会想睡觉,是因为那是梦开始的地方。