1、在Java中 变量 分为 成员变量 与 局部变量 ;而 实例变量与类变量 都属于 成员变量;
2、类变量 也称为 static 变量、静态变量;
3、在声明成员变量时,用关键字 static 给予修饰的称为 类变量 ,否则称为 实例变量 ;
如下代码演示: test 属于 类变量 ; testone 属于 实例变量 ;
public class Static_Test {
//类变量与实例变量
static int test ; //类变量
double testone ; //实例变量
}
注意: static 关键字要放在变量类型的前面 ,如 : int static test ; //是错误的
一、不同对象的实例变量互不相同 ;
1、即分配给不同对象的实例变量,他们分别占有不同的内存空间,改变其中一个对象的实例变量不会影响其他对象的实例变量;
如下代码演示:
public class Static_Test {
double testd; //声明实例变量 testd
public static void main(String[] args) {
Static_Test st1 = new Static_Test();
Static_Test st2 = new Static_Test();
//测试不同对象的实现变量互不相同 ;
st1.testd = 11.11 ;
st2.testd = 111.111 ;
System.out.println("对象st1的值="+st1.testd);
System.out.println("对象st2的值="+st2.testd);
//改变其中一个对象的实例变量的值
st1.testd = 1.1;
System.out.println("对象st1的值="+st1.testd);
System.out.println("对象st2的值="+st2.testd);
}
}
以上代码输出结果:
对象st1的值=11.11
对象st2的值=111.111
对象st1的值=1.1
对象st2的值=111.111
由此可见,改变了对象 st1 的实例变量 testd 的值为1.1 ,但是对象 ts2 的实例变量 testd 的值没有受到影响,还是 111.111
二、所有对象共享类变量 ;
1、即创建不同对象时,分配给这些对象的类变量占有相同的一处内存,改变其中一个对象的类变量也会影响其他对象的类变量;
如下代码演示:
public class Static_Test {
//测试不同对象的类变量相同 ;
static double test1 ; //类变量test1
public static void main(String[] args) {
Static_Test st1 = new Static_Test();
Static_Test st2 = new Static_Test();
//测试不同对象的类变量相同 ;
st1.test1 = 11.11 ;
System.out.println("对象st1的值="+st1.test1);
System.out.println("对象st2的值="+st2.test1);
st2.test1 = 111.111 ;
System.out.println("对象st1的值="+st1.test1);
System.out.println("对象st2的值="+st2.test1);
}
}
以上代码输出结果:
对象st1的值=11.11
对象st2的值=11.11
对象st1的值=111.111
对象st2的值=111.111
由此可见,当改变其中一个对象的类变量也会影响其他对象的类变量;
三、通过类名直接访问类变量
1、即类中的类变量,在类被加载到内存时,就分配了相应的内存空间,而不会等类创建对象后才分配相应的内存空间;
2、实例变量则是等类创建对象后才分配相应的内存空间;
如下代码演示:
public class Static_Test {
//测试不同对象的类变量相同 ;
static double test1 ; //类变量test1
public static void main(String[] args) {
Static_Test st1 = new Static_Test();
//测试通过对象名来访问类变量
st1.test1 = 11.11 ;
System.out.println("对象st1的值="+st1.test1);
//测试通过类名来访问类变量
Static_Test.test1 = 123.123 ;
System.out.println("对象st1的值="+st1.test1);
System.out.println("类Static_Test的值="+Static_Test.test1);
}
}
以上代码输出结果:
对象st1的值=11.11
对象st1的值=123.123
类Static_Test的值=123.123
1、在类中 方法 可分为 实例方法 与 类方法 ;
2、类方法 也称为 static 方法、静态方法;
3、在声明方法时,用关键字 static 给予修饰的称为 类方法 ,否则称为 实例方法;
如下代码演示: test 属于 类方法 ; testone 属于 实例方法 ;
public class Static_Test {
//类方法与实例方法
static void test(){} //类方法
void testone(){} //实例方法
}
注意: static 关键字要放在方法类型的前面 ,如 : void static test(){} //是错误的
一、对象调用实例方法 ;
1、即类的字节码文件被加载到内存时,类的实例方法不会被分配入口地址,只有该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象进行调用;
2、实例方法中不仅可以操作实例变量,还可以操作类变量;
3、实例方法只能被对象进行调用,而类名不能调用;
如下代码演示:
public class Static_Method_Test {
double number = 11.111; //实例变量
static double snumber = 1.1 ; //类变量
//方法中操作 实例变量,类变量
void test1 (){
number += 11.111 ;
snumber += 1.1 ;
System.out.println("number的值="+number);
System.out.println("snumber的值="+snumber);
}
public static void main(String[] args) {
Static_Method_Test smtest = new Static_Method_Test();
//对象调用实例方法
smtest.test1();
//类名调用实例方法,错误的调用,类名不能调用实例方法
// Static_Method_Test.test1(); //报错
}
}
以上代码输出结果:
number的值=22.222
snumber的值=2.2
二、类名调用类方法
1、即类方法在类被加载到内存时,就分配了相应的入口地址,从而可以直接通过类名调用,也可以被类中创建的任何对象调用;而实例方法则不行,只能由对象进行调用;
2、类方法中只能对类变量进行操作,不能对实例变量进行操作,而实例方法则可以对实例变量和类变量进行操作,是因为在类创建对象之前,实例变量还没有分配内存;
如下代码演示:
public class Static_Method_Test {
//测试实例方法与类方法:类名调用类方法
double number = 11.111; //实例变量
static double snumber = 1.1 ; //类变量
static void test1 (){
// number += 11.111 ;
//报错:Cannot make a static reference to the non-static field number
snumber += 1.1 ;
// System.out.println("number的值="+number); //报错
System.out.println("snumber的值="+snumber);
}
public static void main(String[] args) {
Static_Method_Test smtest = new Static_Method_Test();
//对象调用类方法
smtest.test1();
//类名调用类方法
Static_Method_Test.test1();
}
}
以上代码输出结果:
snumber的值=2.2
snumber的值=3.3000000000000003
类方法 test1 被调用了两次,在类方法中不能对实例变量进行操作;