抽象类的出现,只要是为了规范子类的方法的命名,抽象类不能创建对象,是因为抽象类中含有抽象方法,所以抽象类是不完整的,假若抽象类可以创建对象的话,创建出来的对象要调用抽象类的方法,而抽象方法无调调用,就会出错,所以抽象类无法创建对象。
接口类的出现原因和抽象类差不多,但是抽象类和接口还是有很大的差别的,反映在:抽象类是类,接口类是接口,类是单根继承的,而接口是多继承的,一个类只能继承一个父类,而一个类可以实现多个接口,一个接口可以继承多个接口。
下面来说说抽象对象和接口向上转型的问题:众所周知,抽象类和接口都是不能创建对象的,但是子类的向上转型中,抽象类和接口又可以接受来自子类向上转型创建的对象,由于接口和抽象类的原因一样,所以就以
抽象类为例来说明:
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),那这是为什么呢?明明内存中存放的是子类的对象啊? 这是因为将子类的对象赋给了父类的变量,在父类的类体中,没有找到这个方法,
所以无法调用。
向下转型,只有经过向上转型的父类对象,才可以向下转型。
为什么只有经过向上转型的父类对象,才可以向下转型, 而不能直接不经过向上转型,父类对象就直接向下转型呢? 因为子类的功能往往更加丰富,子类的自有方法父类不能调用,所以不能直接向下转型。
向上转型后,调用子类和父类的同名方法,搞不清了可以记住就近原则,是子类的实体,所以肯定先调用子类的方法,子类没有了才使用父类的方法