我正在查看我的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
是否有主方法?
谢谢!
答案 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()