唠唠SE的面向对象-08——抽象类

8. abstract抽象类

动物到底是什么样的?根本没法实例化出来!所以要使用抽象类。

当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。

一开始,我们先把上一节的Animal类给变成抽象的:

abstract class Animal {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public abstract void eat();
    public abstract void sleep();
    public abstract void say();
}

 

抽象类的特点

1:有抽象方法的类,该类一定是抽象类

2:抽象类中不一定要有抽象方法。

        这段代码就不报错。。。

abstract class Animal {
    public void eat() {
        System.out.println("米西米西,花布拉吉。。。");
    }
}

3:抽象类不能使用new创建对象(先这样理解,但实际不是这样)

        创建对象,使用对象的功能,抽象类的方法,没有方法体。

4:抽象类主要为了提高代码的复用性,让子类继承来使用。

5:编译器强制子类实现抽象类父类的未实现的方法

当然也可以不实现,前提是子类的也要声明为抽象的。

 

抽象的优点

1:提高代码复用性

2:强制子类实现父类中没有实现的功能

3:提高代码的扩展性,便于后期的代码维护

 

  • 抽象类不能创建对象,那么抽象类中是否有构造函数?
    • 抽象类中一定有构造函数。主要为了初始化抽象类中的属性。通常由子类实现或重写。
  • 抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的)。
  • 抽象类可以继承普通类与抽象类。
  • 抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化。

注意一点:final和abstract一定不能同时修饰同一个类。

 

最后,我们把上一节的图形类也抽象出来吧!

abstract class Graph {
    public abstract double getPerimeter();
    public abstract double getArea();
}

class Circle extends Graph {
    private double r;

    public double getPerimeter() {
        return Math.PI * 2 * r;
    }

    public double getArea() {
        return Math.PI * r * r;
    }
}

class Rectangle extends Graph {
    private double width, height;

    public double getPerimeter() {
        return 2 * (width + height);
    }

    public double getArea() {
        return width * height;
    }
}

转载于:https://my.oschina.net/LinkedBear/blog/1615160

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值