黑马程序员技术交流社区

标题: 抽象类中的方法和不能创建对象的问题 [打印本页]

作者: 黄玉昆    时间: 2013-2-5 00:29
标题: 抽象类中的方法和不能创建对象的问题
本帖最后由 黄玉昆 于 2013-2-5 19:48 编辑

在毕老师的关于抽象类的视频中,有以下关于抽象类特点的总结:
1、抽象方法一定在抽象类中
2、抽象方法和抽象类必须被abstract修饰
3、抽象类不可用new创建对象,因为调用抽象方法没有意义
4、抽象类中的方法要被使用,必须有子类腹泻所有的抽象方法后,建立子类对象调用。
     若子类只覆盖了部分抽象方法,那么该子类仍为抽象类
下面是代码
  1. <font size="1">abstract class  Student{
  2.        abstract void study();
  3. }

  4. class BaseStudent extends Student{
  5.       void study(){
  6.        System.out.println("Base study");
  7.       }
  8. }

  9. class AbvStudent extends Student{
  10.      void study()
  11.     {
  12.           System.out.println("Abv study");
  13.      }
  14. }</font>
复制代码
这里我就有一点不明白了:
1、抽象类是因为其中方法没有任何实际意义,而不能创建对象,
而且子类还要复写抽象类这个超类的多有抽象方法,这样岂不是会多些很多代码,并不简便啊。
如果直接不定义抽象类这个超类,而就是子类这个类自定义一些方法,不是更方便吗?
2、也就是说一定要用到抽象类吗?
3、到底在什么情况下一定使用抽象类,什么情况是可以不必使用抽象类呢?
4、抽象类到底有什么好处呢?
希望能再结合别的实例解答,谢谢









作者: 刘凯    时间: 2013-2-5 01:20
首先,一个类中有抽象方法,则该类必须要被abstract 修饰,也就是说声明为抽象类。
抽象类里边可以有抽象的方法,也可以没有抽象的方法。
接口,也是一个抽象类,不同就在于,接口里全部是抽象的方法。
子类为什么必须去复写抽象父类中的抽象方法呢?
我认为,这样的目的就是强迫子类比寻去实现所继承的方法。

一个不恰当的例子  一个person的一个父类  和一个 child的子类
child必然是人 不考虑特殊情况 则应该必然有两只手,但每个人能用手去做什么事情是不同的
所以手就可以在父类里定义为抽象类 强迫其子类拥有人的特征,符合父类的规则,否则就不能归到人这个范畴内。

与之相似的接口也是这个道理
就如平时用的插排上的三相接口来讲  强迫你必须这样去设计,必须是三个叉针,至于你用的材料是铁 是铜还是什么别的什么 自己去决定

可能这两个例子不是很恰当   一句话也就是将,你想归到我这个父类这个范畴里来 你必须按我的规矩去办,至于你是怎么办成的管不着,只看结果。  

浅陋见解,望各楼指正
作者: 黄玉昆    时间: 2013-2-5 01:23
刘凯 发表于 2013-2-5 01:20
首先,一个类中有抽象方法,则该类必须要被abstract 修饰,也就是说声明为抽象类。
抽象类里边可以有抽象的 ...

毕老师也说过类似的原因,可是还有些迷糊,结合着你说的,我在慢慢理解。谢谢啊
作者: 李洪因    时间: 2013-2-5 17:06
实现一个接口,但是这个接口的方法比较多,而你只需要用到一个方法,但是因为集成的是接口,所以你不得不是先接口中所有的方法!!就很麻烦,产生很多不必要的代码!如果继承接口,而创建一个抽象类,然后你在继承抽象类,那么久只需要复写你所需要的那一个方法就行了!也就是当你的代码量达到一定水平,就会发现抽象类的好处啦!
作者: 范天成    时间: 2013-2-5 20:40
抽象类主要就是为了接口,有了接口,程序才具有了良好的扩展性。就像重载可以扩展函数的功能一样。
作者: 黄玉昆    时间: 2013-2-5 21:21
范天成 发表于 2013-2-5 20:40
抽象类主要就是为了接口,有了接口,程序才具有了良好的扩展性。就像重载可以扩展函数的功能一样。 ...

是不是说接口更抽象于抽象类呢?抽象类是具体类和接口的桥梁?
作者: 范天成    时间: 2013-2-5 21:46
黄玉昆 发表于 2013-2-5 21:21
是不是说接口更抽象于抽象类呢?抽象类是具体类和接口的桥梁?

不能说接口更抽象于抽象类,因为他们是一个抽象层次的,应该说接口是纯抽象类,接口里面的方法全是抽象方法。
作者: 黄玉昆    时间: 2013-2-5 22:12
范天成 发表于 2013-2-5 21:46
不能说接口更抽象于抽象类,因为他们是一个抽象层次的,应该说接口是纯抽象类,接口里面的方法全是抽象方 ...

是啊,既然抽象类中含有非抽象方法,接口中无非抽象方法,那接口不还是更加抽象于抽象类吗?虽然接口不是抽象类。
作者: dzr19850306    时间: 2013-2-5 22:37
这里我就有一点不明白了:
1、抽象类是因为其中方法没有任何实际意义,而不能创建对象,
而且子类还要复写抽象类这个超类的多有抽象方法,这样岂不是会多些很多代码,并不简便啊。
如果直接不定义抽象类这个超类,而就是子类这个类自定义一些方法,不是更方便吗?

   抽象类不是因为其方法没有任何实际意义,而是其方法在程序中没有写出其内容。比如一个抽象类中叫动物 ,有一个方法 叫吃。  那个这个吃, 你认为它没任何实际意义吗?实际是有的,这里没有意义的说法只是说它没有被定义。
   继续说下去,如果 狗 这个类 复写了动物 这个抽象类, 狗的 吃这个方法,你可以提示是用嘴吃,用牙齿咬碎。吃进去。
   这就是因为你在方法中定义了内容,所以方法有了“意义”。
  



2、也就是说一定要用到抽象类吗?
     你根本就不必要用抽象类,你完全可以把所有的类都定义成不抽象的。
   
3、到底在什么情况下一定使用抽象类,什么情况是可以不必使用抽象类呢?
     参考上面。

4、抽象类到底有什么好处呢?
     不好意思,




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