8.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...");
}
}
以上可以看到的是,多个事物之间由共同的属性或行为,这种代码复用性很差,怎么办?可以将多个事物之间重复性的属性或者行为进行抽取,抽取出来之后放在另一个单独的类里面即可
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;
}
虽然我们将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关键字来标明
继承的好处
- 继承的出现提高了代码的复用性
- 继承的出现让类与类之间产生关系,也为我们后面多态提供了前提
单继承与多继承 - 在现实生活中,父与子一对多关系,子与父一对一
- 使用继承时,除了要考虑类与类之间重复的内容之外,更重要的是取考虑关系,必须是一种 is a 关系
- 即XXX是YYY的一种!苹果是水果的一种,狗是动物的一种
- Java 中类与类之间只能支持单继承,接口与接口之间可以支持多继承
class Demo extends Demo1{
}
class Demo extends Demo1.Demo2{
}//Error
继承体系
既然有了单继承,也有了父子关系,爷孙关系,曾祖父-重孙,继承出现了层级,继承体系
class A{
}
class B extends A{
}
class C extends A{
}
class D extends A{
}
......
需要注意的一些问题
- 继承和传统稍微理解有一些不同的,子类并不是或是父类的一个子集!实际上,一个子类通常比它的父类包含更多的信息和方法。(子类更多的是父类的一种升级和延申)
- 父类中的一些私有内容,子类是获取不到的。如果父类对其自身的私有内容设置的公共的访问器和修改器的话,子类可以通过访问该访问器和修改器来获取父类的私有内容。
- 不要为了获取某一个特殊的属性或行为,而去乱认爸爸
- 说来说去,总之就是想表达一个观点,在设计类和其继承关系时,一定要符合社会常识认知伦
理问题
class Bird{
void fly(){
}
}
class Person extends Bird{
}//不合适,不符合现实逻辑关系
子父类中,成员变量的关系
public class Sample{
public static void main(String[] args){
Zi zi = new Zi();
System.out.println(zi.num);
}
}
class Fu{
int num = 10;
}
class Zi extends Fu{
}
子类没有,父类有且非私有,子类对象能获取num
public class Sample{
public static void main(String[] args){
Zi zi = new Zi();
System.out.println(zi.num);
}