先看前一个例子,我们看到Wife和Husband类中有很多属性是相同的,例如name,age,sex。为了实现代码的复用我们就要使用继承。
首先我们知道丈夫和妻子他们都是人,那么就应该有人所具备的一些属性,比如人有姓名,年龄,性别...也具有人所具备的一些行为,比如,吃饭,行走,睡觉...那么我们发现丈夫和妻子都有人说具备的一些属性和行为,这些属性和行为都是从人那里继承得来的。
继承的基本概念:通过一个已有的类来创建一个新的类,新类继承了已有类的属性和行为,这种方式称为继承。新的类叫做子类,已有被扩展的类叫做父类。一个类使用关键字extends继承其他类,关键字extends出现在类声明时的类名后,extends后面跟着的是要继承的类的名称,extends实现了继承。在Java中的类只能继承一个类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
public class Person {
private String name;
private String sex;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Husband extends Person {
private Wife wife;
public void setWife(Wife wife) {
this.wife = wife;
}
public Wife getWife() {
return wife;
}
}
public class Wife extends Person {
private Husband husband;
public Husband getHusband() {
return husband;
}
public void setHusband(Husband husband) {
this.husband = husband;
}
}
使用继承要注意:
子类拥有父类分类非private的属性和方法
子类可以拥有自己的属性和方法,
子类可以用自己的方式实现父类的方法
上面我们说子类可以继承父类非private的属性和方法,但是还有一样子类继承不了,那就是构造器,对于构造器来说它只能被调用不能被继承,子类调用父类的构造器可以使用super();
public class Person {
private String name;
private String sex;
private int age;
Person(){
System.out.println("Person Constrctor...");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<pre name="code" class="java">public class Husband extends Person {
private Wife wife;
Husband(){
System.out.println("Husband Constructor...");
}
public static void main(String[] args) {
Husband husband = new Husband();
}
public void setWife(Wife wife) {
this.wife = wife;
}
public Wife getWife() {
return wife;
}
}
<pre>Output:
Person Constrctor...
Husband Constructor...
可以看出是从父类开始一级一级完成构建的,子类并没有引用父类的构造器,但是编译器会默认给子类调用父类的构造器,之后才会调用子类的构造器。要这样父类是要有构造器的,若父类没有构造器,那么子类要调用必须使用super();
综上:对于继承,子类默认会调用父类的构造器,但是父类没有默认的构造器,子类必须显示的调用父类的构造器,而且必须在子类构造器的第一行代码
在封装里我们使用private访问修饰符,但是在继承里,如果使用private来修饰子类便不能继承,有时我们需要将该类的某些事物尽可能的隐藏,并且还允许子类来访问,这是我们就必须用protected,它是继承此类,或与该类在同一个包里的都能访问。
继承的缺陷:1:父类变,子类也必须变 2:破坏了封装,3:继承是一种强耦合。