Java的三大特征:封装、继承、多态
继承
继承的概念
就像我们实际生活中的继承,孩子继承了爸爸的才华,继承了妈妈的样貌。我们Java中也同样有继承的关系,子类继承父类的一些成员变量和方法。
多个类中存在相同属性和行为,那么会显得代码的冗余。这时我们可以将这些相同的部分进行抽取,放到一个单独的类中。那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成某种关系。
这些被抽取的多个类可以称为子类,也叫派生类;多个类抽取出来的这个类称为父类、超类(superclass)或者基类。
继承描述的是事物之间的所属关系,这种关系是:is-a
的关系。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。
继承的优点
- 提高代码的复用性。
- 提高代码的扩展性。
- 类与类之间产生了关系,多态的前提。
注意:同时也增加了一些弊端,那就是累与泪之间的耦合度增高了。
继承的格式
可以通过关键字extends
继承一个父类(超类、基类)。
class 父类{
}
class 子类 extends 父类{
}
例如:
class Pet{
String petType;
}
class Dog extends Pet{
String name;
public void eat(){
System.out.println(petType+":"+name+"在吃东西");
}
}
public class Test{
public static void main(String[] args) {
// 创建一个狗类对象
Dog dog = new Dog ();
//为狗类对象的petType属性赋值
dog.petType = "狗";
// 为该狗类对象的name属性进行赋值
dog .name = "Tom";
// 调用该狗的eat()方法
dog.eat();
}
}
结果:
狗:Tom在吃东西
继承的特点
1、子类会继承父类所有的成员变量和方法
从类的定义来看,类是一类具有相同特性的事物的抽象描述。父类是所有子类共同特征的抽象描述。而实例变量和实例方法就是事物的特征,那么父类中声明的实例变量和实例方法代表子类事物也有这个特征。
- 当子类对象被创建时,在堆中给对象申请内存时,就要看子类和父类都声明了什么实例变量,这些实例变量都要分配内存。
- 当子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,会看它的父类甚至父类的父类是否声明了这个方法,遵循从下往上找的顺序,找到了就停止,一直到根父类都没有找到,就会报编译错误。
所以继承意味着子类的对象除了看子类的类模板还要看父类的类模板。
2、子类无法直接使用父类的私有成员
子类会继承父类私有(private)的成员变量,但子类不能对继承的私有成员变量直接进行访问(也可以理解为私有的属性没有被继承,官方文档中的说法),可通过继承的公共的get/set方法进行访问。如图所示:
父类代码:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
子类代码:
public class Student extends Person {
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public String getInfo(){
//在子类中不能直接使用父类私有的name
return "姓名:" + getName() + ",分数:" + getScore();
}
}
测试类代码:
public class TestStudent {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setScore(89);
System.out.println(student.getInfo());
}
}
3、Java只支持单继承,但可以被多个类继承
单继承
public class A{
}
class B extends A{
}
//一个类只能有一个父类,不可以有多个直接父类。
class C extends B{
} //ok
class C extends A,B{
} //error
被多个子类继承
class A{
}
class B extends A{
}
class D extends A{
}
...
4、Java支持多层继承
类似于传递性
class A{
}
class B extends A{