1.继承
继承是面向对象最显著的一个特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的所有数据属性(成员变量)和行为(成员方法),并能扩展新的能力。
PS:即使是private属性的成员变量和成员方法也都被继承。
被继承的类叫父类,继承的类叫子类。
父类又叫超类或基类,子类又叫派生类。
Java中一个子类只能继承一个父类,但可以实现多个接口。
可以创建指向子类对象的父类引用,但不可以创建指向父类对象的子类引用。
2.方法覆盖
由于继承,会产生子类覆盖(重写)父类方法的现象。
什么是方法覆盖?
子类中重写父类中已有的方法,即子类重写的方法与父类的方法同名且签名也相同。
声明为final的方法,不允许被子类重写。
子类重写父类方法时,不允许改变返回值的类型,但有一种情况列外"协变返回(covariant return)",仅在子类方法的返回类型继承于父类方法返回类型的时才被容许。
子类重写父类方法时,访问权限不可以降级。
访问权限从高级向低级排列:public > protected > 默认(friendly) > private 。
错误重写方法举例:
①改变了返回值类型
public class OverTest extends Test{
public int play() {
return 0;
}
}
class Test{
public void play(){
}
}
②访问权限降级了,父类中方法是public权限,到子类中方法变成了protected权限。
public class OverTest extends Test{
protected void play() {
}
}
class Test{
public void play(){
}
}
3.浅谈多继承
Java类继承一个类和实现若干个接口时,或实现多个接口时。如果被继承的类或被实现的接口中,有相同的方法名称和签名,那么它们的返回类型必须相同(或者该Java类重写的方法的它们返回类的继承类),否则该类不能同时继承它们,这个重写的方法同时对它们都有效。(很多同学在此纠结,就是因为不知道重写的方法是对多个继承对象同时有效的)。Java接口也可以继承多个接口。
/*
正确的使用多继承的方法
*/
class Animal{
int play(){
return 0;
}
}
interface Animalref {
int play();
}
class Bird extends Animal implements Animalref{
public int play(){
return 0;
}
}
PS:有一位朋友在评论中提到类应该是继承接口而不是实现接口。
我在这里说一下,类继承类的时候用的是extends关键字,实现接口的时候用的是extends关键字,接口继承接口的时候用的是extends关键字。
我们可以从关键字中明确的看到,类确实是实现接口。
但广义上可以说类继承接口。