Answers:
它们都是成员变量,这意味着它们都与一个类相关联。当然,现在两者之间是有区别的:
实例变量:
这些变量属于类(即对象)的实例。该类(对象)的每个实例都具有该变量的副本。对变量所做的更改不会反映在该类的其他实例中。
public class Product {
public int Barcode;
}
类变量:
这些也称为静态成员变量,并且该变量只有一个副本与该类的所有实例共享。如果对该变量进行了更改,则所有其他实例将看到更改的效果。
public class Product {
public static int Barcode;
}
完整示例:
// INSTANCE VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.Barcode = 123456;
Product prod2 = new Product();
prod2.Barcode = 987654;
System.out.println(prod1.Barcode);
System.out.println(prod2.Barcode);
}
}
public class Product {
public int Barcode;
}
输出将是:
123456
987654
现在,通过使其变为静态将实例变量更改为类变量:
//CLASS VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.setBarcode(123456);
Product prod2 = new Product();
prod2.setBarcode(987654);
System.out.println(prod1.getBarcode());
System.out.println(prod2.getBarcode());
}
}
public class Product {
public static int Barcode;
public int getBarcode() {
return Barcode;
}
public void setBarcode(int value){
Barcode = value;
}
}
我使用非静态方法来获取和设置值,Barcode
以便能够从对象而不是从类调用它。输出如下:
987654
987654
它说明此处(用一个例子Bicycle
与类变量类numberOfBicycles
和实例变量cadence
,speed
,gear
&id
):
有时,您希望拥有所有对象共有的变量。这可以通过
static
修饰符完成。static
声明中带有修饰符的字段称为静态字段或类变量。它们与类关联,而不与任何对象关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但是也可以在不创建类实例的情况下操纵类变量。
类变量(声明为static
)是所有实例共有的位置。
在示例中,numberOfBicycles
是一个类变量(因为已声明static
)。所有实例和该类只有一个这样的变量(即位置)。因此,如果您numberOfBicycles
使用一种方法进行修改,其他方法将看到新值(即使对于不同的Bicycle
对象)
相反,gear
&id
是实例变量(因为它们的声明没有static
修饰符)。每个Bicycle
对象都有自己的对象。如果您gear
对Bicycle
a进行某些修改,而b是另一个实例,则修改a.gear
对b.gear
每个Java对象都是一个不同的内存区域,其中包含一些元数据(例如,对其类的某些引用)和其自己的实例变量(可能是从超类继承的)。但是类变量是该类共有的,并由所有实例共享。
实例变量:
实例变量具有该类的每个实例的单独值。
Class InstanceDemo {
// this instance variable is visible for any child class.
public String name = "Testing";
// count variable is visible in Demo class only.
private int count = 2;
}
访问实例变量的方法:
InstanceDemo demo = new InstanceDemo (); System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );
输出: 2,测试
类变量:
并且最重要的类变量为类的所有实例维护一个共享值,即使该类的实例对象不存在也是如此。
Class ClassDemo {
// count variable is Same for all instance of this class
public static int count = 2;
}
访问类变量的方法:
System.out.println("Access Class variable: " + ClassDemo.count ); //class variable is directly refer with class name
输出2
类变量和实例变量之间的简要区别:
class variables
和instance
变量之间的区别只是一个问题who knows what?
。
An instance variable
仅对该具体实例已知(= 绑定),因此为名称。
public class Person {
private String firstName;
private String lastName;
[...]
}
类的定义就像构建具体对象的蓝图。也许这一点使您感到困惑。但是用这种方式编写,每个变量都将绑定到其具体对象:例如,每个人都有自己的名字
class variable
另一方面,顾名思义,班级的每个成员都知道A。或技术上:在类级别是已知的/绑定的。典型的例子是您创建了多少个对象的计数器 -尽管这是一个非常有问题的例子。但这在初期并不重要。
public class Person {
private String firstName;
private String lastName;
[...]
static int numberOfPersons = 0
}
numberOfPersons
声明了static
这是区分class variables
和之间的关键字instance variabes
。变量与类定义中的其他变量一样进行声明。但是static
关键字表示不同。
firstName
,lastName
是实例变量,并绑定到该具体实例
numberOfPersons
绑定到该类,以便每个实例都可以访问此变量。
定义变量的位置是类定义。
类变量在类级别/在类级别是已知的,即每个具体实例都可以访问它。要定义类变量,请使用关键字static
。
实例变量仅在实例级别是已知的。您可以在不使用static
关键字的情况下定义它们。
Java的更多文档在这里