Java中的类变量和实例变量之间有什么区别?[关闭]


16

我对Java还是很陌生,想了解类变量和实例变量之间的区别。

例如:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

实例变量和类变量之间有何不同?这里的哪些变量是类变量,哪些是实例变量?这如何影响范围?


1
您似乎已经开始阅读《 Java™教程:理解类成员》,它解释了这一点,但是还没有完全理解它。

Answers:


35

它们都是成员变量,这意味着它们都与一个类相关联。当然,现在两者之间是有区别的:

实例变量:

这些变量属于(即对象)的实例。该类(对象)的每个实例都具有该变量的副本。对变量所做的更改不会反映在该类的其他实例中。

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


为什么要使用C#示例来解决Java问题?
Basile Starynkevitch

完全是我的想法。我只知道Java编程而不是C#,所以您并没有太大帮助
Skylar Adams

1
@BasileStarynkevitch我主要是C#开发人员,并且由于这两个原则都很重要,并且与同一个原则一样好,所以我很快提供了一个C#示例,这当然是我的错。:)将我的示例更改为Java。
阿巴斯2015年

2
@SkylarAdams对不起,我错误地认为认识Java的人都知道C#。我将示例更改为Java示例,希望对您有所帮助。
阿巴斯2015年

9
对于这种问题,无论使用Java还是C#,我认为都是不相关的
Thomas Junk

6

它说明此处(用一个例子Bicycle与类变量类numberOfBicycles和实例变量cadencespeedgearid):

有时,您希望拥有所有对象共有的变量。这可以通过static修饰符完成。static声明中带有修饰符的字段称为静态字段或类变量。它们与类关联,而不与任何对象关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但是也可以在不创建类实例的情况下操纵类变量。

类变量(声明为static)是所有实例共有的位置。

在示例中,numberOfBicycles是一个类变量(因为已声明static)。所有实例和该类只有一个这样的变量(即位置)。因此,如果您numberOfBicycles使用一种方法进行修改,其他方法将看到新值(即使对于不同的Bicycle对象)

相反,gearid实例变量(因为它们的声明没有static修饰符)。每个Bicycle对象都有自己的对象。如果您gearBicycle a进行某些修改,而b是另一个实例,则修改a.gearb.gear

每个Java对象都是一个不同的内存区域,其中包含一些元数据(例如,对其类的某些引用)和其自己的实例变量(可能是从超类继承的)。但是类变量是该类共有的,并由所有实例共享。

另请参阅对象(计算机科学)实例变量维基页面。


4

实例变量:

  • 实例变量在类中声明,但在方法,构造函数或任何块之外。
  • 实例变量属于类的实例,或者您可以说实例变量属于对象。
  • 实例变量具有该类的每个实例的单独值。

    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,测试

类变量:

  • 类变量属于该类。
  • 通过在变量之前添加“ static”关键字来创建类变量。
  • 也称为静态变量。
  • 并且最重要的类变量为类的所有实例维护一个共享值,即使该类的实例对象不存在也是如此。

        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

类变量和实例变量之间的简要区别:

  • 对于类的每个实例,实例变量具有单独的值。类变量为该类的所有实例维护一个共享值,即使该类的实例对象不存在也是如此。
  • 您将使用static关键字将实例变量更改为类变量。
  • 实例变量和类变量都在类级别上声明,而不是在方法内声明。

3

class variablesinstance变量之间的区别只是一个问题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关键字表示不同。

  • firstNamelastName实例变量,并绑定到该具体实例

  • numberOfPersons 绑定到该类,以便每个实例都可以访问此变量。

tl; dr

定义变量的位置是类定义。

类变量在类级别/在类级别是已知的,即每个具体实例都可以访问它。要定义类变量,请使用关键字static

实例变量仅在实例级别是已知的。您可以在不使用static关键字的情况下定义它们。

Java的更多文档在这里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.