Создание экземпляра объекта из основного класса этого класса в Java - PullRequest
17 голосов
/ 25 октября 2011

Я просматривал документацию по классу ООП и нашел этот пример:

class Student {
    private String name;
    public int averageGrade;


    public Student(String n, int avg) {
        name = n;
        averageGrade = avg;
    }

    public static void main(String[] args) {
        Student s = new Student("John", 9);
    }
}

Меня смущает, что они создают объект из основного класса того же класса. Это считается плохой практикой? Будет ли у вновь созданного объекта s метод main?

Спасибо!

Ответы [ 5 ]

17 голосов
/ 25 октября 2011

В этом нет ничего плохого. Это совершенно нормально. (По общему признанию, было бы более разумно, чтобы класс с методом main был чем-то, что можно было бы явно выполнить - метод main в классе Student не имеет такого большого смысла.)

Объекты на самом деле не имеют методов - классы имеют методы, либо статические методы, которые вызываются без какого-либо конкретного контекста, либо методы экземпляра, которые вызываются для определенного объекта этого типа (или подкласса) .

В то время как вы могли бы вызвать s.main(...), это на самом деле просто разрешило бы вызов статического метода Student.main; Вы не должны вызывать статические методы «через» выражения, подобные этим, так как это сбивает с толку.

15 голосов
/ 25 октября 2011

Нет, это не плохая практика.Это на самом деле довольно часто.Что вы пропустили, так это то, что main - это статический метод.Это не метод объекта Student.Это метод ученического класса.Вы вызываете его не с someStudent.main(...), а с Student.main(...).

. См. http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html для более подробных объяснений.

3 голосов
/ 25 октября 2011

Это просто отлично.

Я знаю, что это выглядит немного рекурсивно, но происходит то, что метод main () вызывается при запуске этого класса из командной строки, а затем вызывается конструкторкогда вы на самом деле создаете экземпляр объекта.(См. Также комментарий Джона.)

2 голосов
/ 25 октября 2011

Это не плохо и не хорошо.

Зависит от использования.В вашем примере конструктор вызывается из main() метода, который является статическим по определению, поэтому у вас нет другого выбора.

Еще одним примером "хорошего" использования этого шаблона является шаблон фабричного метода.Перечисления также используют эту технику в методе valueOf() (это тоже пример фабричного метода).

1 голос
/ 10 сентября 2014

Это совершенно нормально. Это совершенно нормально ... Если член класса объявлен как статический, это сущность, живущая иначе, чем какой-либо конкретный объект класса. Это то, что может быть использовано само по себе, без использования каких-либо объектов.ИЛИ это обычно для разных объектов. Вы можете фактически посчитать количество объектов, созданных из класса, установив статическую переменную в классе, такую ​​как

 class   A
     {
         A()
          {
           count++
           }

     static count=0;
       --- 
       ---
      }

И каждый раз, когда объект A, созданный счетчик будетдобавьте один.

Поскольку статические методы не принадлежат каким-либо конкретным объектам, вне класса он называется classname.method(), так же как обычные методы называются classObject.method()

...