Java中的接口和抽象类都是用来实现多态性的重要概念,但它们之间有很多不同之处。在本文中,我将详细介绍Java中接口和抽象类的区别,包括定义、实现、继承、访问修饰符、构造函数等方面。
接口是一种特殊的抽象类,它只包含抽象方法和常量。接口中的方法默认为public abstract,常量默认为public static final。接口可以通过关键字interface来定义。
public interface MyInterface {
public static final int MAX_VALUE = 100;
public abstract void doSomething();
}
抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。抽象方法是没有实现的方法,必须在子类中被实现。抽象类可以通过关键字abstract来定义。
public abstract class MyAbstractClass {
public static final int MAX_VALUE = 100;
public abstract void doSomething();
public void doSomethingElse() {
System.out.println("Doing something else");
}
}
接口中的方法必须在实现类中被实现,否则实现类必须声明为抽象类。一个类可以实现多个接口,使用关键字implements来实现接口。
public class MyClass implements MyInterface {
public void doSomething() {
System.out.println("Doing something");
}
}
抽象类中的抽象方法必须在子类中被实现,否则子类必须声明为抽象类。一个类只能继承一个抽象类,使用关键字extends来继承抽象类。
public class MySubClass extends MyAbstractClass {
public void doSomething() {
System.out.println("Doing something");
}
}
接口不能被继承,但是一个接口可以继承多个接口,使用关键字extends来继承接口。
public interface MyInterface2 extends MyInterface {
public abstract void doSomethingElse();
}
抽象类可以被继承,一个子类只能继承一个抽象类。
public class MySubClass2 extends MyAbstractClass {
public void doSomething() {
System.out.println("Doing something");
}
}
接口中的方法和常量默认为public,不能使用其他访问修饰符。
public interface MyInterface {
public static final int MAX_VALUE = 100;
public abstract void doSomething();
}
抽象类中的方法和变量可以使用public、protected、和default访问修饰符,但是不能使用private访问修饰符。
public abstract class MyAbstractClass {
public static final int MAX_VALUE = 100;
public abstract void doSomething();
protected void doSomethingElse() {
System.out.println("Doing something else");
}
}
接口不能有构造函数,因为接口不能被实例化。
抽象类可以有构造函数,但是不能被实例化。子类必须调用父类的构造函数。
public abstract class MyAbstractClass {
public MyAbstractClass() {
System.out.println("Creating MyAbstractClass");
}
public abstract void doSomething();
}
public class MySubClass extends MyAbstractClass {
public MySubClass() {
super();
System.out.println("Creating MySubClass");
}
public void doSomething() {
System.out.println("Doing something");
}
}
接口和抽象类都是Java中实现多