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

众所周之,在任何面向对象的语言中(包括Java、C#),在定义抽象类时必须使用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

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

  1. abstract关键字详解

    Abstract关键字详解 abstract关键字,抽象的,修饰类.方法 修饰类: 1)不可被实例化,抽象类只能声明引用,不能创建对象 2)抽象类有构造器 (凡是类都有构造器) 当我们设计一个类,不需 ...

  2. php 抽象类 继承,PHP 抽象类继承抽象类时的注意点

    原标题:PHP 抽象类继承抽象类时的注意点 抽象类继承另外一个抽象类时,抽象类中,不能重写抽象父类的抽象方法.这样的用法,可以理解为对抽象类的扩展. 下面的例子,演示了一个抽象类继承自另外一个抽象类时 ...

  3. 抽象工厂模式 Abstract Factory Pattern

    源地址 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建 ...

  4. 抽象工厂模式-Abstract Factory Pattern

    抽象工厂模式-Abstract Factory Pattern 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽 ...

  5. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  6. 抽象工厂(Abstract Factory)

    4. 抽象工厂(Abstract Factory) Intent 提供一个接口,用于创建 相关的对象家族 . Class Diagram 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并 ...

  7. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  8. java 定义抽象变量_Java抽象类和抽象方法定义与用法实例详解

    本文实例讲述了Java抽象类和抽象方法定义与用法.分享给大家供大家参考,具体如下: 一.Java抽象类 1.抽象类的说明 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都 ...

  9. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

最新文章

  1. 应用在大规模推荐系统,Facebook提出组合embedding方法 | KDD 2020
  2. DeepMind首席科学家:比起机器智能,我更担心人类智能造成的灾难
  3. 如何用 Python 打飞机?
  4. Unsupervised Feature Selection in Signed Social Networks 阅读笔记
  5. CrowdHuman 测试
  6. java基础(网络编程---IP、端口、URL)
  7. Matlab绘制散点图(scatter函数)
  8. 进化计算(八)——MOEA/D算法详解Ⅱ
  9. 雷达测距测速测角基本原理
  10. 班级学生德育量化管理系统_德育积分学分考核系统_学生操行日常行为规范考核系统
  11. 深入浅出java并发编程(线程池)
  12. 【小镇的技术天梯】黑客技术(1) MITM-中间人攻击
  13. 小米无线AR眼镜探索版细节汇总
  14. 计算机二级Ms-Office选择题汇总
  15. pcb 布线电容 影响延时--信号跨分割
  16. 什么是项目管理?项目经理应该如何进行管理?
  17. linux服务器实训心得体会,linux服务器实训心得体会
  18. 负数与正数相乘怎么算_负数乘法_正负符号_两个正负符号的规则_乘法表
  19. word设置奇偶页不同但页码连续
  20. 大一的java考试试题_华南理工大学大一JAVA复习题

热门文章

  1. 网络流--最大流--POJ 1273 Drainage Ditches
  2. [机器学习] LightGBM on Spark (MMLSpark) 使用完全手册
  3. 最小生成树算法讨论(转)
  4. 关于自旋锁的一些文章摘记
  5. HTML DOM节点的属性获取
  6. 图像分类数据库_图像分类器-使用僧侣库对房屋房间类型进行分类
  7. 垃圾邮件分类器_如何在10个步骤中构建垃圾邮件分类器
  8. 联想Z5手机夺得京东销量第一,联想这是要翻盘的节奏吗?
  9. 借钱,一定要有还钱的素质
  10. Rolling Update - 每天5分钟玩转 Docker 容器技术(140)