关于继承的细节和内存分析


前言

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

一、继承的意义

主要实现重用代码,节省开发时间。

二、继承的使用细节

1.私有和公有

    子类继承了所有的属性和方法,但是私有属性不能在子类直接访问,要通过公共的方法去访问,例如:
public class Test {
          
   

    public static void main(String[] args) {
          
   //创建main方法
        Students students = new Students();
        Students.setAge(10);
        System.out.println(students.getAge());


    }
}
public class Person {
          
   
    private int age;//私有年龄属性
    public int getAge() {
          
   //封装的步骤
        return age;
    }


    public void setAge(int age){
          
   
        this.age = age;
    }

}
public class Students extends Person {
          
   //继承

}

要调用这个age无法直接使用,可以使用public 下的setAge方法,同理也可用于构造器如下

public class Person{
          
   //改为构造器和上图类似
	private int age;
	public Person(int age){
          
   
		this.age = age;
}

2.除了属性以外,私有方法也必须通过公共的方法去访问,例如:

public class Person{
          
   
	private void text(){
          
   
	  	System.out.print("text");
	}
	public void calltext(){
          
   //创建一个公共的方法去调用私有方法
		text();
	}
}

2.子类必须调用父类构造器

    子类必须调用父类构造器完成父类初始化 当创建子类时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中使用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过。
public class Person {
          
   
	private int age;
	public Person(int age){
          
   
		this.age = age;
}
public class Students extends Person {
          
   //继承
	public Person(){
          
   
		super(10);//这个是必须的不然会报错
	}
}

如果没有这个super会报错expected 1 arguments but found 0表示需要一个参数但没有参数传入

    super在使用时需要放在构造器的第一行要和this()区分开来 有this()的构造器不会再出现super()

3.java的所有类都是Object的子类

    在IDEA中对类按ctrl + h会显示继承层级,可以看到最高层是object 父类构造器的调用不限于直接父类,将一直往上追溯到Object类(顶级父类)

4.继承使用

    子类最多只能继承一个父类,即java中为单继承机制,如果要让a继承b和c类。就a继承b,b继承c 不能滥用继承,子类和父类之间必须满足is-a的逻辑关系

三、继承的内存分析

总结

这是关于继承细节的分析特别是后面的内存图尤为重要,面试大多出于这种,希望这篇博客能帮到你。

经验分享 程序员 微信小程序 职场和发展