zoukankan      html  css  js  c++  java
  • 【JAVA】抽象类

    一、什么是抽象类

      用abstract修饰的类就是抽象类。抽象类中可以有用abstract修饰的抽象方法,也可以没有抽象方法。

    二、为什么要设计抽象类

      在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类应该如何实现这些方法,于是就定义一些抽象方法,抽象方法是没有方法体的,没有具体的实现,必须要由子类来重写这个方法。例如有个Animal类,它有一个方法eat(),但是不同的动物进食的方式是不同的,所以Animal无法准确知道其子类怎么进食。 那有人会有疑问了,如果父类不知道怎么实现,就不要管这个方法了,让子类自己去扩展好了。但这样会存在一个问题,如果变量的引用类型是父类Animal,实际指向的是子类Dog的实例,那这个类没法调用eat()方法了。

    三、抽象类的特征

    • 抽象类必须要用abstract来修饰。
    • 抽象类可以向普通类一样来定义Field、方法(包括普通方法和抽象抽象方法)、构造器、初始化块、内部类。抽象类的构造器只是用于被子类调用,抽象类本身是不可以创建实例的。
    • 含有抽象方法的类只能被定义成抽象类。
    package abstractClass;
    
    public abstract class Shape {
    
        {
            System.out.println("执行shape的初始化块。");
        }
            
        public Shape()
        {
            System.out.println("shape的无参构造器");
        }
        public Shape(String color)
        {
            System.out.println("shape的有参构造器");
            this.color = "red";
        }
        private String color;
        
        public static String desc = "shape";
        
        public String getColor() {
            return color;
        }
        public void setColor(String color) {
            this.color = color;
        }
        public abstract double calPerimeter();
        
        public abstract String getType();
        
    } 

      上面定义了一个抽象类Shape,再定义一个它的子类Circle,Circle是一个普通类,必须实现Shape中的所有抽象方法。

      

    package abstractClass;
    
    public class Circle  extends Shape{
    
        private double radius;
        public Circle(String color, double radius)
        {
            super(color);
            this.radius = radius;
        }
        
        
        public double getRadius() {
            return this.radius;
        }
    
        public void setRadius(double radius) {
            this.radius = radius;
        }
    
        @Override
        public double calPerimeter() {
            return 2 * Math.PI * radius;
        }
    
        @Override
        public String getType() {
            return getColor() + "圆形";
        }
        public static void main(String[] args) {
            Shape s = new Circle("黄色", 3);
            System.out.println(s.getType());
            System.out.println(s.calPerimeter());        
        }
    
    }

      上面的main方法中申明了一个对象s,引用类型是Shape,实际指向的是Circle对象,因为Shape中定义了getType()calPerimeter()方法,所以在运行的时候程序可以直接调用s变量中的getType()和calPerimeter()方法,无需进行强制类型转换。

      利用抽象类和抽象方法,我们可以更好地发挥多态的优势,是程序更加灵活。

    四、abstract不能和final、static、private修饰符共存来修饰方法

      abstract修饰的方法是要被子类重写的,如果一个方法是final的,那这个方法就不能被重写,所以abstract和final不能共存。

      如果一个方法是static修饰的,那么就可以通过类名来直接调用,但是抽象的方法是没有方法体的,这样就会引发错误,所以abstract和static不能共存。

      如果父类的方法是private修饰的,那么这个方法是不能被子类访问的,更不谈重写了,所以abstract和private不能共存。

    五、抽象类的作用

      抽象类是从多个具有相同特征的类中抽象出来的一个类,这个抽象类作为父类被继承,其实是子类的一个模板,避免了子类设计的随意性。

      抽象类是模板设计的一种体现,子类在抽象类的基础上进行扩展。

      

  • 相关阅读:
    TextBox类的成员
    【VB.Net】字节数与字符数的取得
    限制文本框的输入类型
    【转】FxCop 设计规则
    【Spread Sheet 应用(三)】Enter移向下一个单元格
    【ASP.NET】打开关闭新窗体
    常用字符对应ASCII码值
    初识CodeSmith分享两个模板
    【VB.NET】自定义控件(一)属性说明
    LeetCode: Length of Last Word
  • 原文地址:https://www.cnblogs.com/sister/p/4709553.html
Copyright © 2011-2022 走看看