abstract
1、abstract修饰方法
abstract修饰方法,使这个方法变成抽象方法,即只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现。
abstract void xxx();
2、abstract修饰类
abstract修饰类,使这个类成为一个抽象类,类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。
这时子类才有创建实例的能力,如果子类没有实现父类的抽象方法那么子类也要为抽象类 。
有抽象方法的类一定是抽象类。但是抽象类中不一定都是抽象方法,也可以全是具体方法。
抽象类中可以有构造方法,是子类在构造子类对象时需要调用的父类(抽象类)的构造方法
abstract不可与private、static、final、native、synchronized放在一起使用。
ps:抽象类和接口的区别:
抽象类可以有构造方法,接口中不能有构造方法。
抽象类可以有普通成员变量,接口中没有。
抽象类中包含非抽象的方法,接口中的所有方法必须是抽象的。
抽象类的抽象方法访问的类型可以是public,protected和默认类型(最好不要),接口接口方法只能是public类型的,,并且默认为public abstract类型。
一个类只能继承一个抽象类,但可以实现多个接口。
final
1、final修饰变量
变量被final修饰,就会变成常量(常量应大写),一旦赋值不能改变(可以在初始化时直接赋值,也可以在构造方法里也可以赋值,只能在这两种方法里二选一,必须为常量赋值);
对于一个基本类型的变量,一旦在初始化了之后就不能再改变。如果是引用类型的变量,在初始化之后便不能改变其引用,但是它指向的对象的内容是可变的;
final的常量不会有默认初始值,对于直接在初始化是赋值时final修饰符常和static修饰符一起使用。
2、final修饰方法
被final修饰的方法将不能被其子类覆盖(该方法在子类中将无法重写,只能继承),final不能用来修饰构造器;
3、final修饰类
这个类不会被继承,final类中的所有成员方法都会被隐式地指定为final方法;
static
1、static修饰属性
static修饰的属性是类级别的,类变量,为该类全体实例对象所公有。使用类名.属性来访问:Math.PI;
ps:
类中的实例变量是在创建对象时被初始化的,被static修饰的属性(类变量),是在类加载时被创建并进行初始化;
类加载的过程是进行一次。也就是类变量只会被创建一次。
2、static修饰方法
static修饰的方法是类级别的,静态方法,为该类所公有。使用类名.方法来访问(无需创建类的实例对象);
ps:
static修饰的方法,不能访问本类中的非静态成员(包括方法和属性),本类的非静态方法可以访问本类的静态成员;静态方法中不能出现this关键字;
父类中的静态方法子类不能覆盖为非静态的方法,在符合覆盖的条件下父类的静态方法可以被子类所覆盖但是没有多态;
父子类中,静态方法只能被静态方法覆盖,父子类中,非静态方法只能被非静态方法覆盖。
例:java中的main方法必须写成static的,因为在类加载时无法创建对象,静态方法可以不通过对象调用所以在类的main方法所在在类加载时就可以通过main方法入口来运行程序。
3、static修饰代码块
这个代码只有类加载时被执行一次。可以使用静态代码块初始一个类。
static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。