Java OOP基础知识

时间:2014-05-02 13:56:33

标签: java oop static inner-classes

我有一个问题让我无法继续前进,这个错误在我看来根本不符合逻辑,我从一本书中学习,代码来自那里。 这是代码:

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

    }



}

这是错误 enter image description here

如果我从void main中消除了静态,那么错误就会消失,但这样做我正在改变主方法的签名......我真的很困惑,跟着书中的代码一字一句地跟着。

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

1 个答案:

答案 0 :(得分:5)

你将SimpleCircle定义为一个内部类,这是一个不必要的复杂功能,它是保持编译的原因。从clzzz声明中移出SimpleCircle类声明,你就可以解决问题。

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

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

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

使某些东西成为非静态内部类意味着内部类的对象正在访问外部类的范围内的东西。实例,所以你不能创建一个内部类的实例,而不需要引用外部类的实例,这就是编译器所抱怨的内容。