转载:https://www.cnblogs.com/gbxblog/p/13887382.html
final可以修饰:类、变量、方法
当final修饰类的时候,说明该类不能被继承。
当final修饰方法的时候,说明该方法不能被重写。
当final修饰成员变量时,有两种情况:
如果修饰的是基本类型,说明这个变量的所代表数值永不能变(不能重新赋值)。
如果修饰的是引用类型,该变量的引用不能变(即地址值不能改变),但引用所代表的对象内容是可变的(即该地址指向的对象中内容可变)。
当成员被静态修饰后,除了可以被对象调用外,还可以直接被类名调用:类名.静态成员。
静态成员随着类的加载而加载。
静态成员优先于对象存在。
静态成员被所有对象所共享。
静态方法只能访问静态成员, 非静态方法既可以访问静态又可以访问非静态。
静态方法中不可以定义this,super关键字(因为this代表是对象,而静态存在时,有可能没有对象,况且静态优先于对象存在,所以静态方法运行时,this是没有任何对象代表的。简单说,先进内存的数据不可以访问后进内存的数据,可是后进内存数据可以访问先进内存的数据)。
静态变量也称为类变量,也就是直接可以被类名调用的变量,这个变量是所属于类的;
非静态变量称为成员变量,或者实例变量,是被对象调用的,是所属具体对象的。
静态变量随着类的加载而加载,也意味着随着类的消失而消失,生命周期最长;
实例变量,随着对象的创建而加载,随着对象的消失而消失,按照对象的生命周期而存在。
静态变量存储在方法区的静态区中;
实例变量存在于对象所属的堆内存中。
静态变量数据,被所有对象所共享;
实例变量是对象中的特有数据。
abstract一般用来修饰类和方法
abstract修饰类
abstract修饰类,会使得类变成抽象类,抽象类不能生成实例,但是可以作为对象变量声明的类型,也就是编译时类型。
注意事项:
抽象类虽然不能实例化,但是有自己的构造方法。
抽象类和接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类可以有实例方法,并实现业务逻辑。
抽象类不能被final修饰,因为被final修饰的类无法被继承,而抽象类需要通过继承去实现抽象方法(需要子类继承并覆盖其中的方法)。
abstract修饰方法
abstract修饰方法会使得这个方法变成抽象方法,也就是只有声明,而没有实现,需要子类重写。
注意事项:
有抽象方法类一定是抽象类,但是抽象类不一定有抽象方法。
父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有抽象方法都实现了,子类才有创建对象实例的能力,否则子类也必须是抽象类。
抽象类中可以有构造方法,子类在构造子类对象时需要调用父类(抽象类)的构造方法。
抽象方法不能用private修饰,因为抽象方法必须被子类重写,而private权限对于子类来说是不能访问的,所以会产生矛盾。
抽象方法也不能用static修饰,如果用static修饰,就可以直接通过类名调用,而抽象方法压根没有主体,这么做毫无意义。
接口是抽象方法与全局常量的集合。子类实现接口时,用关键字implements实现。
注意事项:
接口中所有方法都必须是抽象的,默认修饰符:public abstract
接口中的成员变量默认修饰符:public static final
子类可以实现多个接口,同时要覆写接口父类中的所有抽象方法。
接口可继承接口(可多继承)。
接口无法直接实例化对象,只能通过子类实现。
接口可向上转型成它的任意接口类型。
接口中没有构造方法,因为接口中所有方法都是抽象方法。
接口中只允许public权限(属性、方法),可直接省略不写。
接口不可实例化但可作为类型引用。
抽象类中可以有普通成员变量,接口中没有普通成员变量。
抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以是任意的,但是接口中定义的变量只能是public static final类型,且默认为public static final类型。
抽象类可以有构造方法,接口中不能有构造方法。
抽象类中抽象方法的访问类型可以是public、protected,但是接口中的抽象方法只能是public类型的,并且默认为public abstract类型的。
一个类可以实现多个接口,但是只能继承一个抽象类。