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

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

    众所周之,在任何面向对象的语言中(包括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关键字在定义静态类时也就不是必须的了。

转载于:https://www.cnblogs.com/nokiaguy/archive/2008/09/30/1302482.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 播放assets文件里视频文件的问题

今天做了一个功能,就是播放项目工程里面的视频文件,不是播放SD卡视频文件。 因为之前写webview加载assets文件夹时,是这样写的: webView new WebView(this); webView.loadUrl(file:///android_asset/sample3_8.html); 依次类推&a…

转:Firebird 数据访问组件 (Delphi)

转自:http://www.faceker.com/200809/firebird-data-access-components.html 在 Delphi 下可访问 Firebird 数据库的组件非常多,但不管是 CodeGear 还是 FirebirdSQL 都没有推出正式官方的相关驱动和组件,有 Interbase 的存在,想让…

pku 3252 Round Numbers 组合数学 找规律+排列组合

http://poj.org/problem?id3252 看了discuss里面的解题报告才明白的,这个解题报告太强大了:http://poj.org/showmessage?message_id158333不多讲已经很详细了,不明白多看几遍肯定会明白的。 注意这里的公式c(i,j) c(i - 1,j -1) c(i - 1…

《The Coaching Booster》问与答

由Shirly Ronen-Harel和Jens R. Woinowski 编写的《The Coaching Booster》 一书探讨了不同的教练方法和实践,并介绍了一种教练框架,支持教练帮助人们达到他们的目标。\InfoQ 采访了Shirly Ronen-Harel 和 Jens R. Woinowski,谈论了他们的书为…

用一辈子去领悟的生活经典[转帖]

1、说话要用脑子,敏事慎言,话多无益,嘴只是一件扬声器而已,平时一定要注意监督、控制好调频旋钮和音控开关,否则会给自己带来许多麻烦。讲话不要只顾一时 痛快、信口开河,以为人家给你笑脸就是欣赏&#xf…

反射应用和获取Class对象的三种方式

一、写一个“框架”,可以创建任何对象运行任何方法 1、配置文件 2、使用类加载器ClassLoader,Properties集合是可以和IO流结合使用完成读取和写入数据的集合,方法参数列表是IO流; Class类的静态方法forName()创建Class对象&#x…

error: gnu/stubs-32.h: No such file or directory

/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory sudo yum install glibc-devel转载于:https://www.cnblogs.com/greencolor/archive/2012/05/03/2481286.html

Android得到一个闹钟在第三方

收集报警信息 闹铃时间,闹铃备注信息 闹铃引起系统变化的点: 1. Send Notification (正点闹钟能够设置不发送) 2. Play audio 闹铃信息结构体 ClockInfo{ String apkName; String startTime; String backup; } SendNotification SystemUI BaseStatusBar.java 在Base…

ASP.NET_读写Cookie

Cookie (HttpCookie的实例)提供了一种在 Web 应用程序中存储用户特定信息的方法。例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息。当该用户再次访问您的网站时,应用程序便可以检索以前存储的信息。 创建Cookie方法 …

【转】selector函数指针回调机制

selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念。[self performSelector:selector(Hidden) withObject:nil afterDelay:2.8];//2.8秒之后调用selector里面的函数,很好…

8 种有趣的用于 Web 品牌的动物

当 Mozilla 推出最新移动浏览器 Fennec 时,很多人需要借助 Wikipedia 才知道 Fennec 是什么意思,Web 2.0 产品以各种古怪的命名著称,要么非常拗口,象 Flickr,要么很 cute,象 Google,或者干脆不知…

注解使用案例

一、一个简易测试框架: 1、定义Check注解,无需添加属性 2、需要测试的类,添加Check注解 3、测试框架代码: for循环上创建一个文件输出流对象,记录方法测试记录: 捕捉异常: 其中,get…

Java Date Time 教程-时间测量

为什么80%的码农都做不了架构师?>>> 在Java中,用System.currentTimeMillis()来测量时间最方便。你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差。下面是一个例子: 1lon…

Java -- 网络编程(一):Client与Server之间的数据传送

目前对于我这种刚接触网络编程的豆芽来说,对网络编程最直观的了解就是:一些的Client和一个Server端之间的数据传递。具体当然是复杂的,但是那是我以后要学的。 今天我知道了可以通过Socket和DatagramSocket两种套接字来进行Client和Server的链…

企业使用RTX腾讯通2013

2019独角兽企业重金招聘Python工程师标准>>> 腾讯通基本上成为了公司的默认配置,确实缺不了,这里记录一篇配置RTX,包括服务端和客户端。 1.客户端的使用 1.1 一般使用人员不需要关心任何事,只需要登录管理员分配给你的…

C++ Primer 第六章 语句

本章内容比较简单,不作过多说明。如果学习过任意一门编程语言可以跳过本章。 转载于:https://www.cnblogs.com/kingcat/archive/2012/05/07/2487764.html

表达式求解

表达式求解问题 第四次数据结构实验: 实验三:表达式求值 实验目的: 1、掌握顺序栈结点类型的定义 2、掌握栈的插入和删除结点操作的特点; 3、熟悉对栈的一些基本操作和具体的函数定义。 代码: 1 /*Status.h 各种常量状…

date()

$ttime(); echo date("Y-m-d H:i:s",$t); 第一个参数的格式分别表示: a - "am" 或是 "pm" A - "AM" 或是 "PM" d - 几日,二位数字,若不足二位则前面补零; 如: "01" 至 "31" D -…

Absolute C++ Chapter 3 Self-Test Exercise(3)

15. Hello Goodbye One more time Hello End of program 16. It will occur an error only there is 0 person to divide to ice-cream. 17. #include<iostream> using namespace std; void product(int num1,int num2,int num3); int main() {  cout<<"Gi…

棍子节快乐~ 顺便转一篇weka源码分析解析~【转自weka中文网】

经常看到有人问&#xff0c;我想修改Weka里面的算法&#xff0c;我想把Weka的算法加到我自己的程序里面去&#xff0c;但是我该从哪里着手呢&#xff1f;于是&#xff0c;这篇帖子就有必要出现了。但是&#xff0c;这个题目太大了&#xff0c;Weka里面有那么多代码呢&#xff0…