zoukankan      html  css  js  c++  java
  • Java——抽象类和抽象方法

      抽象方法和抽象类必须使用 abstract 修饰符来定义,有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法。

    》抽象方法和抽象类的规则如下:

      》抽象类必须使用 abstract 修饰符来定义,抽象方法也必须使用 abstract 修饰符来修饰,抽象方法不能有方法体。

      》抽象方法不能被实例化,实例化的工作应该交由它的子类来完成,它只需要一个引用即可。

      》抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初识化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。

      》含有抽象方法的类(包含直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。

      》abstract 不能与 private、static 、 final 或 native 并列修饰同一个方法

      》abstract 不能与 final 并列修饰一个类

      》子类中的抽象方法不能与父类的抽象方法同名。

      》抽象方法必须由子类来进行重写,否则没有存在的意义。

    》父类
    public abstract class Shape {
    
        private String color;
        
        //定义一个计算周长的抽象方法
        public abstract double calPerimeter();   //抽象方法,不能有方法体
        
        //定义一个返回形状的抽象方法
        public abstract String getType();
    
        
        //定一个Shape 的构造器,该构造武器并不是用于创建Shape 对象
        //而是用于被子类调用
        public Shape() {
        }
        public Shape(String color) {
            System.out.println("执行 Shape 的构造器");
            this.color=color;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
        
    }

    》子类

    public class Triangle extends Shape {
    
        private double a;
        private double b;
        private double c;
        
        public Triangle(String color, double a, double b, double c) {
            super(color);
            this.setSides(a, b, c);
        }
        
        public void setSides(double a,double b,double c){
            if(a>=b+c || b>=a+c || c>= a+b){
                System.out.println("三角形两边之和必须大于第三边");
                return;
            }
            this.a=a;
            this.b=b;
            this.c=c;
        }
    
        //重写父类方法
        @Override
        public double calPerimeter() {
            return a+b+c;
        }
    
        @Override
        public String getType() {
            return "三角形";
        }
    
    }
    public class Circle extends Shape {
        private double radius;
        
        public Circle(String color, double radius) {
            super(color);
            this.radius = 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 double getRadius() {
            return radius;
        }
    
    }

    》测试类

    public static void main(String[] args) {
            
            Shape s1= new Triangle("黑色",3,4,5);
            Shape s2=new Circle("黄色",3);
            
            System.out.println(s1.getType());
            System.out.println(s1.calPerimeter());
            System.out.println(s2.getType());
            System.out.println(s2.calPerimeter());
        }

     注意:abstract 不能用于修饰成员变量,不能用于修饰局部变量,即没有抽象变量、没有抽象成员变量等说法;abstract 也不能用于修饰构造器,没有抽象构造器,抽象类里面定义的构造器只能是普通构造器。

  • 相关阅读:
    Docker优势
    jdk-tomcat-jenkens 安装
    SQL-2--TRIGGER
    边工作边刷题:70天一遍leetcode: day 92
    边工作边刷题:70天一遍leetcode: day 39
    边工作边刷题:70天一遍leetcode: day 96
    边工作边刷题:70天一遍leetcode: day 1
    边工作边刷题:70天一遍leetcode: day 94
    边工作边刷题:70天一遍leetcode: day 95
    边工作边刷题:70天一遍leetcode: day 97
  • 原文地址:https://www.cnblogs.com/szj-ang/p/7295409.html
Copyright © 2011-2022 走看看