接口和抽象类

Java中接口和抽象类小结,欢迎交流,指正错误。

这是一个非常经典的Java基础题,再次整理出来,除了巩固之用外也是对一些新特性的总结。

1. 接口和抽象类的区别

  • 接口的方法默认为public abstract ,接口中的变量默认为public static final,在Java8之前接口所有的方法不能有实现;抽象类中可以有类变量,也可以有成员变量,还可以有非抽象方法。
  • 一个类可以实现多个接口,但只能继承一个抽象类
  • 一个类实现接口,要实现该接口的所有抽象方法。
  • 接口中不能有构造方法,接口不能被实例化;但可以声明,必须引用一个实现该接口的对象。
  • 抽象类可以有构造方法,但是不能被直接通过new进行实例化。但可以通过子类继承,实例化子类的时候抽象类也会被实例化。 这其实用到了多态,向上转型。父类引用指向子类对象。
  • 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

2. JDK1.7及以前

在JDK1.7,接口中只包含抽象方法,使用public abstract 修饰。

接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
 * 接口
 */
public interface IDemo{
    public abstract void method();
}


/*
 * 抽象类
 */
public abstract class ADemo{
    //抽象方法
    public abstract void abstractMethod();
    
    //普通方法,可以被子类调用或重写
    public void sayHi(){
        System.out.println("hi, harrison");
    }
    
    //静态方法, 可以通过ADemo.print()调用
    public static void print(){
        System.out.println("static method...");
    }
}

3. JDK1.8

在JDK1.8中,接口中可以有静态方法和默认方法。

默认方法:使用default修饰,在接口的实现类中,可以直接调用该方法,也可以重写该方法。

静态方法:使用static修饰,通过接口直接调用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public interface IDemo{
    
    //抽象方法
    public abstract void abstractMethod();
    
    //默认方法
    public default void defaultMethod(){
        System.out.println("default method...");
    }

    //静态方法
    public static void staticMethod(){
        System.out.println("static method...");
    }
}

4. JDK1.9及以后

在JDK1.9,接口中新加了私有方法,使用private修饰,私有方法供接口内的默认方法和静态方法调用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public interface IDemo{
     //抽象方法
    public abstract void abstractMethod();
    
    //默认方法
    public default void defaultMethod(){
        System.out.println("default method...");
        privateMethod();
    }

    //静态方法
    public static void staticMethod(){
        System.out.println("static method...");
        privateMethod();
    }
    
    //私有方法
    private void privateMethod() {
        System.out.println("private method...");
    }
} 
0%