Java修饰符static,final,abstract

转载自:http://shahdza.blog.51cto.com/2410787/1355107 原帖博主没注明是否能转载,如不允许的话,请原博主联系我删除,谢谢!蓝色字体是我自己添加的。


一、static


什么是static修饰符?

   修饰属性,

   修饰方法,

   修饰初始化代码块,

   修饰内部类;


静态属性:

   (1) static修饰的属性为静态属性

   (2) 全类共有的属性,是该类所有对象共有的。所以也叫类变量

   (3) 静态属性(类变量)不是实例对象中的数据,它与类相关,可以直接使用类名访问

   (4) 在类加载时就申请空间并初始化,而且静态属性是存储在jvm的静态池里

   (5) 可在任意的方法中使用,可称为全局变量


静态方法:

   (1) static修饰的方法为静态方法

   (2) 可以用类名直接调用,无需使用对象来访问,而非static的方法只能使用对象调用

   (3) 只能直接访问类的静态成员,不能直接访问非静态成员

   (4) static方法中不允许出现this,super关键字

   (5) static方法子类可以继承,而且子类可以覆盖静态方法,

       但只能用子类的静态方法去覆盖,不能用子类的非静态方法去覆盖,

       静态方法覆盖后不能实现多态

   (6) 只会在类加载时创建一次,不会反复创建


修饰符写法:

1
2
public  static  int  age;
private  static  int  method() { … }



二、final


什么是final修饰符?

   类似于c++中的const,代表不可改变,所有被final修饰的则都不可改变。

   修饰属性;

   修饰方法;

   修饰类;

   修饰局部变量;


final修饰属性:

   (1) 必须且只能赋一次值才能使用,赋了值后则不能改变

   (2) 可以在声明时就赋值,也可以在构造方法中赋值

   (3) 不一定是常量,final只是不可二次赋值,但不一定是常量

   (4) final修饰的对象引用,只能固定地指向某个对象,但对象中的内容可变

   (5) 常量要使用static final同时修饰。如:static final int a=10;


static final属性:

   (1) 在定义属性时初始化,如 static final int a=10;

   (2) 在构造方法中不能给static final属性赋值初始化。

   (3) final修饰的变量会浪费空间,在实际开发中使用很少。一般都用static final修饰

   (4) 修饰符写法:

1
public  static  final  int  age =  10 ;


final修饰方法:

   (1) 可以被子类继承,但不能覆盖

   (2) 非final方法的覆盖会受到修饰符的影响,子类的修饰符要比父类的才能覆盖。


final修饰类:

   (1) final修饰的类叫不变类不能被继承,它没有子类

   (2) 一个final类中的所有方法都是final的方法

   (3) String类就是一个典型的final类。

举例说明不变类:

1
2
3
4
5
final  class  C {
     private  final  int  a;
     private  final  int  b;
     public  C( int  a, int  b) {  this .a=a;  this .b=b; }
}



三、abstract


什么是abstract修饰符?

   abstract是修饰符,代表抽象

   修饰类;

   修饰方法;


abstract修饰类:

   (1) 抽象类是用来被继承,子类去实现的。

   (2) abstract与多态密不可分的。

   (3) 抽象类不能创建对象,但可以声明一个引用。(抽象类可以声明对象,不能用new,该对象可以是子类对象的上转型对象,该对象可以调用子 类重写的方法。)

   (4) 抽象类可以调用静态方法,不能调用非静态方法

   (5) 一个类中有抽象方法,则这个类必须是抽象类。但抽象类中不一定要有抽象方法。    

   (6) 一个抽象类可以被子类继承,子类也可以是抽象类。

   (7) 子类Sub并不是一个抽象类,可以创建对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public  abstract  class  Shapes {  //抽象类
     public  int  x, y;
     public  int  width, height;
     public  Shapes( int  x,  int  y,  int  width,  int  height) {
        this .x = x;  this .y = y;
        this .width = width;  this .height = height;
     }
     abstract  double  getArea();  //抽象方法
     abstract  double  getPerimeter();  //抽象方法
}
        
public  class  Circle  extends  Shapes {  //子类
     public  double  r;
     public  Circle( int  x,  int  y,  int  width,  int  heigh) {
        super (x, y, width, heigh);
        r = ( double ) width /  2.0 ;
     }
     public  double  getArea() {  //实现父类的抽象方法
        return  (r * r * Math.PI);
     }
     public  double  getPerimeter() {  //实现父类的抽象方法
        return  ( 2  * Math.PI * r);
     }
}


abstract修饰方法:

   (1) 抽象方法只有声明,没有实现,用 ";" 结束。

1
abstract  void  method();

   (2) 非abstract子类继承有abstract方法的父类,则一定要实现继承下来的abstract方法

   (3) abstract子类继承有abstract方法的父类,则可以不实现继承下来的abstract方法


abstract类与abstract方法的应用:

   (1) 主要用来抽象出一些子类的共性,在抽象类中只声明方法,表示出方法能做什么。

   (2) 但因不同子类可能方法的实现不一样,所以方法实现就是个性



四、三个修饰符的共同特性和使用


共同特点:

   (1) 三个修饰符都可以修饰方法

   (2) 三个修饰符都不能修饰构造方法


三个修饰符组合使用规范:

   (1) static不能与abstract合用

       abstract方法是为了子类覆盖该方法而实现多态。

       但static方法是找引用类型的方法,没有多态。

   (2) final不能与abstract合用

       abstract修饰的类,方法是能继承的,能覆盖的。

       但final修饰的类是不能被继承的,final修饰的方法不能被覆盖。

   (3) private不能与abstract合用

       private方法是不能被继承的,当然就不能覆盖。

       而abstract是要求子类继承并覆盖。

你可能感兴趣的:(Java修饰符static,final,abstract)