A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁志仲 中级黑马   /  2012-7-31 16:33  /  8183 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

没抽象方法的抽象类是否可以继承呢?因为没有抽象方法可供覆盖啊。这种抽象类一般用在哪些情况?

评分

参与人数 1黑马币 +10 收起 理由
杨志 + 10

查看全部评分

8 个回复

倒序浏览
一般没有抽象类的抽象方法的作用是用于为了不让别的类去创建它的对象,没有抽象方法的抽象类也可以被继承的。只是不需要强制子类覆盖而已。

希望对你有帮助
回复 使用道具 举报
可以继承的,我们知道,当某个类被修饰为抽象类的时候,起作用仅仅是为了不让建立该类对象。
至于什么时候用?
答:当你不想别人调用该类的方法的时候,且不想让其创建该类对象的时候,你就可以将该类声明为抽象类
回复 使用道具 举报
1.可以被继承
2.如果子类中没有完全覆盖抽象类的抽象方法,那么它的子类还是抽象类。也就是说抽象类的子类只要覆盖它的抽象方法就行,如果没有抽象方法就不用覆盖。
3.当不想让一个类创建对象时,可以把它写成抽象类,因为抽象类不能创建对象,没有意义。
回复 使用道具 举报
没抽象方法的抽象类是否可以继承呢?因为没有抽象方法可供覆盖啊。这种抽象类一般用在哪些情况?


可以继承,这个用法在API中有个很显然的地方就是 事件监听机制中的Listener与Adapter的用法
当Listener接口有三个方法以上,而通常子类在实现时,只需要实现一个方法。另两个方法不想管,但接口规则是必须实现所有方法。所以那两个方法实现也是空方法。

为了简化代码,API中提供了大类的这相的Adapter抽象类,实现了Listener接口,但都是空方法。 所以Adapter被标识为抽象类(这样也防止实例化一个无意义的Adapter对象)。

这样,你的类在实现Listener时就简单了,可以直接继承Adapter就可以了。

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
没有抽象方法的抽象类也可以被继承的。只是没有抽象方法让子类实现而已,它的主要目的是防止别的类创建它的对象实例。希望对楼主有帮助
回复 使用道具 举报
/*
抽象类中可以不定义抽象方法,这种特殊的情况也就是只是为了防止该类中创建对象
没有抽象方法的抽象类也可以被子类继承,连覆盖都省了
*/
abstract class GetTime
{
public final void getTime()
{         
  long start = System.currentTimeMillis();
  runcode();
  long end = System.currentTimeMillis();
  System.out.println("毫秒:"+(end-start));
}
public  void runcode()
     {
    for(int x=0; x<4000; x++)
  {
   System.out.print(x);
  }
  }
}
class SubTime extends GetTime
{
void show()
{
  System.out.println("show  run" );
}
}
class  TemplateDemo
{
public static void main(String[] args)
{
  SubTime gt = new SubTime();
  gt.getTime();
  gt.show();
}
}
/*本例中父类中没有抽象方法,子类只是继承了父类中非抽象方法
而子类中还是可以创建自己的方法,
*/

点评

建议能多些点注释!如果只贴代码很多人看不明白!  发表于 2012-8-1 13:23
回复 使用道具 举报
之所以把一个类声明为abstract,是因为想通过这个简单的声明方式使这个被声明的类不能被实例化,也就是说使任何人都不能在这个抽象类上使用new来实例化对象。

楼上说的Adapter应该是接口,指定了一个规范,不是这个范畴
回复 使用道具 举报
陈淑飞 发表于 2012-7-31 17:09
可以继承,这个用法在API中有个很显然的地方就是 事件监听机制中的Listener与Adapter的用法,
当Listener ...

厉害······
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马