Java类中的成员(属性和方法)可以分成两种,分别是实例成员和类成员。
一、什么是实例成员和类成员?
实例成员中是属于对象的,即属于对象级别的,它包括实例成员属性(也称为实例成员变量)和实例成员方法,只有创建了对象之后才能访问实例成员属性和实例成员方法。
类成员是属于类的,类成员包括类成员属性(也称为类成员变量)和类成员方法,通过类名可以直接访问类成员变量和调用类成员方法。类成员不需要伴随对象,也就是说即使没有创建对象,也能够引用类成员,类成员也可以通过对象引用。类成员需要用关键字static标识,也称为静态成员。
1、声明的差别:没有使用static声明的为实例成员属性,用static 声明的为类成员属性。
例如:
private static x; //类成员变量
private int y; //实例成员变量
2、存储结构的差别:对于实例变量而言,每个对象的每个实例成员变量都分配了一个存储单元使得不同对象的实例成员变量具有不同的值;而对于类成员变量只分配一个存储单元,使得所有的对象共同使用一个类成员变量。
3、引用方式的差别: 实例成员变量对于对象,通过对象进行访问;类成员变量属于类,既可以通过对象,也可以通过类访问。三、使用注意事项:
类方法中,不能访问或使用实例成员。
例如:
private int count; //实例成员变量
private static setCount(){
count++;
} //类成员方法
这是错误的用法,正确的用法是:
private static int count; //类成员变量
private static setCount(){
count++;
} //类成员方法
四、具体例子
创建一个动物类Animal,简单的设置了legs和kind两个属性,并且添加了count这个类成员来记录动物的数量。接着创建继承Animal类的两个子类Lion和Fish,其中也设置了类成员count来记录该类动物的数量。详细代码如下:
Animal.java
public class Animal{ private int legs; //实例成员变量 private String kind; //实例成员变量 private static count; //类成员变量 //无参数构造函数 public Animal(){ setLegs(4); count++; } //带参数构造函数 public Animal(int l){ setLegs(l); count++; } //设置实例对象的腿数目的实例成员方法 public void setLegs(int l){ if( l!=0 && l!=2 && l!=4){ System.out.println("Wrong number of legs! "); return; } legs = l; } //获取实例对象的腿数目的实例成员方法 public int getLegs(){ return legs; } //设置实例对象的类型的实例成员方法 public void setKind(String k){ kind = k; } //获取实例对象的类型的实例成员方法 public String getKind(){ return kind; } //获取对象数目的类成员方法 public static int getCount(){ return count; } }
Lion.javapublic class Lion extends Animal{ private static int count; //设置类成员变量记录Lion实例的数量 public Lion(){ setLegs(4); setKind("Lion"); count++; } //获取Lion的数目的类成员方法 static public int getCount(){ return count; } }Fish.java
public class Fish extends Animal{ private static int count; //设置类成员变量记录Fish实例的数量 public Fish(){ setLegs(0); setKind("Fish"); count++; } //获取Fish的数目的类成员方法 static public int getCount(){ return count; } }主类,zoo.java
public class zoo { public static void main(String arg[]){ Animal annimal = new Animal(); Fish fish1 = new Fish(); Fish fish2 = new Fish(); Fish fish3 = new Fish(); Fish fish4 = new Fish(); Lion lion1 = new Lion(); Lion lion2 = new Lion(); System.out.println("Total Animal:" + Animal.getCount()); System.out.println("Total Fish:" + Fish.getCount()); System.out.println("Total Lion:" + Lion.getCount()); } }
运行结果:
Total Animal:7
Total Fish:4
Total Lion:2
五、总结
实例成员是伴随着对象而存在的,而类成员是伴随类而存在的。可以不需要对象就可以直接使用类成员,因为类一直存在在那里,但是实例成员就不行。如果在类方法中使用了实例成员。那么Java在编译时就会报错。 而实例对象是可以访问类成员的,但是要注意,当改变类成员的数据时,所有使用到这个类成员的对象都会受到影响。就拿前面的例子说,如果你跑到动物园的管理室去改动物的数量记录时,后面的人都会看到这项修改。相反的,对于实例成员来说是每个对象各自拥有的,例如legs属性,你修改了某个对象的legs属性值,不会影响到其他对象的legs属性值。就像动物园中某只动物断了一只脚,其他动物不会受到影响。
参考《JAVA SE6 全方位学习》