第8章 继承
目录
前言
8.1 继承概述
1.什么是继承?
class Student {
String name;
int age;
void study() {
System.out.println("study...");
}
}
class Worker {
String name;
int age;
void work(){
System.out.println("work...");
}
}
在上面代码中可以看出,在Student和Worker两个类里面name和age是重复的部分,所以说多个事物之间有共同属性或行为,这种代码的复用性比较差,怎么办?,
(1)在之前有循环重复,代码之间有逻辑关系,并且代码之间是重复的,我们用循环来解决重复的问题;
(2)在写函数时也运用了重复,因为某个函数代码有独立的功能,使用次数也很多,需要使用时调用此函数就可以,同时解决了重复的问题;
(3)然后在第7章里面的静态变量也是重复的问题,静态变量就是多个数据中有共享数据,将此数据抽取出来,也就解决了重复问题。
所以对于以上问题的重复,我们可以将多个事物之间重复性的属性或行为进行抽取,抽取出来之后放在另外一个单独的类里面即可。
class Student {
void study() {
System.out.println("study...");
}
}
class Worker {
void work(){
System.out.println("work...");
}
}
class Teacher {
void teach() {
System.out.println("teach...");
}
}
class Person {
String name;
int age;
}
上面这段代码就把Worker、Student和Teacher这三个类里面共同的部分抽取到了Person类里面了,此时这个Person类就是上面三个的父类。
虽然我们将Person类抽取出来,但是目前Worker和Student和Teacher与Person有无关系?是没有的。
所以如何让类之间产生这种父(Person)子(Worker Student Teacher)的关系,用使用关键字extends。
所以以下这段代码就是父子关系
class Student extends Person {
void study() {
System.out.println("study...");
}
}
class Worker extends Person {
void work(){
System.out.println("work...");
}
}
class Teacher extends Person {
void teach() {
System.out.println("teach...");
}
}
class Person {
String name;
int age;
}
所以在这里总结一句:把多个事物中重复性的内容进行抽取,并生成另外一个类,该类就是其他类父类,其他类称之为子类,父类与子类之间用extends关键字来标明。
2.继承的好处
- 继承的出现提高了代码的复用性;
- 继承的出现让类与类之间产生关系,也为我们后面多态提供了前提。
3.单继承与多继承
在现实生活中,父与子是一对多的关系(多继承),子与父是一对一的关系(单继承);
还有关键性的一点是:使用继承时,除了要考虑类与类之间重复的内容之外,更重要的是去考虑关系,必须是一种 is a 关系,就如一下代码:
class Student extends Person {
void study() {
System.out.println("study...");
}
}
class Worker extends Person {
void work(){
System.out.println("work...");
}
}
class Teacher extends Person {
void teach() {
System.out.println("teach...");
}
}
class Person {
String name;
int age;
}
class Dog {
void kanmen(){}
}
Dog不是Person,意思就是狗不是人,所以Person类就不是Dog类的父类,所以说 is a 的关系意思就是XXX是YYY的一种,苹果是水果的一种,狗是动物的一种。
Java中 类与类之间只能支持单继承, 接口与接口之间可以支持多继承。
class Demo extends Demo1{}
class Demo extends Demo1,Demo2{}//Error
4.继承体系
既然有了单继承,那就也会有了父子关系,爷孙关系,曾祖父重孙关系,继承出现了层级,继承体系。
class A{}
class B extends A{}
class C extends A{}
class D extends C{}
......
所以有上段代码可以看出,B是A的儿子,C是A的儿子,B和C是兄弟,D又是C的儿子,所以D是A的孙子,这就是继承体系,依次类推。
5.需要注意的问题
- 继承和传统的理解稍微有一些不同的,子类并不是或是父类的一个子集!实际上,一个子类通常比它的父类包含更多的信息和方法。(子类更多的是父类的一种升级和延伸)
- 父类中的一些私有内容,子类是获取不到的。如果父类对其自身的私有内容设置了公共的访问器和修改器的话,子类可以通过该访问器和修改器来获取父类的私有内容。
- 不要为了获取某一个特殊的属性或行为,而去乱认爸爸。
class Bird {
void fly(){}
}
class Person extends Bird{} //不合适!
人没有会飞的功能,不符合现实问题。
- 说来说去,总之就是想表达一个观点,在设计类和其继承关系时,一定要符合社会常识认知伦理问题。