2015-07-23 2 views
3

Я знаю, что законно иметь основной метод в абстрактном классе, потому что Eclipse позволяет мне делать следующее и запускать класс как приложение Java. Но имеет ли смысл делать что-то подобное?Имея основной метод в абстрактном классе

Есть ли сценарий реального мира, где нужно иметь основной метод в абстрактном классе?

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"); 
    } 
} 
+0

Вы можете вызвать другие объекты и их методы и по существу имитировать композицию, если вы знакомы с отношениями SE. – Adam

+2

ответы на вопрос, который я обозначил как дубликат, не так велики, поэтому возобновление. хотя я думаю, что ответ на это «Нет». –

+0

@NathanHughes Я согласен, что он недостаточно отвечает на этот вопрос (или, в этом отношении, тот, который находится на исходном посту). Я ищу сценарий реальной жизни, когда кто-то создавал бы свой класс таким образом. – Chiseled

ответ

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   

который не делает то, что вы хотите.

Затенение вызовов статических методов не работает, как виртуальное переопределение методов экземпляра, вы должны начать с явного называния класса, используемого в качестве отправной точки для поиска правильной сигнатуры метода (или по умолчанию вы получаете класс, вызов сделан). Проблема заключается в том, что основной метод не может знать о подклассах (или в чем смысл помещать его в абстрактный класс), поэтому нет никакого способа получить информацию, относящуюся к подклассам, в основной метод суперкласса.

Мое предпочтение заключается в том, чтобы свести к минимуму использование статического ключевого слова, зарезервировав его для констант (хотя не так много, поскольку появились перечисления) и безстоящих функций без зависимостей. Вместо этого используйте объектно-ориентированные методы. С помощью статических методов вы должны быть конкретными. С OO идея заключается в том, что вы можете избежать специфики и позволить подклассам заботиться о себе.

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

Вы спрашиваете о сценарии с необходимостью методы main, чтобы быть в abstract классе, но я мог бы спросить, наоборот: там когда-либо необходимо иметь метод main в не- abstract класса?

Очевидно, что совершенно неважно, находится ли точка входа приложения в класс abstract или нет. Что важно:

  • Этот класс должен быть public
  • Он должен иметь имя, которое полезно для внешнего мира, как он будет выглядеть в не-Java контексте, т.е. командной строки, запуск сценариев или XML-файлы, документация и т.д.

Тем не менее, если у вас есть приложение, которое состоит из одного public abstract базового класса с кратким именем (например, Automobile) и некоторые классы реализации, которые не являются public и/или имеют трудно вспомнить имена (например, AutomobileXF838EngineImpl), есть точка в choosi ng этот базовый класс для размещения точки входа приложения.

Но это относится только к довольно небольшим приложениям, где имеет значение количество классов.Для более крупных приложений вы обычно будете иметь выделенный класс, чтобы служить в качестве точки входа в приложение, где находится метод main. Могут быть даже несколько классов запуска, используемых для разных сред или фреймворков.

Таким образом, эти начальные классы не являются базовым классом abstract или классом реализации такого базового класса, но полностью не связаны с такими иерархиями классов. Поскольку они не являются базовыми классами иерархии типов, они обычно не abstract.

Смежные вопросы