Создание объекта внутри внутри этого класса в Java
Я просматривал свою документацию по классу ООП, и я нашел этот пример:
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
иметь основной метод?
Спасибо!
Ответы
Ответ 1
Нет ничего плохого в этом. Это совершенно нормально. (По общему признанию, для класса с основным методом было бы более целесообразным выполнение - метод main
в классе Student
не имеет особого смысла.)
У объектов действительно нет методов - у классов есть методы, либо статические методы, которые вызывают без какого-либо конкретного контекста, так и методы экземпляра, которые вызываются на конкретный объект этого типа (или подкласс).
Пока вы можете вызвать s.main(...)
, который фактически просто разрешит вызов статического метода Student.main
; вы не должны вызывать статические методы "через" выражения, подобные этому, поскольку это запутывает.
Ответ 2
Нет, это неплохая практика. Это на самом деле довольно часто. Что вы пропустили, так это то, что основным является статический метод. Это не метод объекта Студент. Это метод класса Стьюдента. Вы не вызываете его с помощью someStudent.main(...)
, но с Student.main(...)
.
Подробнее см. http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html.
Ответ 3
Это не плохо и не хорошо.
Это зависит от использования. В вашем примере конструктор вызывается из метода main()
, который по определению статичен, поэтому у вас нет другого выбора.
Еще одним примером "хорошего" использования этого шаблона является шаблон метода factory.
Enums используют этот метод также в методе valueOf()
(это пример метода factory).
Ответ 4
Это просто отлично.
Я знаю, что он выглядит немного рекурсивным, но происходит то, что метод main() вызывается при запуске этого класса из командной строки, а затем конструктор вызывается, когда вы фактически создаете экземпляр объекта. (См. Также комментарий Джона.)
Ответ 5
Это полностью отлично. Если член класса объявлен как статический, то он живет по-разному с каким-либо конкретным объектом класса. Его можно использовать сам по себе, не используя никаких объектов. ИЛИ это общее между различными объектами. Вы можете фактически подсчитать количество объектов, созданных из класса, установив статическую переменную в классе, например
class A
{
A()
{
count++
}
static count=0;
---
---
}
И каждый раз, когда объект A, созданный счетчик добавит его.
Так как статические методы не относятся к каким-либо объектам, особенно, вне класса, его называют classname.method()
как обычные методы называются classObject.method()