Java中抽象类和接口的几点区别

一、抽象类

(1)抽象类在类名前使用关键字abstract声明,如下:

public abstract class AbstractMammal{}

(2)抽象类中可以没有抽象方法,如下:

package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 * 抽象类中可以没有抽象方法
 */
public abstract class AbstractMammal {
    void eat() {
        System.out.println("吃");
    }
}

(3)抽象类中变量和方法可以使用private/protected/public/final/static关键字修饰,也可以是默认,如下:

package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 * 抽象类中可以没有抽象方法
 */
public abstract class AbstractMammal {
    //private修饰,同一个类中可见
    private int a;
    //默认,同一包内可见
    int b;
    //protected修饰,同一包内和所有子类可见
    protected int c;
    //public修饰,所有类可见
    public int d;
    //static,类变量
    static int e;
    //final,必须初始化,子类不可修改
    final int f = 0;

    //子类可继承/重写(重写后会覆盖),不可直接访问
    private void a() {
        System.out.println("a");
    }

    //子类可以继承/重写/访问
    protected void b() {
        System.out.println("b");
    }

    //子类可以继承/重写/访问
    void c() {
        System.out.println("c");
    }

    //子类可以继承/重写/访问
    public void d() {
        System.out.println("d");
    }
    //子类可以继承/重写/访问
    static void e() {
        System.out.println("e");
    }
    //子类可以继承,不可重写,可以访问
    final void f() {
        System.out.println("f");
    }
}

(4)抽象类中可以有构造方法(默认或者自定义),如下:

package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 * 抽象类中可以没有抽象方法
 */
public abstract class AbstractMammal {
    //无参构造方法,默认
   AbstractMammal(){}
   //含参构造方法
   AbstractMammal(String name){
       System.out.println(name);
   }
}


package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public class Test {
    public static void main(String[] args) {
        AbstractMammal abstractMammal=new AbstractMammal() {
        };
        AbstractMammal mammal=new AbstractMammal("张三") {
        };
    }
}

(5)抽象类中方法可以没有方法体(方法体指的是一对大括号),但必须使用abstract修饰(称为抽象方法),抽象方法不可以使用private修饰(子类无法实现),如下: 

package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 * 抽象类中可以没有抽象方法
 */
public abstract class AbstractMammal {
   abstract void eat();
}

(6)如果一个类继承于一个抽象类,则该类必须实现抽象类的抽象方法。如果没有实现抽象方法,则必须将该类也定义为abstract类。

 

二、接口

(1)接口在接口名称前使用interface关键字修饰,如下:

package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public interface Animal {
}

(2)接口中的方法均为public(关键字通常省略),接口中方法可以没有方法体(此时是public abstract),也可以有具体实现,具体实现的方法但必须使用default关键字修饰(JDK1.8引入),如下:

package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public interface Animal {
    void walk(); //public

    default void eat() {//JDK1.8开始接口可以实现方法,必须使用default关键字,自动是public
        System.out.println("吃");
    }
}

(3)接口中定义的变量是public static final的,必须初始化,实现类不可修改,如下:

package main.abstractclass;

/**
 * Created by leboop on 2018/11/17.
 */
public interface Animal {
    int a = 0;  //final和static,必须初始化,子类中不可更改
}

(4)接口中不可以有构造方法

 

三、两者区别

以上已经展示了部分区别,它们还有以下几点不同:

(1)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

(2)子类使用extends继承一个抽象类,而一个类使用implements实现一个接口

你可能感兴趣的:(Java)