继承的介绍
它是指我们子类去继承父类的属性和方法。有时候我们两个类中部分属性和方法是相同的,为了提高代码复用率,于是继承出现了。
继承的作用
继承可以解决代码复用,当两个子类中出现相同的属性和方法时,我们可以抽象出一个父类,在父类中定义属性和方法,所以的子类不需要在重新定义,只需要extends声明继承父类即可。
声明方式如下:
class 类名 extends 父类{
}
在上图中,A类作为B类和C类的父类,D类的父类是B类,E类的父类是C类。
那么,有一个问题出现了。就是子类在继承父类时如果该属性或方法访问修饰符是私有的private,那么我们子类还能访问到该属性或方法吗?根据之前包的访问范围来看private修饰符只能在本类内访问,而我们在子类中直接访问是不行的,注意是直接访问,那我们间接访问行不行呢?答案是肯定的,我们可以通过在父类中创建公共的方法去访问私有的属性和方法。
看一段代码
public class Base {//父类中有四个属性,这四个属性的访问控制符都不同
public int a1;
protected int a2;
int a3;
private int a4=10;//这是我们私有的属性
public int getA4() {//公共的方法去返回a4,我们子类调用这个公共的get方法即可
return a4;
}
public void test(){//为了调用私有的方法,我们调用该test方法即可
teat1();
}
private void teat1(){//私有的方法test1
System.out.println("私有的方法被调用");
}
运行结果
当我们在调用子类的构造器时,总是会先调用父类的构造器,默认情况下先调用父类的无参构造器,如果没有默认构造器则必须要用super()去指定使用那个构造器。
子类只能继承一个父类(直接继承),即JAVA是单继承机制。那么如果我有一个类a,需要继承一个类b的成员和一个类c的成员,我该怎么做呢?
答案是 让a继承b类,b类继承c就行了。
我们在描写类的继承关系之时,要满足正常的逻辑关系,如猫类是动物类的子类,那么我说music类是动物类的子类,这从JAVA语法上是可以通过的,但是music和动物类没有一点关联,谈何继承成员呢。
最后来看继承在内存里的变化
上图,son类继承Father类,Father类继承Grandpa类
当我们子类创建对象时,我们类要加载类信息,我们类要查找父类的信息,然后再看父类上面还有没有父类,直到加载到object类停止。
我们在分配内存信息时,先给最上面的object类分配属性和方法的内存空间,下来是父类,最后是子类
我们在创建对象时,在方法区先出现类和类的继承关系,然后在从父类到子类依次分配内存空间
当我们在用子类对象去访问一个属性例如name,但是这个name父类也有,我们访问的是哪一个呢。
查找关系在子类父类中的运用:
通过查找关系来返回信息
(1)先看子类是否有该属性,并且该属性可以访问
(2)如果子类没有该属性,则向上查找父类是否有(如果父类有,并且可以访问,则返回)
(3)如果父类没有,就按照(3)的规则,向上找上级父类,直到object。