专栏首页Linux驱动9.JAVA-抽象类定义

9.JAVA-抽象类定义

1.抽象类

  • 抽象类,用来表示一个抽象概念.
  • 是一种只能定义类型,而不能产生对象的类,所以定义了抽象类则必须有子类的出现.
  • 抽象类的好处在于能够明确地定义子类需要覆写的方法
  • 抽象类需要使用abstract声明.
  • 抽象类里可以实现抽象方法,该方法特征在于:只有声明,并没有方法体(所以子类必须全部覆写,并且子类不能为抽象类)

比如图形(Shape)类, 就是一个抽象的概念,因为我们无法计算这个“图形”的面积,所以它的成员函数area()是空的。

而继承它的子类(矩形,椭圆形,三角形等)就可以去覆写area()成员函数. 里面通过数学公式,计算出面积.

参考图形(Shape)类,代码如下:

abstract class Shape       //抽象的图形类
{
         abstract public double area();        //abstract修饰的方法为抽象方法,无需实现方法体.但是必须被子类覆写
}

class Ellipse extends Shape    //椭圆类
{

         private double wr;  //椭圆的半径宽度
         private double hr;  //椭圆的半径高度

         public Ellipse(double wr,double hr)
         {
                  this.wr = wr;
                  this.hr = hr;
         }


         public double area(){
                  return 3.14159*wr*hr;
         }
}


public class Test{

         public static void main(String args[])
         {
                  //Shape s = new Shape();                //如果定义抽象类,则将会报错

                  Ellipse e = new Ellipse(2.5,1);
                  System.out.println("Ellipse area = "+e.area());
         }
}

需要注意的是:

  • 抽象类可以存在构造方法,用来初始化抽象类的属性,
  • 抽象类不能使用final定义,

2.抽象内部类定义

在java中,如果我们抽象类的子类只有一个的话,则可以将它封装为抽象内部类里,从而为用户隐藏了这个无需知道的类.在类库中很常见.

示例如下:

abstract class A       //抽象类
{

         abstract public void printData();//abstract修饰的方法为抽象方法,无需实现方法体.但是必须被子类覆写

         static private class B extends A      //需要在抽象类里隐藏的内部类
         {
                   private int Data=12;     
                   public void printData()
                   {
                          System.out.println("B Data:"+this.Data);       //打印内部类的Data值
                   }
         }

         static public A getInstance()           //获取实例
         {
                  return new B();                 //通过静态方法来获取要隐藏的静态抽象内部类  (静态方法里只能使用静态变量)
         }
}

public class Test{
         public static void main(String args[])
         {
                   A a = A.getInstance();
                   a.printData();                           //等价于: A.getInstance().printData();
         }
}

打印如下:

抽象类缺点:

  • 由于Java的单继承,每个类只能从一个抽象类继承.没有接口灵活.

下章学习: 10.JAVA-接口、工厂模式、代理模式、详解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速排序(详解)

    描述: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序...

    张诺谦
  • 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: ? 1.1我们以上图的read id(读ID)为例,它的时序图如下: ? 首先需要...

    张诺谦
  • 6.AVCodecContext和AVCodec

    AVCodecContext 结构表示程序运行的当前 Codec 使用的上下文,着重于所有 Codec 共有的属性(并且是在程序运行时才能确定其值)和关联其他结...

    张诺谦
  • HTTP服务器Nginx服务介绍续

    在此之前也介绍过相关的内容与安装过程,介于实际生产运维环境中使用之多,还是有必要详细了解和理解它的一些强大的功能与特性。

    民工哥
  • Leetcode No.62 不同路径

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

    week
  • 程序员过关斩将--少年派登录安全的奇幻遐想

    说到登录,无人不知无人不晓。每一个有用户体系的相关系统都会有登录的入口,登录是为了确认操作人的正确性。说到登录安全,其实是一个很伟大的命题,不过常用的手段也不过...

    架构师修行之路
  • 一个命令,让你的网站支持https

    最近写小程序,但是小程序的接口得通过https的形式访问,所以用nginx转发了一下。想到Google搜索引擎会提高https网站的权重,索性把我的网站改造成同...

    Java识堂
  • 使用位运算处理一道难题:获取所有钥匙的最短路径

    今天分享的题目来源于 LeetCode 第 864 号问题:获取所有钥匙的最短路径。题目难度为 Hard,如果不借助 位运算 来处理,那它的解法相当繁琐,甚至需...

    五分钟学算法
  • linux下的文本查找技巧,你掌握了吗?

    之前介绍过很多linux下查找相关的命令,例如《Linux中的文件查找技巧》,《find命令高级用法》,《如何查看linux中文件打开情况》等等,而对文件内容搜...

    编程珠玑
  • 写给刚入门的前端工程师的前后端交互指南

    作为刚接触前端的不久的童鞋,大家都会兴奋于CSS和JS所带来漂亮界面,然而,前端工程师除了UI重构外,还有非常重要的职责在正确的区域渲染出服务端的数据。毕竟,...

    用户1667431

扫码关注云+社区

领取腾讯云代金券