• 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-接口、工厂模式、代理模式、详解

  • 相关阅读:
    Redmine-java-api使用
    Junit4 基于 custom Rule retry
    Extentreports在安卓中的应用
    uiautomator 2.0 自定义testrunner使用
    uiautomator 启动原理
    uiautomator 自定义注解的应用
    uiautomator 原理 (UiAutomation、UiAutomatorBridge、QueryController)
    uiautomator 自定义testrunner使用和启动原理
    HeadFirstPython-文件与异常
    HeadFirstPython-初识python
  • 原文地址:https://www.cnblogs.com/lifexy/p/10826817.html
Copyright © 2020-2023  润新知