`
seara
  • 浏览: 623999 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml"> <!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; layout-grid:15.6pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

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

看如下代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->abstractclassClass1
{
abstractvoidmethod();
}

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


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->classClass1
{
abstractvoidmethod();
}

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

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


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->interfaceMyInterface
{
publicvoidmethod1();
publicvoidmethod2();
}
abstractclassMyClassimplementsMyInterface
{
publicvoidmethod1()
{

}
}

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

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


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->interfaceMyInterface
{
publicvoidmethod1();
publicvoidmethod2();
}
classMyClassimplementsMyInterface
{
publicvoidmethod1()
{

}
}

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

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

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

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




国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    PHP 抽象方法与抽象类abstract关键字介绍及应用

    PHP 抽象方法与抽象类 abstract 关键字 abstract 关键字用于定义抽象方法与抽象类。...抽象类不能产生实例对象,通常是将抽象方法做为子类方法重载的模板使用的,且要把继承的抽象类里的方法都实现。实际上抽象

    抽象类和接口的区别

    抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。 抽象类不一定必须含有抽象方法。比如: 复制代码 public abstract class Dog { //普通方法 void ...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    如果在抽象类中存在有参构造方法,则必须在子类中明确的使用super([参数列表])指明要调用父类中的哪个构造方法. 这里举例如下: view plaincopy to clipboardprint? abstract class Person { // 应该有姓名和...

    深入解析C#中的abstract抽象类

    通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。例如: public abstract class A { // Class members here. } 抽象类不能实例化。抽象类的用途是提供一个可供多个派生类共享的通用基类定义。例如,...

    abstract class

    abstract class 抽象类--不具体的类 1) 抽象方法,只有行为的概念,没有具体的行为实现。 2) 包含抽象方法的类,就一定是抽象类。 使用: abstract 关键字修饰,包含抽象方法。 如:平面图形一定可以计算面积。 ...

    设计一个抽象类图形类,在该类中包含有至少两个抽象方法求周长和求面积,分别定义圆形类、长方形类、正方形类、三角形类来继承图形类,并实现上述两个方法

    设计抽象类 就要使用abstract关键字,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。 子类中利用extends关键字,对父类进行继承下面的代码就是四个图形对shape类进行继承。在...

    Java抽象类.pdf

    Java中抽象类是指用abstract关键字修饰的类,它不能被实例化,只能被继承。抽象类通常用于定义一些公共的方法和属性,但是这些方法没有具体的实现。子类必须重写抽象类中的所有抽象方法才能被实例化。 抽象类是Java...

    面向对象程序设计与实践-Java抽象类和接口[33页].pptx

    如果一个类含有抽象方法,则这个类也必须定义为抽象类,抽象类必须在类前用abstract关键字修饰。 例如,将Pet类中的两个方法定义为抽象方法 public abstract void enjoy(); //将enjoy定义为抽象方法 public abstract...

    详解PHP的抽象类和抽象方法以及接口总结

    2、抽象类必须加上abstract关键字修饰; 抽象方法: 定义:一个方法如果没有方法体,则这个方法就是抽象方法 1、一个方法没有方法体,直接用分号结束的方法; 2、如果是抽象方法,必须使用abstract抽象关键字形容 ...

    深入解读php中关于抽象(abstract)类和抽象方法的问题分析

    我们在类里面定义的只有方法名没有方法体的方法就是抽象方法,所谓没有方法体就是在方法声明的时候没有大括号以及其中的内容,而是直接声明时在方法名后加上分号结束,另外在声明抽象方法时还要加一个关键字”...

    php中的抽象方法和抽象类

    只要一个类里面有一个方法是抽象方法,那么这个类就定义为抽象类,抽象类也要使用“abstract”关键字来修饰;在抽象类里面可以有不是抽象的方法和成员属性,但只要有一个方法是抽象的方法,这个类就必须声明为抽象类...

    PHP中抽象类和抽象方法概念与用法分析

    所以如果定义抽象类首先定义抽象方法。 abstract class class1{ abstract function fun1(); …… } 1、类中至少有一个抽象方法 2、抽象方法不允许有{ } 3、抽象方法前面必须要加abstract 三、抽象类和方法使用...

    AbstractTest.java帮助理解多重继承、抽象方法重写调用、super、this关键字、构造方法、重载知识点

    定义抽象类以及抽象方法,构造方法,将子类1定义为抽象类,子类2继承子类1,子类2重写抽象方法。用以帮助理解多重继承、抽象方法重写调用、super、this关键字使用、构造方法、重载这几个的知识点

    PHP 面向对象程序设计(oop)学习笔记(一) – 抽象类、对象接口、instanceof 和契约式编程

    1、PHP中的抽象类 PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。...使用 abstract 关键字定义抽象方法。抽象

    php抽象方法和抽象类实例分析

    在类里面定义的没有方法体的方法就是抽象方法,在方法声明的时候没有大括号以及其中的内容,另外在声明抽象方法的时候,还要加上关键字abstract来修饰。 例如: abstract function fun1(); abstract function fun2...

    ImportDemo.7z

    抽象方法必须定义在抽象类中,抽象类也可以定义非抽象方法。 这个是Virtual关键字的总结 1.重写父类,覆盖父类,让子类重新定义。 2.父类生成虚拟类,子类可以实现,也可以不实现。 3.Virtual关键字不可以和...

    轻松学习C#的抽象类

    在C#语言中有一种特殊的基类,那就是抽象类。有时候,基类并不与具体的事物联系,而是只是表达一种抽象的概念,用于为它的派生类提供一个公共的界面。... 抽象类使用abstract修饰符,对抽象类的使用有几点规定:

    抽象、多态、继承.zip

    java语言中,用abstract 关键字来修饰一个类时,这个类叫做抽象类 简单来说,多态是具有表现多种形态的能力的特征 同一个实现接口,使用不同的实例而执行不同操作 子类继承了父类,就继承了父类的成员方法和属性。 ...

    php抽象类和接口知识点整理总结

    没有方法体的 、使用abstract 关键字修饰 abstract function say(){ 这个不是、有方法体{}, }; } 总结 1.声明一个方法不使用{},而直接分号结束。2.如果是抽象方法,必须使用abstract(抽象 关键字来修饰)。 二、

Global site tag (gtag.js) - Google Analytics