面向对象特征之二:继承(Inheritance)
面向对象的三个特征:封装性、继承性、多态性。
多态性
Java中的继承
自下而上的继承
定义了一个类A,在定义另一个类B时,发现B的功能与类A相似,考虑B继承于类A
//为描述和处理个人信息,定义类Person class Person{ public String name; //姓名 public int age; //年龄 public Date birthDate; //生日 }
//为描述和处理学生信息,定义类Student class Student{ public String name; public int age; public Date birthDate; public String school; //学校 }
通过继承,简化Student类的定义
class Person{ public String name; //姓名 public int age; //年龄 public Date birthDate; //生日 } class Student extends Person{ public String school; //学校 } //Student类继承了父类Person的所有属性和方法,并增加了一个属性school。Person中的属性和方法,Student都可以使用。
自下而上的继承
为处理描述
猫
这一类,定义Cat
类class Cat{ public String name; public int age; public void eat(){ } public void catchMouse(){ } }
为处理描述
狗
这一类,定义Dog
类class Dog{ public String name; public int age; public void eat(){ } public void lookHome(){ } }
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成
继承关系
。*class Animals{ public String name; public int age; public void eat(){ } } class Cat extends Animals{ public void catchMouse(){ } } class Dog extends Animals{ public void lookHome(){ } }
继承的好处
-
继承的出现减少了代码冗余,提高了代码的复用性。
-
继承的出现,更有利于功能的扩展。
-
继承的出现让类与类之间产生了
is-a
的关系,为多态的使用提供了前提。- 继承描述事物之间的所属关系,这种关系是:
is-a
的关系。可见,父类更通用、更一般,子类更具体。
- 继承描述事物之间的所属关系,这种关系是:
注意:不要仅为了获取其他类中某个功能而去继承!
继承的语法
继承的语法格式
class A{
//属性、方法
}
class B extends A{
}
继承的基本概念
-
类B,称为子类、派生类(derived class)、Sub Class
-
类A,称为父类、超类、基类(base class)、Super Class
代码举例
public class Person{
String name;
int age;
public void eat(){
System.out.println("eat");
}
public void sleep(){
System.out.println("sleep");
}
}
public class Student extends Person{
//Student 继承了 父类中的属性和方法
String school; //学校
}
继承性的细节说明
- 子类会继承父类所有的实例变量和实例方法
- 子类不能直接访问父类中私有的(private)的成员变量和方法
class Person{ String name; int age; } class Student extends Person{ String school; } public class ExtendsTest{ Student s1 = new Student(); s1.name = "张三"; s1.age = 3; s1.school = "西安工程大学"; } //编译通过 //School类是Person类的子类
由于封装性的影响,子类不能直接调用父类中声明的
private
的属性或方法class Person{ private String name; int age; } class Student extends Person{ String school; } public class ExtendsTest{ Student s1 = new Student(); s1.age = 3; s1.school = "西安工程大学"; s1.name = "张三"; //编译不通过 //java: name 在 test.Person 中是 private 访问控制 }
但是可以通过构造
set``get
的方法,对private
属性进行调用class Person{ private String name; public void setName(String name){ this.name = name; } public String getName(){ return name; } } class Student extends Person{ } public class ExtendsTest{ public static void main(String []args){ Student s1 = new Student(); s1.setName("张三"); System.out.println(s1.getName); } } //此时,通过构造setName、getName方法,对private化成员属性进行调用
- 子类在继承父类之后,还可以扩展自己特有的功能
- 在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”(extends :延伸、扩展、延展)
- 一个父类可以同时拥有多个子类
class A{ } class B extends A{ } class C extends A{ } class D extends A{ }
-
Java只支持单继承,不支持多重继承
class A{ } class B{ } class C extends A{ } class C extends B{ } //错误的继承 //一个子类只能有一个父类
-
Java支持多层继承(继承体系)
class A{ } class B extends A{ } class C extends B{ } //一个类,可以是其他类的子类,同时也可以是其他类父类