抽象类
抽象类是从一些类中抽取出它们共有的属性(例如某些相同的成员变量、属性相同(修饰符、函数名、参数类型、参数个数)的方法)。抽象类注重于对类本身的抽象,抽象方法没有方法体,仅仅是声明了该方法,让继承它的子类去实现。
public abstract class AbstractClass {
private String privateProperty;
protected String protectedProperty;
public String publicProperty;
// 因为属性可用public、protected修饰,所以可以存在构造方法
AbstractClass(){};
private void privateMethod() {
// private修饰的方法必须有方法体,因为private不可被子类继承,没有方法体就没有存在的意义
}
// 没有方法体的方法必须为 abstract 方法
protected abstract void protectedMethodNoBody();
protected void protectedMethod(){
// 可以有方法体
}
// 没有方法体的方法必须为 abstract 方法
public abstract void publicdMethodNoBody();
public void publicMethod(){
// 可以有方法体
};
// 默认修饰符为public
abstract void abstractmethod();
}
/**
* 必须实现父类的abstract方法。
* @author li
*
*/
class ChildClass extends AbstractClass{
// 可访问父类 protected、public修饰的变量
String superProtectedProperty = super.protectedProperty;
String superpublicProperty = super.publicProperty;
@Override
protected void protectedMethodNoBody() {
// TODO Auto-generated method stub
}
@Override
public void publicdMethodNoBody() {
// TODO Auto-generated method stub
}
@Override
void abstractmethod() {
// TODO Auto-generated method stub
}
}
-
抽象方法只作声明,而不包含实现,即没有方法体。
-
抽象类不能被实例化。
-
抽象类可以有抽象属性和抽象方法,若含有抽象方法,该类必须声明为抽象类。
-
子类必须重写抽象类中的抽象方法
-
子类为抽象类时可以重写抽象类中的抽象方法,也可以不重写。
接口
接口主要是对类的行为的抽象,接口也可以有变量和方法,但是变量以及方法的修饰符都必须分别是public static final(省略时也会默认是这个)和public abstract(省略时也会默认是这个)。
public interface InterfaceClass {
// 接口变量必须以public static final修饰
// private static final String privateProperty = "privateProperty";
// protected static final String protectedProperty = "protectedProperty";
public static final String publicProperty = "publicProperty";
// 因为变量必须以static修饰,所以不存在构造方法
// InterfaceClass(){}
// 方法默认使用 public abstract 修饰,所以不可存在方法体
public abstract void abstractMethod();
// 省略时,依旧采用 public abstract修饰。
void Methid();
// java 8 以后,为接口提供 default 方法,这样就使得接口与抽象类更相似了。为什么不直接使用抽象类:Java是单继承的、接口可以实现多个
default void defaultMethod(String str){
System.out.println(str);
}
}
/**
* 必须实现接口中的所有抽象方法
*
*/
class ChildClass implements InterfaceClass{
// 可访问接口属性
String InterfaceClassProperties = InterfaceClass.publicProperty;
@Override
public void abstractMethod() {
// TODO Auto-generated method stub
}
@Override
public void Methid() {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.defaultMethod(child.InterfaceClassProperties);
}
}
-
接口不能被实例化
-
接口只能包含方法声明
-
接口的成员包括方法、属性、索引器、事件
-
接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员
接口和抽象类的区别
-
抽象类可以有构造方法,接口中不能有构造方法(因为变量都是static修饰的)。
-
抽象类中可以有普通成员变量,接口中没有普通成员变量
-
抽象类中可以包含静态方法,接口中不能包含静态方法
-
一个类可以实现多个接口,但只能继承一个抽象类。
-
接口可以被多重实现,抽象类只能被单一继承
-
如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法
接口和抽象类的相同点
-
都可以被继承
-
都不能被实例化
-
都可以包含方法声明
-
子类必须实现二者中未实现的方法