java继承与多态

继承
在java中使用extends关键字来表示继承关系。当创建一个类时,总是在继承,如果没有明确指出要继承的类,就总是隐式地从根类Object进行继承。

子类继承父类的域
  当子类继承了某个类之后,便可以使用父类中的域,但是并不是完全继承父类的所有域。具体的原则如下:
  能够继承父类的public和protected域;不能够继承父类的private域;
  对于父类的包访问权限域,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  对于子类可以继承的父类域,如果在子类中出现了同名称的域,则会发生隐藏现象,即子类的域会屏蔽掉父类的同名域。如果要在子类中访问父类中同名域,需要使用super关键字来进行 引用。

子类继承父类的方法
  同样地,子类也并不是完全继承父类的所有方法。
  能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
  对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
  注意:隐藏和覆盖是不同的。隐藏是针对域和静态方法的,而覆盖是针对普通方法的。(后面会讲到)
构造器
子类是不能继承父类的构造器的。
调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

在子类中声明一个与父类完全相同的方法,重载机制能正常执行,当要覆盖父类方法时,建议使用@Override注解。它会在你不小心重载了父类方法时给出错误提示。

继承--is a,尽量慎用继承,多用组合;如果必须向上转型,则继承时必须的;否则,就应该好好考虑是否需要继承。
组合--has a

向上转型
由子类转型成父类,在继承图上是向上移动的,因此成为向上转型。
由于子类是父类的一个超级,它只可能比父类拥有更多的方法,所以向上转型总是安全的。所以编译器总是支持向上转型。
举例:
class Instrument {
static void play() {}
static void tune(Instrument i) {
//...
i.play();
}
}

public Wind extends Instrument {
public static void main(String[] args) {
Wind flute = new Wind();
Instrument.tune(flute);//向上转型
}
}

多态
多态,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
在java中表现为,程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。
java中实现多态的机制:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,动态绑定。

在java中除了static和final以外,其它的方法都是动态绑定。private方法,域,静态方法方法不是多态的,


协变返回类型
在java5中添加了协变返回类型,它表示在子类中的被覆盖的方法可以返回父类方法的返回值类型的某个子类。

向下转型
向下转型也就是在继承层次中向下移动,这样就可以获取更多的信息。

当使用父类或接口定义的引用指向子类或具体实现类对象时,该引用只能调用父类或者接口中的方法,对于子类或者实现类中特有的方法是不能调用的。当需要使用子类或者实现类中特有的方法时,就需要向下转型。如果转型是正确的,那么转型成功;否则,就会返回一个ClassCastException。

猜你喜欢

转载自cc414011733.iteye.com/blog/2287385