第19节 Java实例成员和类成员
实例变量和类变量的声明
在之前的学习类的时候我们知道类体中包括成员变量的声明和方法的定义,而成员变量又可以细分为实例变量和类变量。在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量,静态变量)。
class Dog {
float x; //实例变量
static int y; //类变量
}
实例变量和类变量的区别
1.不同对象的实例变量互不相同
我们已经知道,一个类通过使用new运算符可以创建多个不同的对象,这些对象将被分配不同的成员变量。再准确的说,就是分配给不同对象的实例变量占有不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的实例变量。
2.所有对象共享类变量
如果类中有类变量,当使用new运算符创建多个不同的对象时,分配给这些对象的类变量占有相同的一处内存,改变其中一个对象的类变量就会影响其他对象的类变量。
3.通过类名直接访问类变量
当Java程序执行时,类的字节码文件被加载到内存中,如果该类还没有创建对象,那么类中的实例变量就不会被分配内存。但是,类中的类变量,在该类被加载到内存中时,就分配了相应的内存空间。如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,但是类变量就不再重新分配内存,所有的对象共享类变量,即所有的对象的类变量是相同的一处内存空间,类变量的内存空间直到程序退出运行,才会释放所占有的内存。
示例
Ladder.Java
简便快速生成成员变量的get和set方法,鼠标右击空白处–Source–Getters and Setters
public class Ladder { //梯形
double top; // 实例变量
static double bottom; // 类变量
public double getTop() { //与对应变量关联起来的get方法和set方法
return top;
}
public void setTop(double top) {
this.top = top;
}
public static double getBottom() {
return bottom;
}
public static void setBottom(double bottom) {
Ladder.bottom = bottom;
}
}
Demo17
public class Demo17 {
public static void main(String[] args) {
Ladder.bottom = 100; //下底100
Ladder ladder1 = new Ladder(); //声明两个梯形对象
Ladder ladder2 = new Ladder();
ladder1.setTop(50); //设置 ladder1上底为50
ladder2.setTop(60); //设置 ladder2上底为60
System.out.println("ladder1的上底:"+ladder1.getTop());
System.out.println("ladder2的上底:"+ladder2.getTop());
System.out.println("ladder1的下底:"+ladder1.getBottom());
System.out.println("ladder2的下底:"+ladder2.getBottom());;
}
}
实例方法和类方法的定义
类中的方法也可分为实例方法和类方法。方法声明时,方法类型前面不加关键字static修饰的是实例方法、加static关键字修饰的是类方法(静态方法)。
class A {
int a;
float max(float x,float y) { //实例方法
…
}
static float jerry() { //类方法
…
}
static void speak(String s) { //类方法
…
}
}
实例方法和类方法的区别
1.对象调用实例方法
当对象调用实例方法时,该方法中出现的实例变量就是分配给该对象的实例变量;该方法中出现的类变量也是分配给该对象的变量,只不过这个变量和所有的其他对象共享而已。
2.类名调用类方法
类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。和实例方法不同的是,类方法不可以操作实例变量,这是因为在类创建对象之前,实例成员变量还没有分配内存。
示例
public class Demo17 {
public static void main(String[] args) {
Ladder.bottom = 100;
Ladder ladder1 = new Ladder();
Ladder ladder2 = new Ladder();
ladder1.setTop(50);
ladder2.setTop(60);
System.out.println("ladder1的上底:"+ladder1.getTop());
System.out.println("ladder2的上底:"+ladder2.getTop());
System.out.println("ladder1的下底:"+ladder1.getBottom());
System.out.println("ladder2的下底:"+ladder2.getBottom());
System.out.println("1-10之和:"+Sum.getSum(1, 10));
}
}
class Sum{
static int getSum(int start,int end){
int sum =0;
for(int i=start;i<end;i++){
sum+=i; //等于sum=sum+i
}
return sum;
}
}