java初学者--浅谈override与返回类型

方法的重写(override)要遵循两同两小一大的原则:(子类方法相对于父类方法)

1)两同
1.1)方法名相同
1.2)方法参数列表相同
2)两小
2.1)返回类型若为引用类型必须小于或等于父类的,若为基本类型或者void则必须相同
2.2)抛出的异常必须小于等于父类的
3)一大
子类方法的访问权限要大于等于父类的

“两同”来自重写的定义,这里不再赘述;
对于“一大”,其实也挺好理解的,因为毕竟要保证能访问父类的方法就能访问子类重写的方法;
我还没有学到异常这个概念,所以以后再补上吧;
我的疑问来自于“两小”中的第一条:
1)引用类型的大小关系是如何体现的?
2)对于引用型返回值,如果子类大于父类,会怎么样?
3)对于基本型返回值,如果子类不等于父类,会怎么样?

以下是我思考与查阅资料后自己得出的结论:
1)百度一下就明白了,其实就是父类大于子类的关系
2)
class Animal{
	public Bird m(){
		return new Bird();
	}
}

class Bird extends Animal{
	public Animal m(){//此处出现了编译错误
		return new Animal();
	}
}
如上所示,声明了一个Animal类,包括一个m()方法,又声明了一个Animal的子类Bird,Bird重写了Animal的方法m(),返回一个实例化的Animal,原方法返回一个实例化的Bird。然而在注释的位置出现了编译错误,这印证了“返回类型若为引用类型必须小于或等于父类的”这个说法。为何会出现编译错误呢?如果我们把两个方法调换过来看,若父类m()返回一个Animal,子类m()返回一个Bird,因为Bird继承了Animal,所以此时Bird就相当于一个Animal,返回类型相同,编译通过;然而当子类方法的返回值大于父类时,Animal不一定是Bird,所以会出现返回类型不相同而编译器报错。说法2.1等价于“返回类型无论是什么都必须相同”。那么为何Java规定返回类型必须相同?我说说我个人的理解:若我们使用向上造型的方法来实例化一个Bird对象,因为我们声明的是Animal型引用,所以在编译期的时候编译器会把Animal类中的m()方法加载到方法区(包括返回类型),然而重写遵循运行期绑定,即实际上运行时调用的是被Bird重写的方法,这样如果返回类型不同,jvm事先为返回分配的内存空间,会与实际返回对应不上,会出现问题。所以Java就作出了上述的规定。如果我有说的不对的地方欢迎联系我,email:972521960@qq.com






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值