我对Java完全不了解,但是在实践的过程中,我发现使用OOP设计时,主类中的每个类都必须是静态的,对吗?在这段代码中,没有办法让我在main中调用不是静态的类(ShinyMetal)。似乎我可能遗漏了为什么将类声明为静态或不声明静态的地方。谢谢你的帮助!
public class Solution {
public class ShinyMetal {
}
public static void main(String[] args) {
ShinyMetal abcd = new ShinyMetal(); // error cannot be referenced from static context
System.out.println(abcd.toString());
}
}
答案 0 :(得分:0)
主类中使用的每个类都必须是静态的吗?
否。
就您而言,问题不是ShinyMetal
类不是静态的。问题在于您正在创建一个非静态内部类的实例,而没有外部类的实例。
您需要一个外部类的实例(如果此代码在外部类的实例上下文/方法中,则不需要此实例):
ShinyMetal abcd = new Solution().new ShinyMetal();
但是,如果您的内部类没有任何与外部类的链接,那么您可以简单地将ShinyMetal
声明为静态嵌套类,这将使您当前的代码正常工作。
答案 1 :(得分:0)
由于您的类是一个非静态嵌套类,因此它包含一个引用及其父类(在这种情况下为Solution
)。
因此,要实例化ShinyMetal
,您需要一个父实例(即Solution
)。
为了克服这一点,您需要将ShinyMetal
声明为静态,或实例化Solution
才能对其进行访问。
我建议您查看此处的文档,该文档很好地解释了所有这些内容:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html
答案 2 :(得分:0)
否,它不一定是static
。这仅是因为您是从static
方法内部调用的(在这种情况下为main
,它实际上必须为static
)。您可以先创建Solution
类的实例,在这种情况下,ShinyMetal
不必是静态的:
public class Solution {
public class ShinyMetal {
}
public static void main(String[] args) {
Solution solution = new Solution();
ShinyMetal abcd = solution.new ShinyMetal(); // No longer gives an error
System.out.println(abcd.toString());
}
}
您还可以从非静态方法中调用它,但是您仍然需要Solution
的实例才能调用该方法,
class Solution {
class ShinyMetal {
}
public static void main(String[] args) {
Solution solution = new Solution();
solution.createAndPrintShinyMetal();
}
private void createAndPrintShinyMetal(){
ShinyMetal abcd = new ShinyMetal();
System.out.println(abcd.toString());
}
}