接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承具体类。抽象类中可以有静态的main方法。
1.抽象类是否可继承实体类 (concrete class)
答:抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数。其实Object就是个实体类,Java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的。关键在于实体类必须有明确的构造函数
如下:
public class A {
public static void main(String[] args) {
}
}
abstract class B extends A {
}
编译通过,也可以运行。这里没有写A的构造方法,那么为什么抽象类B依然可以继承实体类,这是因为系统默认为A写了无参的构造方法。
如果将A的构造方法,手动定义为private,那么B将无法继承自A,如下:
public class A {
private A() {
}
public static void main(String[] args) {
}
}
abstract class B extends A {
}
此时B就不能继承A。
2.抽象类中是否可以有静态的main方法?
可以
如下:
abstract class A{
public static void main(String[] args) {
System.out.println("hello");
}
}
可以输出hello,说明抽象类可以有main方法。
总结:
抽象类:
- 抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
- 一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
- 抽象类可以包含抽象方法和非抽象方法。
抽象方法:
- 抽象方法是一种没有任何实现的方法,该方法的的具体实现由子类提供。
- 抽象方法不能被声明成 final 和 static。
- 任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。
- 如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。
- 抽象方法的声明以分号结尾,例如:
public abstract sample();