一、关于继承
- 什么是继承?
继承(inheritance):它是Java程序设计中的一项核心技术。它的基本思想是可以
基于已有的类创建新的类,继承已存在的类就是复用这些类的方法,而且可以增加一些新的方法和字段,使类能够适应新的情况。
- 如何使用继承?
关键字
extends表示继承,表明正在构造的新类派生与一个已存在的类。
- 类、超类和子类
-
已存在的类被称为
超类、基类或父类。 -
新类被称为
子类、派生类或孩子类。 -
子类比超类拥有的功能更多。
二、继承的实现
- 超类实现:
/* *
* 定义一个超类,有自己的方法和字段。
*/
public class Parent {
String name = "parent";
public String getName() {
return this.name;
}
}
- 子类继承:
/* *
* 定义一个子类,使用extends关键字继承超类。
* 子类有自己的特有实现。
* 在子类方法中实现调用超类方法。
*/
public class Child extends Parent {
public void getParentName(){
// 调用超类getName()方法
System.out.println(getName());
}
public static void main(String[] args) {
Child child = new Child();
child.getParentName();
// print "parent"
}
}
super关键字:
/* *
* 定义一个超类,有自己的方法。
*/
public class Parent {
public void hobby() {
System.out.println("sing");
}
}
/* *
* 定义一个子类,使用extends关键字继承超类。
* 在子类中,重写超类已有方法。
* 使用super关键字调用超类方法。
*/
public class Child extends Parent {
@Override
public void hobby() {
System.out.println("run");
}
public void getParentHobby() {
// 显式调用超类方法
super.hobby();
}
public static void main(String[] args) {
Child child = new Child();
// 调用重写超类的方法
child.hobby();
child.getParentHobby();
// print run sing
}
}
-
注意事项:
-
super不是一个对象的引用,它只是一个指示编译器调用超类方法的特殊关键字。 -
使用
super调用构造器的语句必须是子类构造器的第一条语句。 -
Java
不支持多重继承。 -
在覆盖一个方法的时候,子类方法
不能低于超类方法的可见性。
-
三、关于多态
- 什么是多态?
多态(polymorphism):一个对象变量可以指示多种实际类型的现象称为
多态。即同一个行为具有多个不同表现形式或形态的能力。
- 如何使用多态?
-
前提:必须有
继承关系。 -
格式:
超类类型 变量名 =
new子类类型( );
四、多态的实现
- 超类实现:
/* *
* 定义一个超类,有自己的成员变量及方法
*/
public class People {
String name = "people";
public void eat() {
System.out.println("吃饭");
}
}
- 子类实现:
/* *
* 定义一个子类,使用extends关键字继承超类。
* 在子类中,重写超类已有方法。
* 子类有自己特有的成员变量及方法。
*/
public class Student extends People {
String name = "student";
@Override
public void eat() {
System.out.println("学生爱吃汉堡");
}
public void study() {
System.out.println("学习");
}
}
- 多态使用:
/* *
* 使用向上及向下转型调用超类方法。
*/
public class Sample {
public static void main(String[] args) {
// 多态本身就是向上转型过的过程。
// 1. 向上转型格式:超类类型 变量名=new 子类类型();
// 适用场景:超类的功能就能完成相应的操作。
People student = new Student();
System.out.println(student.name);
// print people
// 注意:在使用多态后的超类引用变量调用方法时,会调用子类重写后的方法。
student.eat();
// 学生爱吃汉堡
// 2. 向下转型格式:子类类型 变量名=(子类类型) 超类类型的变量;
// 适用场景:当要使用子类特有功能时,使用向下转型。
Student student1 = (Student) student;
System.out.println(student1.name);
// print student
student1.study();
// print 学习
}
}
- 多态解析过程:
在运行时能够自动地选择适当的方法,称为
动态绑定。
-
首先,虚拟机获取实际类型的方法表;
-
接下来,虚拟机查找
签名的类; -
最后,虚拟机调用这个方法。
五、继承设计技巧
-
将公共操作和字段放在超类中。
-
不要使用
protected关键字修饰字段:由于子类集合是无限制的,任何派生的子类都能访问,并且同一个包的类都能访问该修饰符的字段,从而破坏了封装性。 -
使用继承实现
“is-a”的关系。 -
除非所有
继承的方法都有意义,否则不要使用继承。 -
在覆盖方法时,
不要改变预期的行为。 -
使用多态,不要使用类型信息。(使用多态或接口实现的代码比使用多个类型检测的代码更
易于维护和拓展。)
六、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。