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关键字代表了一个函数的调用者对象,这时就产生了冲突。

个人结论:非静态可随意调用静态,静态无法调用非静态

posted @ 2020-11-29 14:30  小艾影  阅读(94)  评论(0编辑  收藏  举报