Java基础系列2:抽象类

作者: OwenCan | 来源:发表于2019-08-22 10:30 被阅读1次
    • 抽象类:在面向对象中,所有的对象都是通过类来描述,但是反过来,并不是所有的类都用来描述对象。如果一个类没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
    • 抽象类不能实例化对象,必须被继承后才能使用。抽象类也是类,包含成员变量,成员方法和构造方法的访问方式,和普通类一样。
    抽象方法
    • 类包含一个特别的成员方法,具体实现由子类实现,那么父类声明方法为抽象方法即可。
    public abstract class demo{
        private String name;
    
        public abstract int quantity();
    }
    
    声明抽象方法会造成两个结果:
    • 如果一个类包含抽象方法,那么该类必须是抽象类。
    • 任何子类如果重写父类的抽象方法,必须声明自身为抽象类。

    继承抽象方法的子类必须重写该方法,子类也要声明为抽象类。最终,要有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。

    抽象类总结
    1. 抽象类不能被实例化,如果被实例化,会报错,编辑无法通过,只有抽象类的非抽象子类可以创建对象。
    2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
    3. 抽象类中的抽象方法只是声明,不包含方法体。
    4. 构造方法、用static修饰的类方法不能声明为抽象方法。
    5. 抽象类的子类必须给出父类所有抽象法发的具体实现,除非该子类也是抽象类。
    示例

    定义 Shape 类表示一般二维图形。Shape 具有抽象方法 area 和 perimeter,分别计算形状的面积和周长。试定义一些二维形状类(如矩形、三角形、圆形等),这些均为 Shape 类的子类并计算出这些形状的面积和周长,打印输出相关信息。

    //形状类:
    public abstract class Shape {
        public abstract double area();
        public abstract double perimeter();
    } 
    
    //矩形类:
    public class Rectangle extends Shape {
        private double length;
        private double width;
    
        public double getLength() {
            return length;
        }
    
        public void setLength(double length) {
            this.length = length;
        }
    
        public double getWidth() {
            return width;
        }
    
        public void setWidth(double width) {
            this.width = width;
        }
    
        @Override
        public double area() {
            return getLength() * getWidth();
        }
    
        @Override
        public double perimeter() {
            return 2 * (getWidth() + getWidth());
        }
    }
    
    //三角形类:
    public class Triangle extends Shape {
        private double a, b, c;
    
        public double getA() {
            return a;
        }
    
        public void setA(double a) {
            this.a = a;
        }
    
        public double getB() {
            return b;
        }
    
        public void setB(double b) {
            this.b = b;
        }
    
        public double getC() {
            return c;
        }
    
        public void setC(double c) {
            this.c = c;
        }
    
        @Override
        public double area() {
            double p = (getA() + getB() + getC()) / 2;
            return Math.sqrt(p * (p - getA()) * (p - getB()) * (p - getC()));
        }
    
        @Override
        public double perimeter() {
            return getA() + getB() + getC();
        }
    }
    
    //圆形类:
    public class Circle extends Shape {
        private double diameter;
    
        public double getDiameter() {
            return diameter;
        }
    
        public void setDiameter(double diameter) {
            this.diameter = diameter;
        }
    
        @Override
        public double area() {
            return Math.PI * Math.pow(getDiameter() / 2, 2);
        }
    
        @Override
        public double perimeter() {
            return Math.PI * getDiameter();
        }
    }
    
    //测试代码:
    public class Test {
        public static void main(String [] args){
            Rectangle rec = new Rectangle();
            rec.setLength(10);
            rec.setWidth(5);
            double rec_area = rec.area();
            double rec_perimeter = rec.perimeter();
            System.out.println("矩形的面积:"+rec_area+",周长"+rec_perimeter);
    
            Triangle tri = new Triangle();
            tri.setA(3);
            tri.setB(4);
            tri.setC(5);
            double tri_area = tri.area();
            double tri_perimeter = tri.perimeter();
            System.out.println("三角形的面积:"+tri_area+",周长"+tri_perimeter);
    
            Circle cir = new Circle();
            cir.setDiameter(10);
            double cir_area = cir.area();
            double cir_perimeter = cir.perimeter();
            System.out.println("圆形的面积:"+cir_area+",周长"+cir_perimeter);
        }
    }
    

    相关文章

      网友评论

        本文标题:Java基础系列2:抽象类

        本文链接:https://www.haomeiwen.com/subject/wrmgsctx.html