静态变量(全局变量)如何成为Java中的对象?
好吧,马上,我知道这个问题要么听上去像常识,要么因为它的措辞而让人很困惑。不幸的是,由于我缺乏知识,即使经过大量的研究,我不知道如何表达它。据我目前的理解,静态变量并不引用类的实例,而是使用class.method调用来访问它们。声明为非静态和公共的变量是类的实例,可以使用object.method调用调用。然而,在最近的例子中,我看到了如下陈述:静态变量(全局变量)如何成为Java中的对象?,java,oop,static,instance,public,Java,Oop,Static,Instance,Public,好吧,马上,我知道这个问题要么听上去像常识,要么因为它的措辞而让人很困惑。不幸的是,由于我缺乏知识,即使经过大量的研究,我不知道如何表达它。据我目前的理解,静态变量并不引用类的实例,而是使用class.method调用来访问它们。声明为非静态和公共的变量是类的实例,可以使用object.method调用调用。然而,在最近的例子中,我看到了如下陈述: private static Rectangle rect; 为什么不直接写呢 public Rectangle rect; 这怎么可能?我认
private static Rectangle rect;
为什么不直接写呢
public Rectangle rect;
这怎么可能?我认为静态变量与类的实例没有关联对于静态和非静态的含义和限制/用法,我感到非常困惑。对于任何困惑,我深表歉意。如果这个问题无法回答,请提供一个简单区分静态使用和公共使用的链接。我是一个完全的初学者,所以请避免使用太多的技术术语。
提前感谢。
公共/受保护/私有
与静态
无关
静态
表示成员(无论是数据成员还是方法)属于类,而不是特定的实例
<代码>公共/受保护/私有/<代码>只需控制其他类可以访问这些成员,无论是实例成员还是“代码>静态< /代码>成员。
回答此差异,请考虑此示例: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实例,并且每个类都共享它。首先要了解差异,假设这类似于在某个类Foo中编写的
public class Foo{
private static Rectangle rect;
}
这意味着rect是Foo类的成员,它是私有的,不能从其他类访问。由于是静态的,您不需要创建对象,并且将在所有Foo实例中共享
public class Foo{
public Rectangle rect;
}
这意味着可以通过创建Foo实例从任何其他类访问rect
当静态不与任何对象关联时,这意味着您不需要为accessin静态变量及其在所有实例中的共享创建对象。
但是,private/public/Protected与其他类别的可见性相关。请考虑下面的
头等舱
和二等舱
:
public class FirstClass {
private static Rectangle rect;
// getters and setters
}
及
您可以创建任意数量的FirstClass
和SecondClass
实例。但是,由于static
关键字,这两个类对rect
的处理方式不同:
- 在
的情况下,FirstClass
是一个类变量,表示只有一个对rect
实例的引用。请注意,根据矩形
的实现情况,您可能需要实例化FirstClass
,也可能不需要实例化FirstClass
rect
- 在
的情况下,SecondClass
是一个实例变量,这意味着rect
的每个实例将始终引用SecondClass
矩形的一个实例。但是,除非实例化了
,否则这些引用不存在SecondClass
static
关键字创建属于类而不是类实例的字段和方法
是的,谢谢。在我发布问题并编辑它之后,我立即意识到了这一点。那么,非静态和静态之间的区别是什么呢?你能举出容易理解的例子吗?谢谢@Mureinik和其他愿意帮助我的人:)非静态意味着实例变量。它属于每个对象。这不是有点令人困惑吗?每个类共享意味着每个文件中的每个类都可以访问该变量(即使该类是一个包类),每个对象共享意味着该类的每个对象都可以访问该变量。
public class SecondClass {
private Rectangle rect;
// getters and setters
}