向上造型和方法的重写

向上造型:

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):重新写、覆盖

  • 发生在父子类中,方法名称相同,参数列表相同,方法体不同
  • 重写方法被调用时,看对象的类型
  • 重写要遵循"两同两小一大"原则:------了解
    • 两同:
      1. 方法名称相同
      2. 参数列表相同
    • 两小:
      1. 派生类方法的返回值类型小于或等于超类方法的
        当返回值为void或基本数据类型时,必须相等
        当返回值为引用数据类型(类或者数组)时,小于或等于(父类大于子类)
      2. 派生类方法抛出的异常小于或等于超类方法的
    • 一大:
      派生类方法的访问权限大于或等于超类的方法的

例:

//这串代码最后输出内容是?
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派生类
分析:

  1. coo.test(o)是一个首先会从coo指向的对象里寻找test方法,
  2. coo是个Coo类型的对象,这个对象里有两个test方法,他们的参数类型不同
  3. 根据coo.test(o)里的o的类型选择要执行哪一个,o的类型是Aoo,所以执行第一个
  4. 会先打印testAoo,然后执行o.print()
  5. 同理,o只是一个地址,要执行print需要先找到它指向的对象地址
  6. 通过Aoo o = new Boo()知道o指向的是一个Boo类型的对象
  7. 所以会调用Boo里的print方法,Boo是Aoo的派生类,重写了print,在它的print方法里先调用了超类的print,所以会先打印Aoo超类,再打印Boo派生类
  8. 这里Coo里的两个test签名不同,是重载。Aoo和Boo的print发生在父子类中,且签名完全相同,这是重写。

重写与重载的区别:

  • 重写(Override):
    1.1)发生在父子类中,方法名相同,参数列表相同,方法体不同
    1.2)遵循"运行期绑定",根据对象的类型来调用方法
  • 重载(Overload):
    2.1)发生在一个类中,方法名相同,参数列表不同,方法体不同
    2.2)遵循"编译期绑定",根据参数/引用的类型来绑定方法

猜你喜欢

转载自blog.csdn.net/zhyue28/article/details/88428112