转载:http://www.cnblogs.com/chenssy/p/3354884.html
继承:
构造器、protected关键字、向上转型。
构造器:
父类有默认构造器。如果父类没有默认构造器,我们就要必须显示的使用super()来调用父类构造器,否则编译器会报错:无法找到符合父类形式的构造器。
Note:对于继承而已,子类会默认调用父类的构造器,但是如果没有默认的父类构造器,子类必须要显示的指定父类的构造器,而且必须是在子类构造器中做的第一件事(第一行代码)
测试:
public static class Husband extends Person{
private Wife wife;
Husband(){
// super("Queenie");
System.out.println("husband constructor...");
}
}
结果:
Error:(15, 18) java: 无法将类 main.Inherit.Person中的构造器 Person应用到给定类型;
需要: java.lang.String
找到: 没有参数
原因: 实际参数列表和形式参数列表长度不同
protected关键字
指明就类用户而言,他是private,但是对于任何继承与此类的子类而言或者其他任何位于同一个包的类而言,他却是可以访问的。
Note:将属性保持为private(我们应当一致保留更改底层实现),通过protected方法来控制类的继承者的访问权限
测试:
public class ProtectedPerson {
protected String name;
protected String sex;
protected int age;
protected String getName(){
return name;
}
protected void setName(String name){
this.name = name ;
}
@Override
public String toString() {
return "This name is "+name;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public static class Husband extends ProtectedPerson{
private Wife wife;
@Override
public String toString() {
setName("Queenie");//调用父类的setName();
return super.toString();//调用父类的toString()方法;
}
}
public static void main(String[] args) {
Husband husband = new Husband();
System.out.println(husband.toString());
}
}
结果:
This name is Queenie
向上转型
将子类转换成父类,在继承关系上面是向上移动
测试:
public class UpwardPerson {
public static void display(Husband husband) {
System.out.println("Play UpwardPerson... ");
}
public static class Husband extends UpwardPerson{
public static void main(String[] args) {
Husband husband = new Husband();
UpwardPerson.display(husband); //向上转型
}
}
结果:
Play UpwardPerson...