这节课开始我们开始讲抽象类
首先,什么是抽象类?
抽象类就是被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("大鱼吃小鱼,小鱼吃虾米");
}
}
}