在Java中从该类的主要内部实例化对象

我正在查看我的OOP类文档,我发现了这个例子:

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

我发现它们正在从同一个类的主要实例化一个对象时感到困惑。 这被认为是不好的做法吗? 新创建的对象是否有主方法?

谢谢!

这完全没有错。 这完全正常。 (不可否认,对于一个主要方法的类来说,显然可以执行的东西更有意义 – Student类中的main方法没有那么多意义。)

对象实际上没有方法 – 具有方法,无论是在没有任何特定上下文的情况下调用的静态方法,还是在该类型(或子类)的特定对象上调用的实例方法。

虽然你可以调用s.main(...)实际上只是解析对静态方法Student.main的调用; 你不应该像这样调用静态方法“via”表达式,因为它令人困惑。

不,这不是不好的做法。 它实际上相当频繁。 你错过的主要是静态方法。 它不是Student对象的方法。 这是Student课程的一种方法。 您不能使用someStudent.main(...)调用它,但使用Student.main(...)

有关更多说明,请参阅http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html 。

既不坏也不好。

这取决于用途。 在您的示例中,构造函数是从main()方法调用的,根据定义是静态的,因此您没有其他选择。

另一个“良好”使用该模式的例子是工厂方法模式。 枚举也在valueOf()方法中使用这种技术(这也是工厂方法的一个例子)。

这很好。

我知道它看起来有点递归,但是当你从命令行启动这个类时会调用main()方法,然后在实际实例化对象的实例时调用构造函数。 (也见Jon的评论。)

它完全没问题。如果一个类的成员被声明为静态,那么它就是一个实体,它与该类的任何特定对象的生活方式不同。它可以单独使用,不使用任何对象。 或者它在不同的对象之间是通用的。您实际上可以通过在类中设置静态变量来计算从类创建的对象的数量

  class A { A() { count++ } static count=0; --- --- } 

并且每次创建计数的A对象都会添加一个。

由于静态方法特别不属于任何对象,因此在类之外,它被称为classname.method() ,就像普通方法一样,被称为classObject.method()