静态变量(全局变量)如何成为Java中的对象?

时间:2014-12-20 16:03:46

标签: java oop static instance public

好的,不管怎样,我知道这个问题听起来像是常识,或者由于其措辞而非常混乱。不幸的是,由于我经过大量研究后缺乏知识,我不确定如何表达它。据我所知,静态变量不是指类的实例,而是使用class.method调用来访问它们。声明为非静态的变量和public是类的实例,可以使用object.method调用来调用。但是,在最近的例子中,我看到了如下语句:

private static Rectangle rect; 

为什么不写

public Rectangle rect;

这怎么可能?我认为静态变量与类的实例无关? 我对静态与非静态的含义和限制/用法感到非常困惑。我为任何困惑道歉。如果这个问题无法回答,那么提供静态和公共使用之间简单区分的示例的链接将非常受欢迎。我是一个完整的初学者,所以请避免使用太多的技术术语。 提前谢谢。

4 个答案:

答案 0 :(得分:7)

public/protected/privatestatic无关。

static表示成员(无论是数据成员还是方法)属于,而不属于特定的实例

public/protected/private只需控制其他类可以访问这些成员,无论是实例成员还是static成员。

答案 1 :(得分:1)

考虑以下FirstClassSecondClass

public class FirstClass {
    private static Rectangle rect;
    // getters and setters
}

public class SecondClass {
    private Rectangle rect; 
    // getters and setters
}

您可以根据需要创建FirstClassSecondClass的任意数量的实例。但是,rectstatic关键字而被两个类区别对待:

  • 如果是FirstClassrect类变量,请注意只有一个Rectangle实例的引用。请注意,根据FirstClass的实施情况,您可能需要或可能不需要实例化FirstClass,但是引用了rect
  • 如果是SecondClassrect是一个实例变量,意味着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与其他类的可见性有关。