为什么要在定义抽象类时使用abstract关键字

转载 2008年09月30日 23:03:00

   众所周之,在任何面向对象的语言中(包括JavaC#),在定义抽象类时必须使用abstract关键字。虽然这已经习已为常了,但实际上abstract是为了在实现接口或继承抽象类避免歧议而必须存在的。

    看如下代码:

abstract class Class1
{
   
abstract void method();
}

    上面的代码是一个典型的抽象类,在定义类时和定义方法时都使用了abstract。但从编译器的角度来说,在定义类时完全可以不使用abstract,如下面的代码所示:


 

class Class1
{
   
abstract void method();
}

    对于上面的代码,编译器在编译时并不会产生奇异,只要检测到类中有一个用abstract关键字的代码,就可以在编译的过程中自动向Class1添加abstract,也就是说,在定义Class1时添加abstract的工作应该由编译器来完成。

    虽然上面的过程看起来没什么问题,也并不难实现,但各位不要忘了,实现抽象类除了上面的方式,还有另外一种方式,这就是实现接口,而并不实现接口中的所有方法。看下面的代码:


 

interface MyInterface
{
    
public void method1();
    
public void method2();
}
abstract class MyClass implements MyInterface
{
    
public void method1()
    {
        
    }
}

    上面代码中MyClass类并未实现method2方法,也并示在定义方法时使用abstract关键字,然后,method2方法实际上就是abstract方法。

   大家可以想象,如果在定义抽象类时不使用abstract关键字会怎么样呢?看下面的代码:


 

interface MyInterface
{
    
public void method1();
    
public void method2();
}
class MyClass implements MyInterface
{
    
public void method1()
    {
        
    }
}

    上面的代码一定会编译出错的,因为编译器蒙了。在面向对象语言中规定,一个普通类必须实现接口中的所有方法。而在上面的代码中,method2方法未实现。而编译器无法判断MyClass类是抽象类,还是普通类。如果按着普通类来处理,则会编译出错,如果按着抽象类来处理,则完全符合面向对象规则。因此,就产生了歧议。当编译器在编译源代码时,一定会产生错误,否则可能会编译成和源代码的含义不同的二进制目标文件。

    当然,上面的代码也可以设置默认的规则,也就是按着普通类处理不通过时,就按着抽象类来处理。但这又会带来另一个问题。如果开发人员忘记实现某个接口的方法,那不是这个类就会被编译器认为是抽象类了吗?因此,为了保险起见,编译器的设计者特意为抽象类指定一个abstract关键字,也就是说,这个类是否是抽象类,应由开发人员通过编码的方式来指定,而不是由编译器自做主张。

    从上面的描述可以看出,加abstract关键字主要是为了避免普通类在实现接口时产生的歧议。如果假设面向对象语言中没有接口,abstract关键字完全可以去掉。当然,继承抽象类也和实现接口类似。

    象面向对象语言中的静态方法很多就没有静态类的概念(Java没有,C#有)。因此,在定义类时加不加static,并不会产生奇异,所以static关键字在定义静态类时也就不是必须的了。

posted on 2008-09-30 14:33 银河使者 阅读(476) 评论(10)  编辑 收藏 所属分类: C# 原创

1302482.html?type=1&webview=1

评论

  2008-09-30 15:13  

为什么要在定义抽象类时使用abstract关键字 ???
-------------------------------------------
这题起的: 为什么接口定义要用 interface?
为什么整型定义要用 int?
噢, 卖羔的~~~           

  2008-09-30 15:49  

为什么吃饭要买米?           

 [楼主] 2008-09-30 17:24  

那为什么定义静态方法不在类前面加static呢?           

 [楼主] 2008-09-30 17:24  

abstract和class以及interface不在同一个层次           

 [楼主] 2008-09-30 17:26  

在类前面加abstract是为了解决语义分析的歧议性问题,想想为什么在定义抽象类时只在方法前加abstract为什么不行,而必须要在class前面加abstract。而定义静态方法时只在方法前加static即可。           

  2008-09-30 17:32  

晕,抽象类可以不写abstract吗?           

 [楼主] 2008-09-30 18:43  

抽象类必须使用abstract,但加abstract是有原因的,如果抽象类不实现接口,从理论上可以不用abstract关键字来修饰class,但如果抽象类实现接口,则必须使用abstract。 正是由于语言中有接口,所有编译器要求抽象类必须使用abstract,而不单单是在方法前面加abstract。 否则会产生歧议。           

  2008-09-30 20:45

赶紧转到新手区,小心被拍死         

 [楼主] 2008-09-30 21:10  

现在研究编译原理,本想将abstract关键字去了,但经过考虑,还是不能去,加abstract关键字是有道理地。哈哈!难道各位没想过这个问题??           

 [楼主] 2008-09-30 21:20  

谁都知道在定义抽象类时要在抽象方法和类前都加abstract,但类前面为什么必须加一个abstract关键字呢?而在定义静态方法时,为什么不必须在类前面加个static呢?编译器的设计者为什么会这样设计语法,为什么不把抽象类前面的abstract关键字去了?这样启不是语法更简捷!! 任何结果都是有原因地,本文就是阐述了这个原因(也许只是原因之一)。
本文并不是讨论抽象类加不加abstract,而是讨论这样设计语法的原因,各位不要误会。每个人都知道苹果熟了要自己落下来,但只有牛顿一人问了为什么。万有引力就这么被发现了。哈哈!           

Java关键字之abstract(抽象类的概念和使用)

1、概述 (1)只给出方法定义而不具体实现的方法被称为抽象方法,抽象方法是没有方法体的,在代码的表达上就是没有“{}”。使用 abstract 修饰符来表示抽象方法和抽象类。 (2)abstrac...
  • eff666
  • eff666
  • 2016年08月26日 08:59
  • 4926

Java之抽象类(abstract关键字)

abstract关键字: 1)用abstract关键字修饰一个类时,这个类叫做抽象类;用abstract关键字修饰一个方法时,这个方法叫关键方法; 2)含有抽象方法的类必须被声明为抽象类,抽象类必...
  • Jarvenman
  • Jarvenman
  • 2017年01月20日 13:31
  • 972

抽象类abstract详解

定义 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则变得更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计的非常抽象,以至于他没有具体的实例,这样的类叫做抽...
  • u010892841
  • u010892841
  • 2016年05月10日 19:50
  • 1252

abstract和那些关键字不能共存

abstract和那些关键字不能共存?      fianl:首先abstract修饰的类,该类中的方法子类继承之后需要重写的,可是final修饰的           类不能比继承,也就没子类,...
  • heimanba999
  • heimanba999
  • 2016年01月04日 17:59
  • 677

在vb.net中使用抽象类

原文:http://www.yesky.com/401/207901.shtml  通过VB.NET,VB程序员终于拥有了全部面向对象的特征.其中之一就是程序员以创建抽象类.虽然抽象类在编程中的作用...
  • a316212802
  • a316212802
  • 2014年12月23日 10:24
  • 863

abstract(抽象) 的应用场景和需要注意的细节

抽象类的应用场景 抽象类要注意的细节:
  • dh1221
  • dh1221
  • 2015年05月20日 22:08
  • 1816

抽象方法的成员方法,成员变量abstract的使用,以及其概述

/* 抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。 抽象类的特点: A:...
  • qq_28483283
  • qq_28483283
  • 2016年03月09日 22:29
  • 4118

abstract不可以和哪些关键字共存

private: abstract是表明希望被覆盖的,但是private,子类看不到。 static: 如果是static就需要创建对象 但abstract不需要创建对象(没有意义) fin...
  • qq_29842929
  • qq_29842929
  • 2016年12月09日 11:29
  • 967

java中抽象类(abstract class)和接口(interface)

抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。反之,一个全部实现了的类...
  • u010575093
  • u010575093
  • 2016年02月24日 15:38
  • 643

Java开发手册 学习1:抽象类命名使用 Abstract 或 Base 开头

重温抽象类的概念  我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支...
  • l675015956l
  • l675015956l
  • 2018年01月19日 20:34
  • 47
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么要在定义抽象类时使用abstract关键字
举报原因:
原因补充:

(最多只允许输入30个字)