继承(子承父业)
- 子类继承父类,那么子类就可以拥有父类中所有公共的(public)属性和方法
- 使用场景
- 当多个子类中描述的属性及行为是相同的或者大部分是相同的,此时就可以考虑使用继承,以简化代码
- 关键字:extends 继承
- 思考:继承可以简化代码,提高代码的利用率,那是不是只要有相同的东西就可以使用继承
-
继承虽然可以简化代码,但是通常用于同一种事物,并且有多个共同的属性或者功能时才会考虑使用继承
- 在java的普通类中是不允许出现多继承的(会出现嗲永不明确的问题),但是可以有继承体系
- 思考:非静态的属性和方法只有在创建对象的时候才会被加载进入内存中,然后才可以通过对象进行调用
- 那么,此时没有创建父类的对象,为什么还能调用其中的方法?
-
只要是非静态属性和方法想要被加载,那么一定会有对象的存在.子类在开辟空间后会在自己的空间中让出一部分用于父类使用
- 思考:所有类中对应空间的开辟都有构造器,那么父类想要在子类空间中开辟空间就需要构造器.父类的构造器在哪?他是怎么执行的?
- 没个类中都有一个默认的无参构造器(类本身没有定义构造器)
- 关键字:super 超类(父类)代指父类对象
- 注意点:只要存在继承体系,调用子类构造器时,构造方法终究会默认去执行super(),super()默认不写.
- 另外,如果要显示的写出来,那么必须在第一行(和this一样)
- 在子类中的方法之需哦一可以互相调用,是因为默认持有了一个this对象,存在继承关系时,子类中再调用父类属性及方法时间都默认持有了super关键字
- this代指对象在本类,super代指对象在父类
public class Cat extends Animal{
private int aa;
public Cat() {
System.out.println("--Cat--");
}
public Cat(int aa) {
this();
this.aa = aa;
}
public void catchMouse() {
System.out.println("猫抓老鼠");
}
}
public class ExtendDemo {
public static void main(String[] args) {
Cat cat = new Cat();
cat.catchMouse();
cat.eat();
cat.sleep();
Bird bird = new Bird();
bird.fly();
}
}