Java基础知识——继承
4.1继承
4.1.1什么是继承?
- 继承在本职上是特殊一般的关系,即常说的is-a关系,意思就是子承父业。描述类和类之间的关系的。编写类的时候,我们发现类和类之间是可以存在父子关系的。通过extends来描述这种继承关系,子类extends父类就是子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的 一些属性或方法。
4.1.2继承的语法格式
Java继承的关键字是:extends
-
Java继承的语法格式
public class 子类名 extends 父类名{ }
代码演示:
//父类、超类、基类
public class Animal{
String type;
String color;
public Animal(){
}
public void eat(){
System.out.println("吃东西");
}
}
//子类
public class Dog extends Animal{//Dog继承了Animals
String name;
public Dog(){
}
public void shout(){
System.out.println(this.type+","+this.color+","+this.name+"汪汪汪。。。。。");//调用了子类继承父类中的属性
}
}
public class Test01{
public static void main(String[] args){
//创建dog对象
Dog d=new Dog();
d.name="旺财";
d.type="土狗";
d.color="土豪金";
d.shout();
d.eat();//调用了子类继承父类中的方法
}
}
继承代码分析:虽然对于Dog类而言,不存在name、type属性以及eat方法,但是Dog的父类Animal类是存在的,也就意味着Dog继承了Animal中声明的属性以及方法。结论:在java中一旦发生继承关系之后,子类就会拥有父类中的属性以及方法,子类无需自己再去声明,达到了代码复用性的要求,简化了代码。
继承注意事项(1):
- 在继承关系中,子类拥有父类中的成员,子类不能拥有父类中的被private修饰后的成员
- java多层继承,在多层继承中最下层的子类拥有整个继承体系的成员,最上层的父类里面定义所有子类的共性描述
- 在java中只支持单继承。导致复用性虽然有,但是不是特别高。针对这个问题,Java采用的策略称之为单继承、多实现。
问题1:假设在后期的业务中,存在了A->B,但是后期在扩展业务时发现:A->C可能是更好的一种方案,该如何解决?
- j解决方法:一般情况下的解决方案是通过B去->C,以此让C成为A的间接父类,达到代码复用的目的。千万不能之间终止A和B的继承关系,因为后期中一旦切断A和B的联系可能导致代码很多地方存在不安全的隐患。
继承注意事项(2)
- 如果继承关系链很长的情况下又会导致后期的业务拓展变得很麻烦,调用关系变得很复杂。在正常的生成环境中,一般我们都会要求继承链的长度可能不会超过3层。
tips:在java中一个类只有一次继承机会,如果不能完全确定最好不要用。
上述代码内存分析图
- 创建子类对象时,父类的空构造器被调用。子类要创建对象一定会先创建父类对象。(这是因为子类构造器方法中有默认super()方法(图形中蓝色部分),后面内容会提)
- 在内存中,要new子类时,会先在内存中给父类开辟一个存储空间。存储父类的内容。
- 子类调用父类中定义的属性时,子类对象中维护了和父类存储空间的关系(紫色),给父类定义的属性赋值时,能够找到对应的父类对象。