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