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...");
}
}
|