2015-11-20 5 views
1

У меня есть два класса, где каждый класс имеет один основной метод, основным классом, где он станет точкой входа, является класс RunPattern. Вопрос в том, какой метод в классе DataCreator будет вызываться первым, когда DataCreator.serialize (имя_файла) вызывается в классе RunPattern? это метод main() или serialize()? Разве это отличается от статической области?JAVA, JVM, Несколько основных методов

import java.io.File; 
import java.io.IOException; 
import java.io.Serializable; 

import java.io.ObjectOutputStream; 
import java.io.FileOutputStream; 


public class RunPattern { 

    public static void main(String args[]){``// The first main() method 

     if(!new File("data.ser").exists()){ 

      DataCreator.serialize("data.ser"); 

     } 

    } 

} 

    class DataCreator { 

    private static final String DEFAULT_FILE = "data.ser"; 

    public static void main(String args[]){ // the second main 

     String fileName; 
     if(args.length == 1){ 
      fileName = args[0]; 
     }else{ 
      fileName = DEFAULT_FILE; 
     } 
     serialize(fileName); 

    } 

    public static void serialize(String fileName){ 

     try{ 

      serializeToFile(createData(), fileName); 


     }catch(IOException exc){ 
      exc.printStackTrace(); 
     } 


    } 

    private static Serializable createData(){ 

     ToDoListCollection data = new ToDoListCollectionImpl(); 
     ToDoList listOne = new ToDoListImpl(); 
     ToDoList listTwo = new ToDoListImpl(); 
     ToDoList listThree = new ToDoListImpl(); 
     listOne.setListName("Daily Routine"); 
     listTwo.setListName("Programmer Hair Washing Product"); 
     listThree.setListName("Reading List"); 
     listOne.add("get up"); 
     listOne.add("Brew cuppa java"); 
     listOne.add("Read JVM Times"); 
     listTwo.add("Latter"); 
     listTwo.add("Rinse"); 
     listTwo.add("Repeat"); 
     listTwo.add("eventually throw too much conditioner"); 
     listThree.add("the complete of duke"); 
     listThree.add("how green was java"); 
     listThree.add("URL, sweet URL"); 
     data.add(listOne); 
     data.add(listTwo); 
     data.add(listThree); 
     return data; 


    } 

    public static void serializeToFile(Serializable data, String fileName) throws IOException { 

     ObjectOutputStream serOut = new ObjectOutputStream(new FileOutputStream(fileName)); 
     serOut.writeObject(data); 
     serOut.close(); 
    } 

} 
+0

вы должны сообщить себе, что [статические] (https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html) означает, что у вас есть основное недоразумение здесь. – SomeJavaGuy

+0

Я отредактировал тег, я знаю, это не имеет никакого отношения к моему вопросу здесь – edgards

+0

Когда вы вызываете 'DataCreator.serialize', он вызывает метод' serialize' в 'DataCreator', ничего магического не происходит, чтобы вызвать' main() ' –

ответ

0

Основной метод DataCreator никогда не будет называться таким способом.

Some info about setting the main method in the Manifest-File
Поскольку вы обычно развиваетесь в среде IDE, это делается для вас автоматически.
Но вы можете выбрать, какой mainmethod является вашей точкой входа в Runconfiguration.

+0

Итак, каково использование второго метода main()? Какая польза от программы, имеющей другой основной метод в другом классе? Как я могу назвать другой основной метод? – edgards

+0

Комментарии ниже Сообщение Seelenvirtuose ответил, что более или менее уже. В общем, нет реального использования нескольких основных методов. Вы вызываете другой основной метод, так как вы вызываете любую другую статическую функцию. DataCreator.main (новый String [] {"testfile.txt"}); – BadK

1

Хорошо. Если запустить программу с

Java -cp ... RunPattern

то main метод вашего RunPattern класса вызывается. Это, в свою очередь, вызывает

DataCreator.serialize("data.ser"); 

, который просто вызывает метод serialize вашего DataCreator класса. Метод main в этом классе не задействован.

+0

Итак, каково использование второго метода main()? Какая польза от программы, имеющей другой основной метод в другом классе? Как я могу назвать другой основной метод? – edgards

+1

Вы можете просто вызвать метод 'main' другого класса, если вы это чувствуете. Я не знаю его цели, но, читая его код ... вы можете передать имя файла в качестве аргумента для него, тогда как метод 'RunPattern.main' больше похож на тестовый класс с жестко закодированным именем файла. – Seelenvirtuose

+0

@edgards обычно основной файл main записывается внутри файла манифеста, который будет точкой входа для вашего .jar-файла. Но вы также можете получить доступ к другому основному методу, явно вызвав основной в конкретном классе с помощью 'java -cp package.class'. Возможно, вы можете использовать самозахватывающую банку, чтобы предотвратить блокирование другого приложения. – SomeJavaGuy

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