一般情况下我在java类中会经常使用main函数和构造函数,但是否在抽象类(abstract class)或者接口(interface)中也使用过呢?当时我也不是很清楚于是做了测试:
分别执行Father和Child:
Father:
Child:
new Child:
接口中是根本不能声明main函数和构造函数。为什么main函数和构造在类和抽象类中可以而接口中不可以?
1.接口中不能有static的方法,接口中的所有方法必须是非静态的(no-static).因为接口强制所有方法必须由其实现类来实现。所以接口不能有main函数存在。
2.抽象类虽然类似接口,但是它是介于接口和类之间的特殊类。因为抽象类可以拥有自己的非静态方法。所以main函数可以在抽象类中声明。并且抽象类中强调的是继承,所以构造函数和继承的很多特性有很多密切关系。比如子类在实例化时调其构造函数首先会调用其父类的构造函数当其父类的构造函数执行完毕之后才能完成其构造函数。所以抽象类必须有其构造函数。
但是以上解释只是表面解释,在JVM执行该应用程序时,main函数首先会被执行。此时该类还没有被实例化。JVM是通过类名直接调用的,这也就是为什么mian函数必须被声明public static的缘故。main方法作为一个特殊的规范,与普通的方法有很大区别,限制很多,理解其原理需要学习JVM相关知识。
abstract class Father{
public Father()
{
System.out.println("In abstract Father constructor...");
}
public static void main(String as[]) {
System.out.println("In abstract Father main...");
}
}
class Child extends Father{
public Child()
{
super();
System.out.println("In child constructor...");
}
public static void main(String as[]) {
System.out.println("In child main...");
}
}
分别执行Father和Child:
Father:
In abstract Father main...
Child:
In child main...
new Child:
In abstract Father constructor...
In child constructor...
接口中是根本不能声明main函数和构造函数。为什么main函数和构造在类和抽象类中可以而接口中不可以?
1.接口中不能有static的方法,接口中的所有方法必须是非静态的(no-static).因为接口强制所有方法必须由其实现类来实现。所以接口不能有main函数存在。
2.抽象类虽然类似接口,但是它是介于接口和类之间的特殊类。因为抽象类可以拥有自己的非静态方法。所以main函数可以在抽象类中声明。并且抽象类中强调的是继承,所以构造函数和继承的很多特性有很多密切关系。比如子类在实例化时调其构造函数首先会调用其父类的构造函数当其父类的构造函数执行完毕之后才能完成其构造函数。所以抽象类必须有其构造函数。
但是以上解释只是表面解释,在JVM执行该应用程序时,main函数首先会被执行。此时该类还没有被实例化。JVM是通过类名直接调用的,这也就是为什么mian函数必须被声明public static的缘故。main方法作为一个特殊的规范,与普通的方法有很大区别,限制很多,理解其原理需要学习JVM相关知识。