`
seara
  • 浏览: 639918 次
  • 性别: 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开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    Java面向对象(高级)- 抽象类与抽象方法(或abstract关键字)

    【Java面向对象(高级)- 抽象类与抽象方法(或abstract关键字)】 在Java编程语言中,面向对象编程是其核心特性之一。抽象类和抽象方法是面向对象编程中的重要概念,它们允许程序员创建一种通用的模板,用于定义一...

    JAVA抽象类和抽象方法(abstract)实例分析

    抽象类是指使用abstract关键字修饰的类,抽象类中的方法可以是抽象的,也可以是具体的。抽象类的主要作用是将父类的某些方法不确定时,可以用abstract关键字来修饰该方法,使其成为抽象方法。抽象类也可以包含具体的...

    abstract抽象类

    在Java编程语言中,`abstract`关键字用于定义抽象类(abstract class),这是一个非常重要的概念,它为多态性提供了基础。抽象类是不能被实例化的,它们的主要目的是作为其他类的基类,提供一个公共的接口或者部分...

    Java相关知识点的学习(抽象类)

    1. 抽象类和抽象方法一定要使用abstract关键字。 2. 抽象类中不一定有抽象方法。 3. 没有抽象方法的抽象类的存在意义是什么? --&gt;抽象类不能被实例化,不让外界创建对象。 4. 抽象类虽然不能被实例化,但是我们可以...

    abstract抽象类--Eclipse

    在Java编程语言中,"abstract"关键字用于定义抽象类,这是一种特殊的类,它不提供具体的实现,而是作为其他类的模板或蓝图。Eclipse是一款强大的集成开发环境(IDE),广泛用于编写Java应用和其他编程语言的代码。在...

    Java中抽象类使用.pdf

    abstract 关键字是定义抽象类和抽象方法的关键字,它可以帮助开发者更好地理解和使用抽象类。 在 Java 中,抽象类和抽象方法的使用非常广泛,它们是 Java 编程语言的基本组成部分。通过使用抽象类和抽象方法,...

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

    如果一个类包含一个抽象方法,那么该类必须被声明为抽象类,使用`abstract`关键字修饰。抽象类的主要目的是定义一个接口或者模板,它的子类可以根据需要进行具体的实现。例如: ```php abstract class Abstract...

    Java面向对象课抽象类和接口PPT教案学习.pptx

    * 抽象类是使用 abstract 关键字修饰的类,抽象类中可以包含抽象方法和非抽象方法。 * 抽象类不可以实例化,即不能使用 new 关键字创建抽象类的对象。 * 如果一个类继承了抽象类,必须重写其抽象方法(除非该类也...

    C#中abstract继承抽象类

    在C#编程语言中,`abstract`关键字是用来定义抽象类和抽象方法的,这是一种面向对象编程的概念。本文将深入探讨C#中`abstract`关键字的使用、抽象类的特性以及如何继承抽象类。 首先,我们需要了解什么是抽象类。...

    Java抽象类和抽象方法

    在深入探讨Java抽象类与抽象方法之前,...通过定义抽象类和抽象方法,可以构建出更加灵活和可扩展的代码结构,使得代码更易于维护和扩展。理解并掌握抽象类和抽象方法的使用,对于成为一名优秀的Java开发者至关重要。

    java 抽象类与接口的练习

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,供其他类去实现或继承。在这个练习中,我们将深入理解这两种机制,并通过实际的代码示例和注释来加深理解。 首先,让我们讨论...

    C#抽象类与抽象方法

    当你创建一个抽象类时,通常是因为你想要定义一个通用的模板,而这个模板的部分细节将在特定的派生类中完成。抽象类可以用`abstract`关键字来标记,如`abstract class MyClass`。抽象类可以包含抽象方法、非抽象方法...

    Java 接口和抽象类

    在 Java 中,抽象类使用 abstract 关键字声明。 在上面的练习中,我们使用抽象类来编写 Java 程序。首先,我们创建了一个名为 LivingThing 的抽象类,该类表示生物类。然后,我们创建了两个具体实现类:Human 和 ...

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

    - 一个类如果有至少一个抽象方法,那么该类必须声明为抽象类,使用`abstract`关键字修饰,如`abstract class AbstractClass {}`。 - 抽象类不能被实例化,只能作为其他类的基类。如果一个类继承了抽象类,且不声明...

    抽象类与适配器模式

    在Java中,抽象类是通过使用`abstract`关键字来标识的。下面将详细讨论抽象类的特点和使用。 1. **抽象方法与抽象类**: - **抽象方法**:抽象方法是一个只有声明没有具体实现的方法,它以分号结尾,没有大括号...

    Java实例化一个抽象类对象的方法教程

    由于抽象类自身不能被实例化,这意味着你不能使用`new`关键字直接创建一个抽象类的对象。然而,尽管不能直接实例化,抽象类在特定情况下依然可以间接地创建对象。以下将详细介绍如何在Java中处理抽象类实例化的问题...

Global site tag (gtag.js) - Google Analytics