java--static关键字
package com.xiaoai.test;
public class Test_static {
public String name; //非静态变量,每个对象拥有各自的变量,变量不被共享,在内存中会创建多个
public static int age; //静态变量,在内存中只会创建一次,所有对象共享,随着类的加载而存在,随着类文件的消失而消失
public static void sttc_1(){ //静态方法
System.out.println("静态");
}
//静态方法
public static void static_syso(){
System.out.println("静态方法中---输出");
//可以引用静态变量
age = 12;
//--无法引用this
// this.name = "xiaoai";
//--无法引用非静态变量
// name = "nihao";
//--无法引用非静态方法
// sys1();
//--可以引用静态方法
sttc_1();
}
//非静态方法
public void sys1(){
System.out.println("非静态方法中---输出");
//可以引用this和非静态变量
this.name = "xiaoai";
//可以引用静态变量
age = 12;
//可以引用静态方法
sttc_1();
}
@Override
public String toString() {
return "Test_static [name=" + name + ",age=" +age + "]";
}
public static void main(String[] args) {
Test_static t1 = new Test_static();
t1.sys1();//可引用,对象可以调用非静态方法
t1.static_syso();//可引用,对象可以调用静态方法,但是不推荐
System.out.println(t1);
// Test_static.sys1(); //不可引用,类名不可直接调用非静态方法
Test_static.static_syso(); //可引用,类名可直接调用静态方法
System.out.println(t1.name); //可引用,非静态变量可以被对象.引用
// System.out.println(Test_static.name); //不可引用,非静态变量无法直接类名.引用
System.out.println(t1.age); // 可引用,静态变量可以被对象.引用
System.out.println(Test_static.age); //可引用,静态变量可以直接类名.引用
}
}
- 结果截图
注意
- 静态函数可直接访问静态成员变量,不能直接访问非静态成员变量。
静态函数可使用类名直接调用,这时候可能还没有存在对象,而非静态成员数据是随对象的存在而存在。
- 为什么非静态函数可直接访问静态与非静态成员变量。静态函数不能访问非静态的成员数据?
非静态函数只能由对象调用,对象存在时,说明非静态与静态的数据都已加载好了,所以非静态函数可随便调用。
静态函数不能访问非静态成员,是因为静态成员数据随对象存在而存在,静态函数可直接由类名调用,此时可能没有对象创建,也就没有非静态成员数据,所以静态函数无法访问非静态成员。
*静态函数只要存在有对象,那么也可以访问非静态的数据,只是不能直接访问而已。
- 为什么静态函数不能使用this或super关键字。
因为静态的函数可用类名调用,类名调用时可能不存在对象,而this关键字代表了一个函数的调用者对象,这时就产生了冲突。