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修饰后不能不继承,这样是不允许的。









posted @ 2014-10-27 12:38  白Rime  阅读(1016)  评论(0编辑  收藏  举报