概念
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承是面向对象三大特征之一。
通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
例如,兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
继承格式
class 父类 {
}
class 子类 extends 父类 {
}
例如:
package base8_class_extends.demo01;
public class MyClass01 {
public void run() {
System.out.println("跑步");
}
}
package base8_class_extends.demo01;
public class MyClass02 extends MyClass01{
}
package base8_class_extends.demo01;
public class Test {
public static void main(String[] args) {
MyClass01 myClass01 = new MyClass01();
MyClass02 myClass02 = new MyClass02();
myClass01.run();
myClass02.run();
}
}
即使MyClass02类没有写run方法,通过继承MyClass01也可以使用。这样就达到了代码复用的效果。
继承类型
Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点。(后面讲解接口)
成员变量方法访问
通过子对象访问成员变量和方法:先在子对象中找,没有则向上找。
通过成员方法间接使用成员变量:该方法属于谁,就优先使用谁,没有则向上找。
继承中的构造方法
1.子类构造方法有一个隐含的"super()"调用,所以一定会先调用父类构造方法,再调用子类的。如果子类写了super则使用写的,不写则默认调用父类无参构造方法。
2.子类可以在构造方法里通过super关键字,调用父类的重载构造方法(即父类有多个构造方法)
3.子类通过super调用父类构造方法,必须把super写在子类构造方法的第一句
package base8_class_extends.demo03;
public class Fu {
// 无参构造方法在没写其他构造方法,默认有赠送
// 但是一旦写了其他构造方法,将不再赠送,想使用必须显显式写出来
public Fu() {
System.out.println("父类无参构造方法");
}
public Fu(int i) {
System.out.println("父类有参构造方法");
}
}
package base8_class_extends.demo03;
public class Zi extends Fu{
public Zi() {
super(1);
System.out.println("子类构造方法");
}
}
package base8_class_extends.demo03;
public class InitTest {
public static void main(String[] args) {
Zi zi = new Zi();
}
}
super和this比较
super的使用:
- 在子类成员方法访问父类的成员变量
- 在子类成员方法访问父类成员方法
- 在子类构造方法访问父类构造方法
this的使用:
- 在本类的成员方法中,访问本类的成员变量
- 在本类的成员方法中访问本类的另一个成员方法
- 在本类的构造方法中访问本类的另一个构造方法
继承的特点
1.只能单继承,一个类只能有一个父类
2.父类还可以有父类,父类的父类是间接父类
3.一个子类只有一个直接父类,但是一个父类可以有很多子类