在抽象类中使用main方法
我知道在抽象类中使用main方法是合法的,因为Eclipse允许我执行以下操作并将该类作为java应用程序运行。 但做这样的事情有意义吗?
是否存在一个真实的场景,需要在抽象类中使用main方法?
public abstract class Automobile { public Boolean powerOn() { // generic implementation for powering on an automobile return true; } public void move() { // generic implementation for move } public void changeDirection(String newDir) { // generic implementation for changing direction } public abstract void accelerate(Integer changeInSpeed); public abstract Integer refuel(Integer inputFuel); public static void main(String[] args) { System.out.println("I am a main method inside an abstract Automobile class"); } }
不,不是真的。 尝试创建一个类层次结构,其中不同的类共享相同的主方法似乎没有用。 看这个例子:
public abstract class A { public static void doStuff() { System.out.println("A"); } public static void main(String[] args) { System.out.println("starting main in A"); doStuff(); } } class B extends A { public static void doStuff() { System.out.println("B"); } }
打印出来
c:\Users\ndh>java A starting main in A A
这是预期但无聊,和
c:\Users\ndh>java B starting main in AA
哪不符合你的意愿。
隐藏静态方法调用不像虚拟覆盖实例方法那样工作,您必须从显式命名类开始,以用作查找正确方法签名的起点(或者默认情况下,您获取调用的类) 。 问题是main方法无法知道子类(或者将它放在抽象类上的意义),因此没有好的方法可以将子类特定的信息引入超类main方法。
我的偏好是最小化我对static关键字的使用,保留它用于常量(尽管枚举出来的次数不多)和没有依赖关系的无状态函数。 而是支持面向对象的技术。 使用静态方法,您必须具体。 有了OO的想法是你可以避免具体,让子类自己处理。
您正在询问需要将main
方法放在abstract
类中的场景,但我可以反过来问:是否需要在非abstract
类中使用main
方法?
显然,应用程序入口点是否在abstract
类中是完全无关紧要的。 重要的是:
- 那堂课必须
public
- 它应该有一个对外界有用的名称,因为它将出现在非Java上下文中,即命令行,启动脚本或XML文件,文档等。
也就是说,如果你有一个应用程序,它包含一个简洁名称的public abstract
基类(如Automobile
)和一些非public
和/或难以记住名称的实现类(如AutomobileXF838EngineImpl
),那么选择该基类来托管应用程序入口点。
但这仅适用于相当小的应用程序,其中类的数量很重要。 对于较大的应用程序,您通常只有一个专用类作为托管main
方法的应用程序入口点。 甚至可能有多个启动类用于不同的环境或框架。
因此,这些起始类既不是abstract
基类,也不是这种基类的实现类,但与这些类层次结构完全无关。 由于它们不是类型层次结构的基类,因此它们通常不是abstract
。
您可以创建另一个类的对象,并通过组合使用其他类方法
class Test1 { int x = 10; public void display() { System.out.println("Hello! This is Test1 class"); } } public abstract class Test { public static void main(String args[]) { Test1 t1 = new Test1(); System.out.println("From abstract class main(): " + t1.x); t1.display(); } }