关于继承的细节和内存分析
前言
继承是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的逻辑关系
三、继承的内存分析
总结
这是关于继承细节的分析特别是后面的内存图尤为重要,面试大多出于这种,希望这篇博客能帮到你。
