Java抽象类和接口

欢迎关注我的公众号【软件大爆炸】
Java学习中的碎碎念
Java中易忽略的基础知识
Java面向对象基础
Java中的核心类
Java抽象类和接口
Java中的异常
Java中的泛型与集合
关于抽象类

  • 抽象类和抽象方法必须使用 abstract 关键字来修饰。
public abstract class AnimalAbstractDemo {//abstract放在class前
    abstract void run();//abstract放在返回类型之前
}
  • 有抽象方法的类只能被定义成抽象类,但抽象类中可以没有抽象方法。
//worong demo
public class AnimalAbstractDemo {//abstract放在class前
    abstract void run();//abstract放在返回类型之前
}
//right demo
public abstract class AnimalAbstractDemo {//abstract放在class前
    void run(){//abstract放在返回类型之前{
    }
}
//right demo
public abstract class AnimalAbstractDemo {//abstract放在class前

}
  • 抽象类不能被实例化,即无法使用new关键字直接创建抽象类的实例。
//Wrong demo
public abstract class AnimalAbstractDemo {//abstract放在class前
    String kinds;
    public AnimalAbstractDemo(String kinds) {
        this.kinds = kinds;
    }
    abstract void run();//abstract放在返回类型之前

    public static void main(String[] args) {
        AnimalAbstractDemo animal = new AnimalAbstractDemo("dog");//Wrong!!!
    }
}
  • 抽象方法没有方法体,并以分号结束。
public abstract class AnimalAbstractDemo {//abstract放在class前
    String kinds;
    public AnimalAbstractDemo(String kinds) {
        this.kinds = kinds;
    }
    abstract void run();//Look Here!//没有方法体,以分号结尾。
    public static void main(String[] args) {
        
    }
}
  • 一个抽象类中可以含有多个抽象方法,也可以含有已实现的方法。
public abstract class AnimalAbstractDemo {//abstract放在class前
    String kinds;
    public AnimalAbstractDemo(String kinds) {
        this.kinds = kinds;
    }
    abstract void run();//虚方法一

    abstract void jump();//虚方法二
    
    void eat(){
        System.out.println("张开嘴!");//已实现的方法
    }

    public static void main(String[] args) {

    }
}

定义抽象类有三种情况:直接定义一个抽象类;或继承一个抽象类,但没有完全实现父类包含的抽象方法;或实现一个接口,但没有完全实现接口中包含的抽象方法。

//Demo 直接定义一个抽象类
public class Animal {
    public static void main(String[] args) {
        
    }
}

abstract class AnimalAbstract{
    String name;

    public AnimalAbstract(String name) {
        this.name = name;
    }

    abstract void hunt();
}
//Demo 继承一个抽象类
public class Animal {
    public static void main(String[] args) {

    }
}

abstract class AnimalAbstract{
    String name;

    public AnimalAbstract(String name) {
        this.name = name;
    }

    abstract void hunt();
    abstract void eat();
}

//该方法仍为虚方法,继承了部分AnimalAbstract{}
abstract class Dog extends AnimalAbstract{

    public Dog(String name) {
        super(name);
    }

    @Override
    void hunt() {//重写了hunt()虚方法,但是没有重写eat()虚方法
        System.out.println("觅食中,请勿打扰!");
    }
}
//Demo 运用接口
public class Animal {
    public static void main(String[] args) {

    }
}

//abstract class AnimalAbstract{
abstract interface AnimalAbstract{
    String name = null;
    void hunt();//虽然没有写abstract,但是默认为abstract void hunt();
    void eat();//同上
}

//该方法仍为虚方法,继承了部分AnimalAbstract{}
abstract class Dog implements AnimalAbstract{
    
    @Override
    public void hunt() {//重写了hunt()虚方法,但是没有重写eat()虚方法
        System.out.println("觅食中,请勿打扰!");
    }
}

abstract关键字不能用来修饰成员变量和构造方法,即没有抽象变量和抽象构造方法的说法。 abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此抽象方法不能定义为 private,即 privateabstract不能同时修饰方法。 abstract也不能和 staticfinalnative同时修饰同一方法。

关于接口

  • interface的访问符可以是 public或为默认,默认采用包权限访问控制,即在相同包中才可以访问该接口。
//访问控制符为public
public interface PeopleInterface {

}

//访问控制符为默认
interface TechaerInterface{

}
  • 在接口体里可以包含静态常量、抽象方法、内部类、内部接口以及枚举的定义,从Java8版本开始允许接口中定义默认方法、类方法。
//访问控制符为public
public interface PeopleInterface {
    int id = 0;//其实就是static int id = 0;
    void walk();//其实是abstract void walk();

    static void test(){
        System.out.println("这是一个静态方法!");
    }

    default void show(){
        System.out.println("这是一个默认方法!");
    }
}

//访问控制符为默认
interface TechaerInterface extends PeopleInterface {
    static int id = 1;

    @Override
    void walk();
}

与类的默认访问符不同,接口体内定义的常量、方法等都默认为 public,可以省略ubic关键字,即当接口中定义的常量或方法不写 public,其访问权限依然是 public

//访问控制符为public
public interface PeopleInterface {
    int id = 0;//其实就是public static int id = 0;
    void walk();//其实是public abstract void walk();

    static void test(){//其实就是public static void test()
        System.out.println("这是一个静态方法!");
    }

    default void show(){
        System.out.println("这是一个默认方法!");
    }
}

抽象类和接口之间的区别

  • 接口体现的是一种规范,这种规范类似于总纲,是系统各模块应该遵循的标准,以便各模块之间实现耦合以及通信功能;
  • 抽象类体现的是一种模板式设计。抽象类可以被当成系统实现过程中的中间产品,该产品已实现了部分功能但不能当成最终产品,必须进一步完善,而完善可能有几种不同方式。

你可能感兴趣的:(Java语言)