Java OOP基础知识
我有一个问题,一直阻碍我进一步推进,这个错误在我看来根本不符合逻辑,我从一本书中学习,代码来自那里。 这是代码:
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中消除静态,那么错误就会消失,但这样做我正在改变主方法的签名…..我真的很困惑,一步一步跟着书中的代码。
为什么以上帝的名义,我需要静态标签? 我不需要强制相应的类只有一个实例,因为我可以通过对象的名称来控制它的实例,因此静态只是一个障碍?
你将SimpleCircle定义为一个内部类,这是一个不必要的复杂问题,它是保持编译的原因。 从clzzz声明中移出SimpleCircle类声明,你就可以解决问题了。
或者,您可以通过添加static关键字使SimpleCircle成为静态内部类。 如果你把它保存为静态内部类,那么,如果你可以在clzzz之外使用它,你需要使用外部类和内部类(clzzz.SimpleCircle)来引用它,以便JVM可以找到它。
通常,静态内部类用于组织目的,因为你有一些东西和另一个类一起使用但它不依赖于它( 参见java.util.Map.Entry
作为一个例子,虽然它是一个接口而不是一个类) 。
static
并不意味着你只能有一个实例。 在类定义的上下文中,它意味着不依赖于外部类的实例。 您仍然可以使用静态内部类创建多个实例(再次考虑Map和Map.Entry,您可以在其中迭代地图的所有条目,每个条目都是Map.Entry的单独实例)。 您可以将static
视为含义,“您不需要从定义此事物的类实例化对象。”
使某些东西成为非静态内部类意味着内部类的对象正在访问外部类实例范围内的事物,因此如果没有引用外部类的实例,则无法创建内部类的实例,并且这就是编译器所抱怨的。