前言:类是对象的抽象,对象是类的实例,对象有自己的属性和方法,万物皆对象,不可避免的,类也是一种对象,也有它自己的方法和属性,类的成员称为静态成员,包括静态数据和静态方法,而类实例化出的对象的成员称为实例成员。

实例成员和类成员JAVA 什么是类的实例成员_实例成员和类成员JAVA

  静态成员(static member):又叫类成员,指的是在成员类型或返回值类型前用static关键字修饰的变量或方法,包括静态数据和静态方法,静态成员存储在线程堆栈中,在类被加载到内存中时;
  实例成员(instance member):又称非静态成员、对象成员,是没有用static修饰的变量或方法,包括实例数据和实例方法,引用存在线程堆栈中,对象存在托管堆中
不同点:表面看就是有没有被static修饰,其次是在内存分配上,类加载时,静态成员只只分配一次,有且只有一份存储空间。而对于实例成员,每产生一个实例都要重新分配一个存储空间。

  特点之静态成员:
  1)静态成员(包括静态数据和静态方法)必须由类名调用,不能使用对象调用(静态数据可以由实例方法调用)。
  2)静态数据属于类的级别,当类加载时,一个静态数据在内存只分配一个存储空间,无论new出多少个实例,它也只是有那一个空间。
  3)静态方法只能调用静态数据,不能调用对象。
  特点之实例成员:
  1)实例成员(包括实例数据和实例方法)必须通过对象来调用,不能使用类名调用。
  2)类的实例数据属于类的实例级别,每新创建一个对象,都会在内存中为实例成员开辟一块新的存储空间。
  3)实例方法可以调用实例数据和静态数据。
  附:我们在C#中经常使用的WriteLine等方法都是静态成员,是直接调用类名Console来使用的。
  让我们来用代码来说明方法对数据的调用情况:

1. class Demo 
 2. 
 3. { 
 4. int a; // 实例数据 
 5. static int b; // 静态数据 
 6. void A() // 实例方法 
 7. 
 8. { 
 9. a = 1; // 正确:实例方法可以调用实例数据 
 10. b = 1; // 正确:实例方法可以调用静态数据 
 11. } 
 12. 
 13. static void B() // 静态方法 
 14. 
 15. { 
 16. a = 1; // 错误:静态方法不能调用实例数据 
 17. b = 1; // 正确:静态方法可以调用静态数据 
 18. } 
 19. 
 20. static void Main() // 静态方法 
 21. { 
 22. Demo d = new Demo(); // 实例化对象 
 23. d.a = 1; // 正确:实例可以调用实例数据 
 24. d.b = 1; // 错误:实例不能调用静态数据 
 25. Demo.a = 1; // 错误:类名不能调用实例数据 
 26. Demo.b = 1; // 正确:类名可以调用静态数据 
 27. d.A(); // 正确:实例可以调用实例方法 
 28. d.B(); // 错误:实例不能调用静态方法 
 29. Demo.A(); // 错误:类名不能调用实例方法 
 30. Demo.B(); // 正确:类名可以调用静态方法 
 31. } 
 32. }


  另外,让我们来用代码说明一下,静态数据只使用一块内存空间:

1. public class Demo 
 2. 
 3. { 
 4. static int count=0; //定义静态数据count 
 5. int number=0; //定义实例数据number 
 6. public Demo() 
 7. { 
 8. number =number+ 1; 
 9. count = count + 1; 
 10. } 
 11. 
 12. public void show() 
 13. { 
 14. Console.WriteLine(“number={0} : count={1}”, number, count); 
 15. } 
 16. } 
 17. 
 18. class Test 
 19. { 
 20. public static void Main() 
 21. { 
 22. Demo a = new Demo(); 
 23. a.show(); 
 24. Console.WriteLine(“*****”); 
 25. Demo b = new Demo(); 
 26. b.show(); 
 27. Console.WriteLine(“*****”); 
 28. Demo c = new Demo(); 
 29. c.show(); 
 30. } 
 31. }

  输出结果为:
    number=1 : count=1
    **********
    number=1 : count=2
    **********
    number=1 : count=3

  可以看出:静态数据的值是随着实例化出的对象数目而改变的,每增加一个实例化对象都会使静态数据值+1,所以所有的对象都是使用的同一个静态数据,即证明了静态数据公用一块内存空间,而每个对象的实例数据都相同,说明每实例化一次都会开辟一块新的内存空间。

文章部分资料来源于网络上,谢谢作者的无私奉献.