Java 在抽象类中有main方法
我知道在抽象类中使用main方法是合法的,因为Eclipse允许我执行以下操作,并将该类作为java应用程序运行。但这样做有意义吗 在现实世界中,是否有一个抽象类中需要有一个主方法的场景Java 在抽象类中有main方法,java,oop,static,abstract-class,main,Java,Oop,Static,Abstract Class,Main,我知道在抽象类中使用main方法是合法的,因为Eclipse允许我执行以下操作,并将该类作为java应用程序运行。但这样做有意义吗 在现实世界中,是否有一个抽象类中需要有一个主方法的场景 public abstract class Automobile { public Boolean powerOn() { // generic implementation for powering on an automobile return true;
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");
}
}
您可以创建另一个类的对象,并通过组合使用其他类方法
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();
}
}
不,不是真的。试图创建一个不同类共享同一主方法的类层次结构似乎没有什么用处。请参见此示例:
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 A
A
这不是你想要的
隐藏静态方法调用不像虚拟重写实例方法那样工作,您必须从显式命名类开始,将其用作查找正确方法签名的起点(或者默认情况下,您将获得进行调用的类)。问题是main方法不知道子类(或者把它放在抽象类上有什么意义),因此没有好的方法将子类特定的信息输入到超类main方法中
我的首选是尽量减少使用static关键字,将其保留为常量(尽管自从enum出现以来并没有这么多)和无依赖性的无状态函数。相反,我们更喜欢面向对象技术。对于静态方法,您必须是特定的。使用OO,您可以避免具体化,让子类自行处理。您询问的是一个需要将
main
方法置于抽象类中的场景,但我可以反过来问:在非抽象类中是否需要main
方法
显然,应用程序入口点是否在抽象类中是完全无关的。重要的是:
- 该类必须是
public
- 它应该有一个对外部世界有用的名称,因为它将出现在非Java上下文中,即命令行、启动脚本或XML文件、文档等
也就是说,如果您的应用程序由一个具有简明名称的公共抽象
基类(如汽车
)和一些非公共
和/或名称难以记忆的实现类(如汽车F838EngineImpl
)组成,选择承载应用程序入口点的基类是有意义的
但这只适用于相当小的应用程序,其中类的数量很重要。对于较大的应用程序,您通常会有一个专用类,作为托管main
方法的应用程序入口点。甚至可能有多个start类用于不同的环境或框架
因此,这些起始类既不是抽象的
基类,也不是此类基类的实现类,而是与此类层次结构完全无关的。由于它们不是类型层次结构的基类,它们通常不是抽象的。如果您熟悉SE关系,您可以调用其他对象及其方法,并从本质上模拟组合。我将其标记为的问题的答案不是很好,因此请重新打开。尽管我认为这个问题的答案是“不”。@NathanHughes我同意这并不能充分回答这篇文章(或者就这一点而言,这篇文章是原始文章)中的问题。我正在寻找一个现实生活中的场景,其中有人会以这种方式设计他们的类。