【问题标题】:Instantiating object from inside the main of that class in Java在Java中从该类的主体内部实例化对象
【发布时间】:2011-12-15 02:39:40
【问题描述】:

我正在查看我的 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会有main方法吗?

谢谢!

【问题讨论】:

    标签: java class object main instantiation


    【解决方案1】:

    这并没有错。这是完全正常的。 (诚​​然,具有 main 方法的类显然可以执行更有意义——Student 类中的main 方法没有多大意义。)

    对象并没有真正的方法——有方法,要么是在没有任何特定上下文的情况下调用的静态方法,要么是在该类型的特定对象(或子类)上调用的实例方法)。

    虽然您可以调用s.main(...),但实际上只会调用静态方法Student.main;您不应该像这样“通过”表达式调用静态方法,因为它会造成混淆。

    【讨论】:

    • 如果我们想运行位于同一个类上的其他方法,我们是否需要在 main 方法中创建 Student 类的实例,或者是否可以运行相同的其他方法只需说出方法名称即可。比如printResult();Student class的main方法里面
    • @KasunSiyambalapitiya:这取决于您是要在当前实例上还是在新实例上调用该方法——您希望它在哪个状态下工作?不要只考虑语言的规则你做什么——想想你想要的结果是什么。你不应该在没有理由的情况下创建对象。
    【解决方案2】:

    不,这不是坏习惯。它实际上相当频繁。你错过的是 main 是一个静态方法。它不是 Student 对象的方法。这是Student类的一种方法。您不能使用someStudent.main(...) 调用它,而是使用Student.main(...)

    更多解释请见http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

    【讨论】:

      【解决方案3】:

      这很好。

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

      【讨论】:

        【解决方案4】:

        没有好坏之分。

        这取决于使用情况。在您的示例中,构造函数是从定义为静态的 main() 方法调用的,因此您别无选择。

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

        【讨论】:

          【解决方案5】:

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

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

          并且每次A的一个对象,created count都会加一个。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-02-03
            • 1970-01-01
            • 2018-12-15
            • 1970-01-01
            • 2018-12-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多