面向对象的三大特征:封装,继承,多态。
继承是Java中一般到特殊的关系, 是一种子类到父类的关系。
例如:
学生类继承了人类。
猫类继承了动物类。
被继承的类称为:父类/超类。
继承父类的类称为:子类。
继承(extends)
继承的作用?
“可以提高代码的复用”,相同代码可以定义在父类中。
然后子类直接继承父类,就可以直接使用父类的这些代码了。
(相同代码重复利用)
子类更强大:子类不仅得到了父类的功能,它还有自己的功能。
继承的格式
public class 子类 extends 父类{}
父类:也被称为超类、基类;
子类:也被称为派生类;
继承的特点
- 子类可以有自己特定的内容;
- 子类可以有父类的内容;
继承的好处
提高了代码的复用性(多个类相同的成员可以放到同一个类中);
提高了代码的维护性(如果方法的代码需要修改,修改一处即可);
继承的弊端
继承让类与类之间产生了关系,类的耦合性增强,父类变化时,子类不得不变化,削弱了子类的独立性。
什么时候用继承?
继承提现关系:is a
假设法:如果有A和B类,满足A是B的一种或者B是A的一种,说明他们存在继承关系,这个时候可以考虑继承提现,否则不能滥用继承。
举例:苹果和水果。猫和动物。
继承中变量访问特点
在子类方法中访问一个变量
- 子类局部范围找
- 子类成员范围找
- 父类成员范围找
- 如果都没有就报错
public class Son extends Father{
public int height = 170;
public void show() {
System.out.println(age);
System.out.println(height);
System.out.println("调用子类");
}
}
public class Father {
public int age = 40;
public void fatherShow() {
System.out.println("调用父类");
}
}
public class Test {
public static void main(String[] args) {
Father f = new Father();
f.fatherShow();
Son s = new Son();
s.show();
s.fatherShow();
}
}
继承中构造方法的访问特点
子类中所有构造方法默认都会访问父类中无参的构造方法:
- 子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
- 每一个子类构造方法的第一条语句默认都是:super()
父类中没有无参构造方法,只有带参构造方法:
- 子类可指定super关键字使用父类带参构造方法:super(参数)
public class Father {
public Father() {
System.out.println("父类无参构造方法被调用");
}
public Father(int age) {
System.out.println("父类有参构造方法被调用");
}
}
public class Son extends Father {
public Son() {
System.out.println("子类无参构造方法被调用");
}
public Son(int age) {
// 指定调用父类有参构造方法:
// super(10);
System.out.println("子类有参构造方法被调用");
}
}
public class Test {
public static void main(String[] args) {
Son s = new Son();
// 显示:
// 父类无参构造方法被调用
// 子类无参构造方法被调用
Son s1 = new Son(30);
// 显示
// 父类无参构造方法被调用
// 子类有参构造方法被调用
}
}
继承中成员方法的访问特点
通过子类访问一个方法:
- 子类成员范围找
- 父类成员范围找
- 都没有就报错