关于抽象方法和接口向上转型

关于抽象方法和接口向上转型

抽象类的出现,只要是为了规范子类的方法的命名,抽象类不能创建对象,是因为抽象类中含有抽象方法,所以抽象类是不完整的,假若抽象类可以创建对象的话,创建出来的对象要调用抽象类的方法,而抽象方法无调调用,就会出错,所以抽象类无法创建对象。

接口类的出现原因和抽象类差不多,但是抽象类和接口还是有很大的差别的,反映在:抽象类是类,接口类是接口,类是单根继承的,而接口是多继承的,一个类只能继承一个父类,而一个类可以实现多个接口,一个接口可以继承多个接口。

 

下面来说说抽象对象和接口向上转型的问题:众所周知,抽象类和接口都是不能创建对象的,但是子类的向上转型中,抽象类和接口又可以接受来自子类向上转型创建的对象,由于接口和抽象类的原因一样,所以就以

抽象类为例来说明:

 

 

 1 class abstract Pet{
 2 
 3 public abstract eat(0;
 4 
 5 }
 6 
 7  
 8 
 9 class Cat  extends  Pet{
10 
11   @Override
12 
13   public void eat(){
14 
15    syso("eating......");  
16 
17 } 
18 
19 }
20 
21 
22 
23 public class Test{
24 
25   Pet p =new  Cat();  //此处是一个向上转型  
26 
27 }

 

 

来解释一下为什么不能创建对象的抽象父类Pet在此处可以有一个对象 p,其实  在内存空间的  存储的是Cat开辟的空间,所以p其实是Cat的对象,只是给了他一个父类的外表而已,所以抽象父类可以接受来自子类的向上转型的对象,接口也相同。

Pet  p  =new Cat();    只有 new Cat() 才是创建对象,   Pet  p 只是一个变量,并不是创建对象。

 

向上转型:本来是子类的类型,赋给了一个父类的变量,向上转了一个类型,所以叫向上转型。

向上转型之后调用方法,依然是调用子类的方法,是因为内存中开辟的空间存放的依然是子类的对象。

 

向上转型后的父类对象,无法调用子类的自有方法(只有子类有,父类没有,无论修饰符是public还是private),那这是为什么呢?明明内存中存放的是子类的对象啊?  这是因为将子类的对象赋给了父类的变量,在父类的类体中,没有找到这个方法,

所以无法调用。

 

向下转型,只有经过向上转型的父类对象,才可以向下转型。

 

为什么只有经过向上转型的父类对象,才可以向下转型,  而不能直接不经过向上转型,父类对象就直接向下转型呢?   因为子类的功能往往更加丰富,子类的自有方法父类不能调用,所以不能直接向下转型。

 

向上转型后,调用子类和父类的同名方法,搞不清了可以记住就近原则,是子类的实体,所以肯定先调用子类的方法,子类没有了才使用父类的方法

 

posted @ 2019-04-07 15:25 ControllerMe 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值