一、static


什么是static修饰符?

   修饰属性,

   修饰方法,

   修饰初始化代码块,

   修饰内部类;


静态属性:

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

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

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

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

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


静态方法:

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

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

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

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

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

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

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

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


修饰符写法:

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) 修饰符写法:

public static final int age = 10;


final修饰方法:

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

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


final修饰类:

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

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

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

举例说明不变类:

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) 抽象类不能创建对象,但可以声明一个引用。

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

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

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

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

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) 抽象方法只有声明,没有实现,用 ";" 结束。

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是要求子类继承并覆盖。