第8章 继承

第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{} //不合适!

人没有会飞的功能,不符合现实问题。

  • 说来说去,总之就是想表达一个观点,在设计类和其继承关系时,一定要符合社会常识认知伦理问题。
上一篇:14 继承


下一篇:JAVA 项目 飞机大战 Hero Airplane Bee Bullet类的创建