好的,不管怎样,我知道这个问题听起来像是常识,或者由于其措辞而非常混乱。不幸的是,由于我经过大量研究后缺乏知识,我不确定如何表达它。据我所知,静态变量不是指类的实例,而是使用class.method调用来访问它们。声明为非静态的变量和public是类的实例,可以使用object.method调用来调用。但是,在最近的例子中,我看到了如下语句:
private static Rectangle rect;
为什么不写
public Rectangle rect;
这怎么可能?我认为静态变量与类的实例无关? 我对静态与非静态的含义和限制/用法感到非常困惑。我为任何困惑道歉。如果这个问题无法回答,那么提供静态和公共使用之间简单区分的示例的链接将非常受欢迎。我是一个完整的初学者,所以请避免使用太多的技术术语。 提前谢谢。
答案 0 :(得分:7)
public/protected/private
与static
无关。
static
表示成员(无论是数据成员还是方法)属于类,而不属于特定的实例。
public/protected/private
只需控制其他类可以访问这些成员,无论是实例成员还是static
成员。
答案 1 :(得分:1)
考虑以下FirstClass
和SecondClass
:
public class FirstClass {
private static Rectangle rect;
// getters and setters
}
和
public class SecondClass {
private Rectangle rect;
// getters and setters
}
您可以根据需要创建FirstClass
和SecondClass
的任意数量的实例。但是,rect
因static
关键字而被两个类区别对待:
FirstClass
,rect
是类变量,请注意只有一个Rectangle
实例的引用。请注意,根据FirstClass
的实施情况,您可能需要或可能不需要实例化FirstClass
,但是引用了rect
。SecondClass
,rect
是一个实例变量,意味着SecondClass
的每个实例始终都会引用Rectangle
的实例。但是,除非SecondClass
被实例化,否则这些引用不存在。我建议您在官方Java教程中阅读Understanding Class Members。从第一行开始:
static
关键字,用于创建属于该类的字段和方法,而不是该类的实例。
答案 2 :(得分:0)
要回答这个差异,请考虑以下示例:
class MyClass {
public static Rectangle rect = new Rectangle();
public Rectangle rect1;
public MyClass(Rectangle rect1) {
this.rect1 = rect1
}
}
现在,如果我喜欢:
MyClass clazz1 = new MyClass(new Rectangle());
MyClass clazz2 = new MyClass(new Rectangle());
你看到多少个rect实例和多少个rect1?你可以让rect1与每个对象相关联,而你只有一个rect实例并被每个类共享。
答案 3 :(得分:0)
首先要解决不同之处,假设这就像写在某个类Foo中一样,
public class Foo{
private static Rectangle rect;
}
这意味着rect是Foo类的成员,它是私有的,不能从其他类访问。并且是静态的,你不需要创建对象,并且将在Foo的所有实例中共享。
public class Foo{
public Rectangle rect;
}
这意味着可以通过创建Foo实例从任何其他类访问rect。
当我们静态不与任何对象相关联时,它意味着您不需要为访问静态变量创建对象,并且它共享所有实例。 但是,private / public / proctected与其他类的可见性有关。