在抽象类中使用main方法

时间:2015-07-23 16:39:43

标签: java oop static abstract-class 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");
    }
}

3 个答案:

答案 0 :(得分:3)

您在询问需要main方法在abstract课程中的情景,但我可以反过来问:是否需要main 1}}非abstract类中的方法?

显然,应用程序入口点是否在abstract类中是完全无关紧要的。重要的是:

  • 该课程必须为public
  • 它应该有一个对外界有用的名称,因为它将出现在非Java上下文中,即命令行,启动脚本或XML文件,文档等。

也就是说,如果你的应用程序包含一个public abstract基类,其名称简洁(如Automobile),而某些实现类不是public和/或难以记住名称(如AutomobileXF838EngineImpl),选择该基类来托管应用程序入口点是有意义的。

但这仅适用于相当小的应用程序,其中类的数量很重要。对于较大的应用程序,您通常只有一个专用类作为托管main方法的应用程序入口点。甚至可能有多个启动类用于不同的环境或框架。

因此,这些起始类既不是abstract基类,也不是这种基类的实现类,但与这些类层次结构完全无关。由于它们不是类型层次结构的基类,因此它们通常不是abstract

答案 1 :(得分:2)

不,不是真的。尝试创建一个类层次结构,其中不同的类共享相同的主方法似乎没有用。见这个例子:

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关键字的使用,保留它用于常量(尽管枚举出来的次数不多)和没有依赖项的无状态函数。而是支持面向对象的技术。使用静态方法,您必须具体。有了OO的想法是你可以避免具体,让子类自己处理。

答案 2 :(得分:0)

您可以创建另一个类的对象,并通过合成使用其他类方法

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();
    }
}