【问题标题】:Java OOP basicsJava OOP 基础知识
【发布时间】:2014-06-19 05:51:27
【问题描述】:

我有一个问题一直阻碍我进一步前进,我认为这个错误根本不合逻辑,我正在从一本书中学习,代码来自那里。 这是代码:

package test_area;

public class clzzz {

    class SimpleCircle{
        double radius;

        SimpleCircle()
        {
            radius = 1;
        }

        SimpleCircle(double newRadius)
        {
            radius = newRadius;
        }

        double getArea()
        {
            return radius*radius*Math.PI;
        }

        double getPerimeter()
        {
            return 2*radius*Math.PI;
        }

        void setRadius(double newRadius)
        {
            radius = newRadius;
        }

    }


    public static void main(String[] args)
    {
        SimpleCircle circle1 = new SimpleCircle();

    }



}

这是错误

如果我从 void main 中消除静态,错误就会消失,但是这样做我正在改变 main 方法的签名.....我真的很困惑,逐字遵循书中的代码。

为什么我需要静态标签?我不需要强制相应的类只有一个实例,因为我可以通过对象的名称来控制它的实例,因此静态只是一个障碍?

【问题讨论】:

  • 你应该使用 static class SimpleCircle{.
  • 你有一个内部类。这需要外部类的实例。你没有这样的实例。
  • 使用内部类有时会有所帮助,但默认应该是;一个 class== 一个文件。虽然 clzzz 类似乎什么也没做
  • 知道了,谢谢提醒。

标签: java oop static inner-classes


【解决方案1】:

你将 SimpleCircle 定义为一个内部类,这是一个不必要的复杂性,它是阻止它编译的原因。将 SimpleCircle 类声明从 clzzz 的声明中移出,您将解决问题。

或者,您可以通过添加 static 关键字使 SimpleCircle 成为静态内部类。如果您将其保留为静态内部类,那么如果您可以在 clzzz 之外使用它,则需要使用外部类和内部类 (clzzz.SimpleCircle) 来引用它,以便 JVM 可以找到它.

通常静态内部类用于组织目的,因为您有一些与另一个类一起使用的东西,但它不依赖于它(例如see java.util.Map.Entry,尽管它是一个接口而不是一个类)。

static 并不意味着您只能拥有一个实例。在类定义的上下文中,这意味着不依赖于外部类的实例。您仍然可以使用静态内部类创建多个实例(再次考虑 Map 和 Map.Entry,您可以在其中迭代映射的所有条目,每个条目都是 Map.Entry 的单独实例)。您可以将static 的含义视为“您不需要从定义此事物的类中实例化的对象。”

将某事物设为非静态内部类意味着内部类的对象正在访问外部类实例范围内的事物,因此您无法在没有引用外部类实例的情况下创建内部类的实例类,这就是编译器所抱怨的。

【讨论】:

  • “替代”部分就是答案。无论是否默认,您都可以定义内部类,这不是按定义错误编码。
  • @Bart:这会起作用,它是答案的重要部分,所以我把它包括在内。但是对于 OP 来说,取消嵌套这些东西更简单,因为他没有从嵌套它们中获得任何好处。
  • 更重要的是,这里有一个教训:仅仅因为它在书中并不意味着作者会费心确保它有效。 :-)
猜你喜欢
  • 2011-07-05
  • 2011-06-01
  • 2013-03-23
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2018-05-25
相关资源
最近更新 更多