14、抽象类

java 第四大特征 抽象性(abstract 关键字的使用)


一、抽象类

概念:有时将父类设计得非常抽象,以至于没有具体的实例,这样的类叫做抽象类


二、abstract 关键字的使用

abstract 可以用来修饰的结构:方法,类

abstract 修饰类 (抽象类)

  • 此类不能被实例化
  • 抽象类中一定有构造器,便于子类对象实例化时调用(涉及子类对象实例化的全过程)
  • 开发中 ,都会提供抽象类的子类 ,让子类对象实例化 ,完成相关操作

abstract 修饰方法 (抽象方法)

  • 即只有方法的声明,没有方法体
  • 包含抽象方法的类一定是抽象类(防止创建方法后,调用抽象方法),反之,抽象类中不一定要有抽象方法
  • 若父类是抽象类,且含有抽象对象,则子类中必须重写这些抽象对象

三、abstract 使用上的注意点:

abstract 不能修饰:属性、构造器、代码块等结构

abstract 不能修饰私有方法(私有方法不能被重写)、静态方法(静态方法不能被覆盖) 被final 修饰过的类和方法


四、抽象类的匿名子类

  • 匿名对象
methodA(new OrderA());
  • 非匿名的类 非匿名对象
OrderB o1 = new OrderB();
methodB(o1);
  • 匿名对象 非匿名的类
methodB(new OrderB());
  • 匿名的类 匿名的对象
Order o2 = new Order(){
//创建了一个匿名子类的对象

//注意重写抽象方法
    @Override
    public void eat() {}
};//注意分号
        methodA(o2);

五、完整示例

1、示例1

public class AbstractTest {
    public static void main(String[] args) {
        //Person p1 = new Person();
        //报错,Person被abstract修饰,不能被实例化


    }
}
abstract class Person{
    String name;
    int age;

    //构造器
    public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //抽象方法
    abstract public void eat();
    public void walk(){
        System.out.println("走路");
    }
}

class Student extends Person{
    public Student(String name,int age){
        super();
    }
    public void eat(){//

    }
}

2、示例2

public class ProsenTest {
    public static void main(String[] args) {
        //匿名对象
        methodA(new OrderA());

        //非匿名的类 非匿名对象
        OrderB o1 = new OrderB();
        methodB(o1);

        //匿名对象 非匿名的类
        methodB(new OrderB());

        //匿名的类 匿名的对象
        Order o2 = new Order(){
            //创建了一个匿名子类的对象

            //注意重写抽象方法
            @Override
            public void eat() {

            }
        };//注意分号
        methodA(o2);

    }
    public static void methodA(Order o){
        o.eat();
    }
    public static void methodB(OrderB o){
        o.eat();
        o.sleep();
    }

}
abstract class Order{
    public Order() {
    }

    public abstract void eat();//注:抽象方法没有方法体
}
class OrderA extends Order{
    @Override
    public void eat() {

    }
}
class OrderB extends Order{
    @Override
    public void eat() {

    }

    public void sleep(){
        System.out.println("睡觉");
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值