抽象类和接口


抽象类和接口

作用:是为了增强多态 为了增强动态绑定 为了方法重写而设计的

抽象类的定义:

1、通过abstract关键字来修饰类,抽象类不能完成实例化,不能自己去new,而且一定是父类,一定是给子类继承的,通过子类来完成实例化。

2、抽象类可以拥有自己的构造函数,给子类调用完成依赖的。

3、抽象类可以没有抽象方法,但有抽象方法的类一定是抽象类。

4、抽象类可以有实例方法和静态方法,可以有方法的实现

5、一个子类继承了抽象父类,如果没有实现父类的抽象方法,那么这个子类是抽象类。

     一个子类继承了抽象父类,可以不实现父类的抽象方法,也可以实现父类的抽象方法。

public abstract class Model {

    //抽象类中可以有自己的构造函数
    public Model(){}

    //抽象类中可以有实例方法
    public void check(){
        System.out.println("正在检查...");
    }

    //抽象类中可以有类方法
    public static void Wang(){
        System.out.println("正在检查...");
    }
    
    public static void setMsg(){}

    //定义一个抽象方法 抽象方法没有方法体{ } 等同于Python中的pass
    public abstract  void getMsg();

    //public abstract static void checkStatic();    不能加static 加了则爆红
}

正常的使用:

public abstract class Animal {
    public abstract void ect();
    public abstract void run();
}



public class Dog extends Animal{
    @Override
    public void ect() {
        System.out.println("吃骨头");
    }

    @Override
    public void run() {
        System.out.println("追耗子");
    }
}
public abstract class Animal {
    public abstract void ect();
    public abstract void run();
}



class Dog extends Animal{
    @Override
    public void ect() {
        System.out.println("吃骨头");
    }

    @Override
    public void run() {
        System.out.println("追耗子");
    }

    public static void main(String[] args) {
        //Animal animal=new Animal();  抽象类自己不能实例化 爆红
        Animal animal=new Dog();    //可以一个父类指向一个子类  动态绑定
        //增强方法重写
        animal.ect();   //吃骨头
        animal.run();   //追耗子
    }
}

在实现接口的时候,也要注意一些规则:

  • 一个类可以同时实现多个接口。
  • 一个类只能继承一个类,但是能实现多个接口。
  • 一个接口能继承另一个接口,这和类之间的继承比较相似。
public interface Animal {
    public final static String name="Tom";  //不写也是默认final以及static

    public void eat();  //默认自带abstract
    public void travel();
}

//一个类只能有一个父类,但是可以实现多个接口
public class Cat  implements Animal{

    @Override
    public void eat() {
        System.out.println("猫咪吃鱼");
    }

    @Override
    public void travel() {
        System.out.println("猫咪 travel");
    }
}

接口和抽象类的区别