Java学习之抽象类

抽象类:

  1. 抽象方法和抽象类

  2. 抽象类的作用

当编写一个类的时候,常常考虑为该类定义一些方法,用以描述该类的行为方式,那么这些方法都是具体的方法体,但是在某些情况下,某些父类只知道其子类应该包含怎样的方法,但是无法知道子类如何实现这些方法,这里就出现了抽象类以及抽象方法。

1,抽象方法和抽象类

 

抽象方法和抽象类必须使用abstract修饰符来修饰,有抽象方法的类必须被定义为抽象类,而抽象类里可以没有抽象方法

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

  1. 抽象类和抽象方法都必须使用abstract来修饰,并且抽象方法没有方法体。
  2. 抽象类不能被实例化,无法使用new关键字来调用抽象类构造器创建抽象类的实例,即使抽象类中没有抽象方法,也不能创建实例。
  3. 抽象类中可以包含五种成分,成员变量,方法,初始化块,构造器,内部类。
  4. 包含抽象方法的类只能被定义为抽象类。

 

定义抽象方法只需在普通方法前面加abstract修饰符,然后去掉方法体(就是花括号中的部分)。

看下面的代码:

public abstract class Shape {
    {
        System.out.println("初始化");
    }
    private String color;
    public abstract double calPerimeter();
    public abstract String getType();
    public Shape(){};
    //构造器并不是用于创建shape对象,而是用于被子类调用
    public Shape(String color){
        System.out.println("执行shape构造器");
        this.color=color;
    }
    public void setColor(String color){
        this.color=color;
    }
    public String getColor(){
        return color;
    }
    }

在上面的代码中包含两个抽象方法,calperimeter和gettype,并且shape中包含了初始化块,构造器,这些不是用于创建父类对象,而是在创建子类实例的时候被调用,因为子类继承了父类。

下面定义一个三角形类:

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.setSide(a,b,c);
                    }

                    public void setSide(double a,double b,double c){
                        this.a=a;
                        this.b=b;
                        this.c=c;
    }

    public double calPerimeter(){
               return a+b+c;
    }
    public String getType(){
          return "三角形";
                    }
}

因为三角形类被定义为普通类,所以必须 实现shape中的所有抽象方法

下面再定义一个Triange类继承shape类,并且实现shape类中的抽象方法。

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 static void main(String[] args) {
        Triangle 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());
    }
}

代码编译结果:

初始化
执行shape构造器
初始化
执行shape构造器
三角形
12.0
黄色圆形
18.84955592153876

Process finished with exit code 0
从编译的结果可以看出,在创建子类实例的时候,因为子类对父类实现了继承,所以在父类中的初始化以及构造也运行了,但是这不是对于父类的实例化操作。

优势:利用抽象类和抽象方法能更好实现多态的操作。

2,抽象类的作用:

从上面的实例可以看出,抽象类不能创建实例,只能当作父类来进行继承,所以抽象类被看作是多个类的通用模板,子类在父类上进行扩展,改造。

模板模式在面向对象的软件中很常用,我们来看看他的规则:

  1. 抽象类定义方法,把不能实现的抽象方法留给子类来实现。
  2. 父类中的方法中需要调用其它的方法,这个方法既可以由子类实现也可以是父类实现。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值