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

2019/04/07 15:25
阅读数 6

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

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

 

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

抽象类为例来说明:

 

 

 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),那这是为什么呢?明明内存中存放的是子类的对象啊?  这是因为将子类的对象赋给了父类的变量,在父类的类体中,没有找到这个方法,

所以无法调用。

 

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

 

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

 

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

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部