面向对象(七)——抽象类

这节课开始我们开始讲抽象类

 

首先,什么是抽象类?

       抽象类就是被abstract关键字修饰的类,这样的类无法被直接new出实例。

 

抽象类的几个特征:

       可以有抽象方法(由abstract修饰的没有方法体的方法)

       若一定要new出实例则需要通过匿名内部类的方式实现所有抽象方法

       不被abstract修饰的类叫实体类

       抽象类的子类可以是抽象类

       若一个实体类继承了一个抽象类,则这个实体类必须重写(实现)抽象类中所有的抽象方法

 

匿名内部类:

       通过 new ClassName(){}来声明

       声明即是定义,作用为创建一个对象并返回对象的地址

       这种写法只能被写在其他类里,不能写在类外,所以叫内部类

       这种类没有自己的名字,所以叫匿名内部类

 

内部类:

       类中可以继续定义类,定义在类里的类就叫内部类

 

抽象类的作用:

       可以将一些类的共同特征提取出来,放到一个公共的抽象类中,然后其他类来继承这个抽象类

 

为什么需要抽象类:

       因为有些方法需要是抽象方法,同时抽象类提供了一种规范,那就是抽象类的子类必须要实现抽象类里的抽象方法,这一点对于多人团队开发或者项目构建及其重要

 

Demo:

 

public class AbstractClassTeach {

    public static void main(String[] args) {
        Animal animal = new Holf();
        animal.eat();

        animal = new Dog();
        animal.eat();

        animal = new Animal() {
            @Override
            public void eat() {
                System.out.println("我是一只猫,我吃鱼");
            }
        };
        animal.eat();

        animal = new Dog.Fish();
        animal.eat();
    }

}

/**
 * 抽象类 动物类
 */
abstract class Animal{
    public abstract void eat();
}

class Holf extends Animal{

    //重写(实现)父类的eat方法
    @Override
    public void eat() {
        System.out.println("狼行千里吃肉");
    }
}

class Dog extends Animal{

    //重写(实现)父类的eat方法
    @Override
    public void eat() {
        System.out.println("狗行千里吃屎");
    }

    /**
     * 为什么前面要加一个static呢
     * 因为我希望这个Fish类可以在任意地方被new出对象
     * 如果不加static就只能在外部类的内部new对象
     */
    static class Fish extends Animal{

        @Override
        public void eat() {
            System.out.println("大鱼吃小鱼,小鱼吃虾米");
        }
    }
}

 

猜你喜欢

转载自blog.csdn.net/qq_40061421/article/details/82897338