1.继承概述
package cn; publicclass Student { private String name; privateintage; public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } publicint getAge() { returnage; } publicvoid setAge(intage) { this.age = age; } @Override public String toString() { return"Student [name=" + name + ", age=" + age + "]"; } } |
package cn; publicclass Teacher { private String name; privateintage; public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } publicint getAge() { returnage; } publicvoid setAge(intage) { this.age = age; } @Override public String toString() { return"Teacher [name=" + name + ", age=" + age + "]"; } } |
通过上面的代码,我们可以看出学生类和老师类中都有相同的成员变量和成员方法,这样代码的重复度很高。而且,可以还有许多类似的类,比如:工人类,军人类等。这样写代码的代码量非常大,而且将来维护起来非常麻烦。所以,我们就思考:能不能把相同的成员变量和成员方法定义到同一个类中,让多个类和这个类产生关系呢?这多个类就具备了这个独立类的成员变量和成员方法,那该有多好啊?Java提供了继承,来满足我们的需求。
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性和行为,只要继承那个类即可。
通过extends关键字可以实现类与类的继承,class 子类名 extends 父类名{}。
父类,又可以成为基类或超类;子类,又称为派生类。
有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的继承上,定义自己的新成员。
package cn; publicclass Person { private String name; privateintage; public String getName() { returnname; } publicvoid setName(String name) { this.name = name; } publicint getAge() { returnage; } publicvoid setAge(intage) { this.age = age; } @Override public String toString() { return"Person [name=" + name + ", age=" + age + "]"; } } package cn; publicclass Student extends Person{} package cn; publicclass Teacher extends Person{} |
2.继承的好处
2.1提高了代码的复用性 多个类相同的成员变量和成员方法可以放到同一个类中。
2.2提高了代码的维护性 如果功能的代码需要修改,修改一处即可。
2.3让类与类之间产生了关系,是多态的前提 但是这也是继承的一个弊端:类之间的耦合性很强。
3.软件的设计原则
高内聚,低耦合。
内聚:就是自己完成某件事情的能力;耦合就是类与类之间的关系。
我们在设计的时候的原则就是:自己能完成的就不麻烦别人,这样将来别人产生了修改,就对我的影响较小。
4.Java中继承的特点
4.1Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
classSubDemo extends Demo{}//正确
classSubDemo extends Demo1,Demo2{}//错误
4.2Java支持多层继承
classA{}
classB extends A{}
classC extends B{}
5.Java中继承的注意事项
子类只能继承父类所有非私有的成员(成员方法和成员变量)。其实,这也是继承的另一个弊端,打破了封装性。
子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
我们什么时候使用继承呢?继承中类之间体现的是:“is a”的关系。例如:水果和苹果,苹果是一种水果。学生和人,学生是人的一种。
6.super关键字
6.1super的用法和this很像
this表示本类对象的默认引用
super表示父类存储空间的标志
6.2用法
访问成员变量
this.成员变量
super.成员变量
访问构造方法
this(...)
super(...)
访问成员方法
this.成员方法();
super.成员方法();
7.继承中构造方法的关系
子类中所有的构造方法默认都会调用父类的无参构造方法。
why?因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
如果父类中没有构造方法,那该怎么办呢?
子类可以通过super去显示调用父类其他的带参的构造方法
子类可以通过this去调用本类的其他构造方法,当然本类其他构造也必须首先访问父类构造。
一定注意:this(...)或super(...)必须出现在第一条语句
8.方法重写概述
子类中出现了和父类中一模一样的方法声明,也称为方法覆盖,方法复写。
使用特点:如果方法名不同,就调对应的方法。如果方法名相同,最终使用的是子类自己的。
方法重写应用:当子类需要父类的功能,而功能主体子类有自己特有的内容时,可以重写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容。
方法重写的注意事项:1.父类中私有方法不能被重写2.子类重写父类方法时,访问权限不能更低