黑马程序员————关于抽象类问题的一点想法

来源:互联网 发布:怎么查询端口是否开启 编辑:程序博客网 时间:2024/06/14 14:58
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

在创建抽象类时,有一个重要问题就是,如果子类不是抽象的,那么子类必须覆盖父类中所有的抽象方法,不是抽象的方法不用覆盖,分析下面这一段代码:abstract class Animal       
{ String name;
 public abstract void eat();
 public abstract void sleep();
}
abstract class Cat extends Animal
{
 public void eat(){
  System.out.println("猫粮");
 }
}class BossCat extends Cat
{
 public void sleep(){
  System.out.println("睡得很好");
 }
}
class Test5
{
 public static void main(String[] args)
 {  BossCat c=new BossCat();
  c.eat();
  c.sleep();
 }
}
在该段代码中,Animal是抽象的,其子类Cat也是抽象的,这样我们可以发现子类Cat并没有完全覆盖父类的抽像方法,像sleep()方法就没有被覆盖,这是因为Cat是抽象的,不能创建实体对象,所以可以不用覆盖父类Animal的方法,而到了BossCat这里,由于要创建实例对象,所以要覆盖父类中的方法,这是其父类eat中的方法不需要覆盖,它不是抽象的,而其父类的父类也就是Animal的sleep()还是抽象的,这就需要其创建sleep方法去覆盖其父类的父类方法才能够创建实例对象。而Animal中的eat方法已经被Cat覆盖,所以不需要再覆盖了。要想在抽象父类下子类创建实例对象,需要把父类以及父类以上的类中所有没有被覆盖的抽象方法都要重写一遍。这就是“子类想创建其实例对象,必须重写所有抽象方法”。否则就会出现下图这样的编译错误了

抽象类的常见问题:
  1、抽象类有构造方法么?如果有,为什么,如果没有,为什么?
   有   但是不是用来创建实例对象的,而是用来为变量初始化,供子类使用。
  2、抽象关键字abstract不可以和哪些关键字共存?
   final :抽象类需要继承,final修饰的无法继承
   static :抽象类抽象方法无方法体,调用无意义
   private:抽象类的方法需要被覆盖,如果private修饰的话,子类无法访问
0 0
原创粉丝点击