Java面试必知: 继承

super的使用

  • 编译器会在每个构造方法的首行自动加上super()语句,调用父类的无参构造方法
  • 如果子类的构造方法中显式调用父类的构造方法,则super()语句一定要放在子类构造方法的首行
  • 如果调用的是父类的普通方法,则super语句的位置任意
  • super与this()不能同时出现在构造方法中,因为这两个语句都需要放在首行
  • super与this 不能通过对象调用

this和super的区别 重点

相同点1—this和super只有在对象存在的前提下使用,不能在静态方法中使用
相同点2—this和super在调用构造方法时,只能放在首行,调用普通方法时,可以放在任意位置

不同点1—this代表当前对象,super代表当前对象的父类的引用
不同点2—this无需存在继承关系也能使用,super必须存在继承关系才能使用

创建子类对象的过程

  1. 先父后子原则
    按照继承的结构,逐级回溯一直到顶层类Object,先通过super()调用父类的构造方法,再逐级回到子类,调用子类的构造方法,最终完成子类对象的创建
  2. 完整的执行流程
    静态块—>构造块—>构造方法—>普通方法
    注: 创造子类对象时,一定会调用父类的构造函数(默认调用无参构造函数),如果父类没有无参构造函数,则需在子类构造函数第一行 使用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

原因:静态块在初始化的时候执行,当静态变量a来自父类时,对父类进行类加载并初始化.得到后不执行子类,所以只调用了父类的静态块

方法重写

重写的要求 重点

  1. 子类方法的访问权限修饰符要大于或者等于父类方法的访问权限修饰符
  2. 子类方法的返回值类型要小于或者等于父类方法的返回值类型 (引用类型遵循此法则, 基本类型必须相等)
  3. 子类方法抛出的异常类型要小于或者等于父类方法抛出的异常类型

不能被重写的方法

  1. private方法—不能被子类继承,也不能被子类重写
    【原因】private方法只有在本类才能访问

  2. 构造方法—不能被子类继承,也不能被子类重写,但子类可以使用super调用父类的构造方法 【原因】父子类名不同,构造方法名也必然不同

  3. final方法—能被子类继承,但不能被子类重写

  4. 静态方法—不能被子类继承,不能被子类重写,子类只是增加了一个新的静态方法

  5. 父类的静态方法,不能被子类重写为非静态的
    父类的非静态方法,也不能被子类重写为静态的

方法重载和方法重写的区别 重点重点

(1)方法重载(overload)发生在同一个类内部

多个方法具有相同的方法名
参数个数,参数类型,参数的排列顺序不同
与返回类型,参数名,访问修饰符无关

方法重载用于简化类中多个完成相同功能的方法的命名和调用

(2)方法重写(override)发生在父子类之间

父子类的方法名,参数个数,参数类型,参数的排列顺序都必须相同,与参数名无关
子类方法的访问权限修饰符必须大于等于父类
子类方法的返回类型和抛出的异常类型必须小于等于父类

方法重写用于子类改写父类方法的功能,是使用多态的前提条件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值