向上造型:
class A{void test(){}}
class B extends A{void test1(){}}
A a = new B();//向上造型
- 超类型的引用(A a)指向派生类的对象(new B)就是向上造型
- 引用(a)能点出来什么,看引用的类型(A),比如这个a只能调用A里的test,不能调test1,如果B里有个test的重写函数,则会调用B的test
方法的重写(Override):重新写、覆盖
- 发生在父子类中,方法名称相同,参数列表相同,方法体不同
- 重写方法被调用时,看对象的类型
- 重写要遵循"两同两小一大"原则:------了解
- 两同:
- 方法名称相同
- 参数列表相同
- 两小:
- 派生类方法的返回值类型小于或等于超类方法的
当返回值为void或基本数据类型时,必须相等
当返回值为引用数据类型(类或者数组)时,小于或等于(父类大于子类) - 派生类方法抛出的异常小于或等于超类方法的
- 派生类方法的返回值类型小于或等于超类方法的
- 一大:
派生类方法的访问权限大于或等于超类的方法的
- 两同:
例:
//这串代码最后输出内容是?
class Aoo{
void print(){
System.out.println("Aoo超类");}
}
class Boo extend Aoo{
void print(){
super.print();
System.out.println("Boo派生类");
}
}
class Coo{
void test(Aoo o){
System.out.println("testAoo");
o.print();
}
void test(Boo o){
System.out.println("testBoo");
o.print();}
}
class Doo{
public static void main(String[] args){
Coo coo = new Coo();
Aoo o = new Boo();//超类的引用指向派生类的对象,这是向上造型
coo.test(o);
}
}
输出内容是:
testAoo
Aoo超类
Boo派生类
分析:
- coo.test(o)是一个首先会从coo指向的对象里寻找test方法,
- coo是个Coo类型的对象,这个对象里有两个test方法,他们的参数类型不同
- 根据coo.test(o)里的o的类型选择要执行哪一个,o的类型是Aoo,所以执行第一个
- 会先打印testAoo,然后执行o.print()
- 同理,o只是一个地址,要执行print需要先找到它指向的对象地址
- 通过Aoo o = new Boo()知道o指向的是一个Boo类型的对象
- 所以会调用Boo里的print方法,Boo是Aoo的派生类,重写了print,在它的print方法里先调用了超类的print,所以会先打印Aoo超类,再打印Boo派生类
- 这里Coo里的两个test签名不同,是重载。Aoo和Boo的print发生在父子类中,且签名完全相同,这是重写。
重写与重载的区别:
- 重写(Override):
1.1)发生在父子类中,方法名相同,参数列表相同,方法体不同
1.2)遵循"运行期绑定",根据对象的类型来调用方法 - 重载(Overload):
2.1)发生在一个类中,方法名相同,参数列表不同,方法体不同
2.2)遵循"编译期绑定",根据参数/引用的类型来绑定方法