黑马程序员技术交流社区

标题: 抽象类的继承问题 [打印本页]

作者: 苏伯亚    时间: 2014-4-11 18:53
标题: 抽象类的继承问题
毕老师讲抽象的时候说过
抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

而我们知道抽象类是不能被实例化的。这样就有点不懂 下面的代码:
abstract class Student
{
        abstract  void study();
        //abstract void study1();
        void sleep()
        {
                System.out.println("躺着");
        }
}




class ChongCiStudent extends Student
{
        void study()
        {
                System.out.println("chongci study");
        }
}
lass AbstractDemo
{
        public static void main(String[] args)
        {
                new ChongCiStudent().sleep();
        }
}

student是抽象类ChongCiStudent类继承了它,但是并没有全部敷写Student中的方法。这样应该就还是抽象类,但是却还是能建立实例化和调用抽象类Student中的方法,是我理解有问题还是代码那里错了 。求解释。



作者: ithmC4    时间: 2014-4-11 19:01
搭车 同求啊 这块也不动
作者: fufeng    时间: 2014-4-11 19:11
“student是抽象类ChongCiStudent类继承了它,但是并没有全部敷写Student中的方法。这样应该就还是抽象类”
应该是“student是抽象类ChongCiStudent类继承了它,但是并没有全部敷写Student中的【抽象】方法。这样应该就还是抽象类”。
也就是抽象类中也是有非抽象方法的,子类继承了抽象类了就必须复写父类中【全部的抽象方法】,而不必复习父类中的非抽象方法,这样子类就不是抽象类,也就可以创建对象了
  1. abstract class Student
  2. {
  3.         abstract  void study();//抽象方法必须复写,子类中void study()有复写
  4.         //abstract void study1();//如果把左边这句代码加入,这子类就只能是抽象类了
  5.         void sleep()//非抽象方法,不必复写
  6.         {
  7.                 System.out.println("躺着");
  8.         }
  9. }




  10. class ChongCiStudent extends Student
  11. {
  12.         void study()
  13.         {
  14.                 System.out.println("chongci study");
  15.         }
  16. }
复制代码

作者: Kelvinhu    时间: 2014-4-11 19:12
本帖最后由 Kelvinhu 于 2014-4-11 19:21 编辑

原来是这样Description        Resource        Path        Location        Type
The type ChongCiStudent must implement the inherited abstract method Student.study1()        AbstractDemo.java        /Chat/src        line 14        Java Problem


必须全部实现抽象方法,否则也是抽象类。。

作者: 苏伯亚    时间: 2014-4-11 19:15
fufeng 发表于 2014-4-11 19:11
“student是抽象类ChongCiStudent类继承了它,但是并没有全部敷写Student中的方法。这样应该就还是抽象类” ...

谢谢 确实 给sleep加上抽象修饰后就报错了  懂了 谢谢
作者: yanzhendong    时间: 2014-4-11 19:48
只需要复写抽象类中的抽象方法就行了,
作者: 宋丹    时间: 2014-4-11 20:53
  1. abstract class Student
  2. {
  3.         abstract  void study();//z这个方法是抽象方法
  4.         //abstract void study1();
  5.         void sleep()//sleep()方法不是抽象方法
  6.         {
  7.                 System.out.println("躺着");
  8.         }
  9. }




  10. class ChongCiStudent extends Student
  11. {
  12.         void study()//复写父类的抽象方法
  13.         {
  14.                 System.out.println("chongci study");
  15.         }
  16. }
  17. lass AbstractDemo
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 new ChongCiStudent().sleep();
  22.         }
  23. }
复制代码

Student类中有两个方法,其中sleep()不是抽象方法,而study()是抽象方法,而它的子类在继承它的时候只需要复写抽象方法即可,非抽象方法可以复写(如果你要更新这个方法的话)也可以不复写
作者: 杨殿生    时间: 2014-4-11 21:15
你创建的子类的对象调用父类的的方法并不是抽象的呀,如过sleep方法是抽象的
你肯定不能调用的,子类必须要复写。如果不复写子类也是抽象类,并不能创建
对象
作者: 四川男人    时间: 2014-4-11 22:18
抽象类的子类只需要重写抽象类中的抽象方法,其他的非抽象方法是被继承下来了。只要子类全部重写了父类的抽象方法,子类就可以实例化,并且调用父类的方法




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2