继承中的关键字
1. 继承的基本含义:
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。子类最基本的功能就是维持父类的基本操作,但是子类可以对其功能的扩充。
2. extends
- 格式:class A extends B {
} - 表示A类是B类的一个子类,B类是A类的唯一父类。
- 在Java当中的继承是单继承,不允许多继承(class A extends B,C),单继承就是子类只有一个唯一的父类,但是可以多重继承(class A extends B ,class B extends C)。
- 子类会显式继承父类当中所有的非私有化的成员变量和成员方法,所有的私有化成员可以通过Setter和Getter方法来操作,且构造方法不会被继承。
- 子类在继承父类成员的同时,可以进行扩展,定义属于自己的成员变量和成员方法,对其功能进行扩充。
3.super
- 功能1:调用父类的成员变量和方法。
子类继承父类中的成员变量和方法,当子类声明了与父类相同的成员变量以及对父类当中的成员方法进行重写之后,使用子类实例调用的成员变量与方法就是子类当中的成员变量和方法,而这时想要调用父类当中已经被重写被覆盖的成员就需要用到super关键字,在子类当中使用super关键字在调用成员变量和方法时会直接跳过子类,前往父类找到相应的成员变量和方法进行使用。 - 功能2:用于在子类构造中显式的调用父类构造,必须位于子类构造的首行。
从内存角度分析,子类继承了父类的非私有化成员,那么在实例化一个子类对象时,因为先有父类再有子类,所以必须先调用父类构造为继承而来的父类的非私有化成员分配内存空间以及初始化,其次才是调用子类自己的构造为子类成员分配内存空间和初始化。当子类构造方法中没有显式的使用super关键字调用父类构造时,Java编译器会默认在子类构造的首行使用super()调用父类的无参构造,当然可以显式的使用super关键字在子类构造中调用父类的无参和有参构造方法,综上,因为先要为父类非私有化成员分配空间,加上Java中程序的执行顺序是自上向下执行,所以在子类中使用super关键字调用父类构造需要放在子类构造首行。
4.abstract
- 解决的问题:制定一个标准,在父类的成员方法前使用abstract关键字修饰,要求所有的非抽象类的子类都必须重写父类当中的所有abstract方法。
- 使用abstract关键字修饰的成员方法都是抽象方法,抽象方法没有方法体。
- 抽象方法必须定义在接口或者抽象类当中,这是抽象方法的生存环境。
抽象类
- 使用abstract关键字修饰的成员方法是抽象方法,那么同样的,使用abstract关键字修饰的类就是抽象类,两者的关系是:具有抽象方法的类一定是抽象类,但是抽象类中不一定有抽象方法,抽象类只是为了给抽象方法提供一个生存环境而存在。
- 抽象类没有自己的实例化对象:抽象类当中可能具有没有方法体的抽象方法,而当一个类实例化一个自己类的对象时,那么这个类对象一定可以使用类当中的成员,但是抽象类当中可能有抽象方法,抽象方法没有方法体,属于未完成的方法,不能直接使用,所以抽象类不能够实例化自己的类对象。
- 抽象类必须有子类来实现它才能够使用:因为抽象类当中可能有未完成的抽象方法,所以需要子类来完成它,任何一个非抽象类的子类都必须重写父类当中的所有的abstract方法。
- 抽象类除了比普通类多了抽象方法之外,与普通方法并没有什么差别,即抽象类当中也可以存在成员变量和普通的成员方法。
5.final : 终结器
- final修饰类:final修饰的类与abstract修饰的类完全相反,abstract修饰的类必须得有子类,而final修饰的类绝对不可以被子类继承,所以final与abstract在修饰类的时候不能同时存在。
- final修饰成员变量:使用final关键字修饰的成员变量就成为了一个常量,常量定义时必须初始化且一旦初始化之后不可以再次修改,按照规范常量初始化时,常量名必须全部为大写的英文字母,例如DEFAULT_OF_SIZE。
- final修饰成员方法:使用final关键字修饰的成员方法为一个最终方法,即不能被重写,可用于一些安全性的定义。
- final修饰局部变量:使用final关键字修饰的局部变量也会成为一个常量,但是不同的是该常量在定义时可以不被初始化,但是一旦被初始化也将不能被再次修改。
6.static
- static修饰成员变量:
- static关键字修饰成员变量称为类变量,由内存分析可知,类变量存放在公共数据区,全员共享,和对象无关,一处修改处处生效修改。
- 类变量使用可以通过静态方式(类名.类变量)来使用,不推荐使用对象来调用类变量。
- 类变量和对象无关:
A. 从内存角度 – 静态成员变量(类变量)储存在公共数据区,而对象空间在堆区,储存空间不同。
B. 从加载、创建方式角度 – 静态成员变量是随着.class字节码文件的加载过程中直接定义在公共数据区内的,而对象是在代码运行过程中才有可能被创建。
C. 从生命周期角度 – 静态成员变量的生命周期是从程序开始,到程序结束后才会被销毁,而类对象的生命周期是从被创建开始,从被GC机制回收而结束,而且类对象会在程序结束之前就会被销毁掉。
- static修饰成员方法:
- 被static关键字修饰的成员方法为称为类方法,不推荐使用对象调用,可以通过静态方式(类名.方法())来使用。
- 类方法时随着.class字节码文件的加载过程中直接被定义在方法区的 。
- 在静态方法中可以使用其他的静态成员变量/静态成员方法。
- 在静态方法中不允许使用非静态成员变量/非静态成员方法,因为非静态成员变量和非静态的成员方法需要通过对象来调用,然而静态方法可以通过类名直接调用,而且此时没有对象,所以不允许使用非静态成员。this关键字也不允许使用,this代表当前对象。
- 代码块:
- 局部代码块:在方法体中使用,提高效率,解决内存,让JVM回收内存效率提升。
- 构造代码块:每次只要调用构造方法的时候,构造代码块就会执行,且早于构造方法的执行。
- 静态代码块:使用static关键字修饰的代码块,用于初始化程序,只要类文件加载,其中内容就会全部执行,且早于构造代码块,只在文件初次加载时执行一次,之后同一个程序内再加载文件不再执行。
来源:CSDN
作者:℡ㄨ瞎扯蛋ふ
链接:https://blog.csdn.net/cccccv_/article/details/104569076