简介
继承,顾名思义,就是子类继承父类的特征和行为,从而使子类拥有父类的各种属性或者方法。
使用继承最大的好处就是可以复用代码。使用已经存在的类的定义作为基础去定义新的类,新的类可以使用父类的功能,可以重写父类的方法,也可以增加自己新的数据和功能。
Java所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,则默认继承object祖先类。
继承的特性
- 子类拥有父类的非private的属性、方法和构造器。
- 子类可以扩展,拥有自己的属性和方法。
- 子类可以用自己的方式去实现父类的方法。
- Java的继承是单继承。(区别于C++)
继承会提高代码之间的耦合性。(继承的缺点)
实例
父类
public class Person{
private String name;
private int age;
public Person(String myName,int myAge){
name=myName;
age=myAge;
}
public void sleep(){
System.out.println(name+”正在睡”);
}}
男人
public class Nanren extends Person{
public Nanren(String myName,int myAge){ super(myName, myAge); }
}
关键字
extends
类的继承是单一继承,一个子类只能拥有一个父类,extends示例代码如上。
implements
虽然Java是单继承的,但是可以通过implements变相的使Java拥有多继承的特性,继承的对象为接口,之间用逗号隔开。
public interface A{
public void run();
}
public interface B{
public void eat();
}
public class C implements A,B{
}
super
可以通过super来访问父类的成员变量。
this
表示自己的引用。
final
被final声明的类是最终类,不能被继承;
被final修饰的方法不能被子类重写;
被final修饰的实例变量不能被修改。
构造器
构造器–即指构造函数或者构造方法。对于构造器来说,它只能被子类调用,而不能被继承。
如果父类有无参构造器,则可以不用在子类构造器中用super去调用父类的构造器,此时系统会自动调用父类的无参构造器。
如果父类的构造器是带有参数的,则子类的构造器必须显式的通过super关键字调用父类的构造器。
public class SuperClass {
private int n;
SuperClass(){
System.out.println("SuperClass()");
}
SuperClass(int n) {
System.out.println("SuperClass(int n)");
this.n = n;
}
}
class SubClass extends SuperClass{
private int n;
SubClass(){
super(300);
System.out.println("SuperClass");
}
public SubClass(int n){
System.out.println("SubClass(int n):"+n);
this.n = n;
}
}
public class TestSuperSub{
public static void main (String args[]){
//SubClass sc = new SubClass();
SubClass sc2 = new SubClass(200);
}
}
使用继承带来的问题
- 父类发生改变,则子类必须跟着改变。
- 继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。
- 继承增强了程序之间的耦合关系。