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

时间:2011-10-25 16:36:07

标签: java class object main instantiation

我正在查看我的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);
    }
}

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

谢谢!

5 个答案:

答案 0 :(得分:17)

这完全没有错。这完全正常。 (不可否认,对于具有主要方法的类而言,显然执行的方法更有意义 - main类中的Student方法没有那么多感。)

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

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

答案 1 :(得分:15)

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

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

答案 2 :(得分:3)

这很好。

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

答案 3 :(得分:2)

既不坏也不好。

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

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

答案 4 :(得分:1)

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

 class   A
     {
         A()
          {
           count++
           }

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

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

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