Java面试必知: 继承
程序员文章站
2022-06-04 23:16:37
...
super的使用
- 编译器会在每个构造方法的首行自动加上super()语句,调用父类的无参构造方法
- 如果子类的构造方法中显式调用父类的构造方法,则super()语句一定要放在子类构造方法的首行
- 如果调用的是父类的普通方法,则super语句的位置任意
- super与this不能同时出现在构造方法中,因为这两个语句都需要放在首行
this和super的区别 重点
相同点1—this和super只有在对象存在的前提下使用,不能在静态方法中使用
相同点2—this和super在调用构造方法时,只能放在首行,调用普通方法时,可以放在任意位置
不同点1—this代表当前对象,super代表当前对象的父对象
不同点2—this无需存在继承关系也能使用,super必须存在继承关系才能使用
创建子类对象的过程
- 先父后子原则
按照继承的结构,逐级回溯一直到顶层类Object,先通过super()调用父类的构造方法,再逐级回到子类,调用子类的构造方法,最终完成子类对象的创建 - 完整的执行流程
静态块—>构造块—>构造方法—>普通方法
重要代码一
public class Parent {
static{
System.out.println("父类静态块");
}
{
System.out.println("父类构造块");
}
public Parent(){
System.out.println("父类无参构造方法");
}
public Parent(int i){
System.out.println("父类有参构造方法 i=" + i);
}
public void method(){
System.out.println("父类普通方法");
}
}
public class Child extends Parent{
static{
System.out.println("子类静态块");
}
{
System.out.println("子类构造块");
}
public Child(){
System.out.println("子类无参构造方法");
}
public Child(int i){
super(10);
System.out.println("子类有参构造方法 i=" + i);
}
public void method(){
System.out.println("子类普通方法");
super.method();
}
}
public class Test {
public static void main(String[] args) {
Child c = new Child();
Child c1 = new Child(10);
c1.method();
}
}
结果
父类静态块 //静态块只在类加载的时候执行一次
子类静态块
父类构造块
父类无参构造方法
子类构造块
子类无参构造方法
父类构造块
父类有参构造方法 i=10
子类构造块
子类有参构造方法 i=10
子类普通方法
父类普通方法
重要代码二
class Parent {
public static int a = 123;
static {
System.out.println("父类的静态块");
}
}
class Child extends Parent {
//public static int a = 456;
static {
System.out.println("子类的静态块");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(Child.a);
}
}
当子类中不存在 静态变量a时 输出结果:
父类的静态块
123
当子类中存在静态变量a时 输出结果:
父类的静态块
子类的静态块
456
方法重写
重写的要求 重点
- 子类方法的访问权限修饰符要大于或者等于父类方法的访问权限修饰符
- 子类方法的返回值类型要小于或者等于父类方法的返回值类型
- 子类方法抛出的异常类型要小于或者等于父类方法抛出的异常类型
不能被重写的方法
-
private方法—不能被子类继承,也不能被子类重写
【原因】private方法只有在本类才能访问 -
构造方法—不能被子类继承,也不能被子类重写,但子类可以使用super调用父类的构造方法 【原因】父子类名不同,构造方法名也必然不同
-
final方法—能被子类继承,但不能被子类重写
-
静态方法—不能被子类继承,不能被子类重写,子类只是增加了一个新的静态方法
-
父类的静态方法,不能被子类重写为非静态的
父类的非静态方法,也不能被子类重写为静态的
方法重载和方法重写的区别 重点重点
(1)方法重载(overload)发生在同一个类内部
多个方法具有相同的方法名
参数个数,参数类型,参数的排列顺序不同
与返回类型,参数名,访问修饰符无关
方法重载用于简化类中多个完成相同功能的方法的命名和调用
(2)方法重写(override)发生在父子类之间
父子类的方法名,参数个数,参数类型,参数的排列顺序都必须相同,与参数名无关
子类方法的访问权限修饰符必须大于等于父类
子类方法的返回类型和抛出的异常类型必须小于等于父类
方法重写用于子类改写父类方法的功能,是使用多态的前提条件
上一篇: JS中的六种数据类型