当前位置: 首页 > 知识库问答 >
问题:

main类中使用的每个类都必须是静态的吗?[重复]

沈永新
2023-03-14

我是java的新手,但是在练习时,我突然想到,通过OOP设计,主类中的每个类都必须是静态的,对吧?在此代码中,我无法调用 main 中非静态的类(闪亮金属)。似乎我错过了为什么你会声明一个类是静态的。感谢您的帮助!

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

共有3个答案

柴彬
2023-03-14
匿名用户

不,它不必是静态。这只是因为您从静态方法(在这种情况下为main,它确实需要是静态)内部调用它。您可以先创建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());
  }
}

在网上试试看。

您也可以从非静态方法中调用它,但是您仍然需要< code>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());
  }
}

在网上试试看。

宰鸿博
2023-03-14

由于您的类是非静态嵌套类,因此它包含一个引用,即它的父类(在本例中为 Solution)。

因此,为了实例化ShinyMetal,您需要父级的实例(即解决方案

为了克服这个问题,您要么需要将ShinyMetal声明为static,要么实例化Solution

我建议您看一下这里的文档,它很好地解释了所有这些:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html

水睿
2023-03-14

主类中使用的每个类都必须是静态的吗?

号码

在你的情况下,问题不在于闪亮金属类不是静态的。问题在于,您正在创建一个非静态内部类的实例,而没有外部类的实例。

您需要外部类的实例(如果此代码位于外部类的实例上下文/方法中,则不需要此实例):

ShinyMetal abcd = new Solution().new ShinyMetal();

但是,如果您的内部类没有到外部类的任何链接,那么您可以简单地将ShinyMetal声明为静态嵌套类,这将允许您当前的代码工作。

 类似资料:
  • 问题内容: 我对Java完全不了解,但是在今晚练习时,我发现使用OOP设计时,主类中的每个方法都必须是静态的,对吗?在这段代码中,我无法在不是静态的类中调用方法。 似乎我可能遗漏了为什么要声明一个类是否为静态的问题。谢谢你的帮助! 问题答案: 您可以调用非静态方法,但是只能通过对象来调用。也就是说,您需要在给定对象上调用该方法。 您的主类也可以实例化,因此并非主类中的每个方法都必须是静态的。例如:

  • 开始使用JNI从C调用静态java方法。具体来说,在获得一个jclass(使用FindClass)和一个jmethodID(使用GetStaticMethodID)之后,我继续调用一系列CallStatic*MethodA例程。事实证明,所有这些例程都将jclass作为第一个参数。我开始想为什么需要类对象:因为所有信息都是在GetStaticMethodID中提供的,所以JVM似乎不需要类对象来完

  • 问题内容: 因此,问题或多或少是我写的。我知道可能还不清楚,所以我举一个例子。 我有Tree类,其中有Node类,并且Tree的空构造函数被编写为: Eclipse给我一个错误:空构造函数中的“ new RBTree()”没有“由于某些中间构造函数调用而导致RBTree类型的封闭实例不可用”。但是,如果将RBNode更改为静态类,则没有问题。 那么,为什么在类为静态的时候它可以工作。 顺便说一句,

  • 问题内容: 我写的是,我正在使用Netbeans向每个函数添加类似专业的注释。因此,我从每一个开始,然后按来让Netbeans完成用于以下功能的默认注释方案。 到现在为止,我一直只在PHP语言中使用它,在这种情况下,如果遵循PHP函数确实包含了声明,则Netbeans始终仅在注释方案中添加部分。在所谓的“过程”(不返回任何值的函数)上,缺少此部分。 今天,我为Javascript函数尝试了同样的事

  • 问题内容: 我似乎无法像从内部类内部那样从枚举内部访问周围类的实例成员。这是否意味着枚举是静态的?是否可以访问周围类的实例的范围,还是必须在需要的地方将实例传递给枚举的方法? 问题答案: 是的,嵌套枚举是隐式静态的。 嵌套枚举类型是隐式静态的。可以将嵌套枚举类型显式声明为静态。a

  • 问题内容: 每个Java程序都要求至少存在一个类。 以上说法总是正确的吗? 问题答案: 是的,您至少需要一个类才能拥有一个程序,但是 不需要 ,您不需要任何方法(与其他答案相反)。 需要一个类的原因是因为在Java中,所有代码都在类内部。因此,要获取任何代码,您需要一个类。但是,代码不一定需要包含在方法中。它也可以在初始化器中。因此,这是一个没有方法的完整Java程序: 那给… 编辑:从Java