java 抽象类

面向对象编程–抽象类
抽象类是无法实例化的类(我们无法创建抽象类的对象)。在Java中,我们使用abstract关键字声明一个抽象类。
出现抽象类的原因:

  1. 不能够明确 一个类 中的具体设计 是什么样的, 可以考虑设置成抽象类
  2. 不能明确一个方法 应该如何实现(方法没有方法体) ,那么 该方法可以变成 抽象方法 , 那么拥有抽象方法的类必须是抽象类。
  3. 一个类 不想被实例化(不想有对象) 就可以设置成抽象类。
    声明一个抽象类
abstract class 类名{}
  • 抽象类 仅仅不可以实例化,其他的内容与其他的类没有任何区别。
  • 抽象类中存在构造, 仅供 子类调用。
  • 抽象类中可以有抽象方法,也可以有非抽象方法 。
    抽象方法的定义
[修饰符] abstract 返回类型 方法名();

本质就是通过创建 子类的实例 来获取 抽象类的实例 。
常用的获取 抽象类实例的 方式 :

  • 抽象类中的 static 修饰的方法
  • 抽象类子类中的 static 修饰的方法
  • new 抽象类的子类

示例

/**
 * 声明一个抽象类
 */
public abstract class Person {
    private String name ;
    public static final String hometown  ;
    static{
        hometown = "地球" ;
    }
    /**
     * 保证每次调用都返回同一个对象
     */
    public static Person getInstance(){
        return new Hindu();
    }
    /**
     * 抽象类中, 存在构造 , 但是不是让你 用来 实例化的
     * 而是 供 子类使用
     */
    public Person() {
    }
    public Person(String name) {
        this.name = name;
    }
    /**
     * 定义抽象方法
     * 具体用什么工具吃饭 不确定  , 所以将 其方法设置成 抽象方法
     */
    public abstract void eat() ;
    public void sleep(){
        System.out.println( this.name + " 开始睡觉!");
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

//子类继承
/**
 * 两种解决策略 :
 *  1. 子类 也是一个抽象类
 *  2. 实现 父类中的 抽象方法
 */
public class Hindu extends Person{
    /**
     * 实现 父类中的 抽象方法
     */
    @Override
    public void eat() {
        System.out.println( this.getName() + " 用手抓着吃饭 ");
    }
    public static Hindu getInstance(){
        return new Hindu() ;
    }
}

//主函数测试
public class TestAbstract {
    public static void main(String[] args) {
        /* 父类 引用 指向 子类对象 (多态) */
        Person person = new Hindu() ;
        person.eat();

        // Peason的静态方法(static 修饰的方法) 来获取 抽象类的对象
        // Person.getInstance() 中依旧是 new Hindu()
        Person person1 = Person.getInstance();
        person1.eat();

        // 使用 Peason子类的静态方法来获取
        // Hindu.getInstance() 中依旧是 new Hindu()
        Person person2 = Hindu.getInstance() ;
        person2.eat();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值