static关键字再写一波

static关键字

static+成员变量=静态变量
static+成员函数=静态函数
那么什么时候把数据定义为静态呢?
就是当我们设计一个类的时候,发现多个对象共享一个数据,那么我们就可以把这个数据定义为静态
来看下以下的代码

class staticDemo{
public static void main(String[] args){
 staticDemo t1=new staticDemo();
 staticDemo t2=new staticDemo();
 staticDemo t3=new staticDemo();
}
//三个成员变量
private String name;
private int age;
private String country;

}

这三个对象中,这个country的成员函数是一样,那么我们就可以把这个country成员函数单独拿出来,这就是解决成员变量重复问题的方法,这么来说吧,对于name,age这样的数据,他们虽然变量名是一样的,但是值是不一样的,这就是对象的特有数据,我们把特有数据就叫做成员变量,对于country而言,不仅值是一样的,变量名也是一样的,我们把这样的数据就做对象的共有数据,也就叫做静态变量
那么问题就来了,静态的东西从堆中对象的空间抽取出来了,放到哪里了?
答案就是放到静态方法区了
静态数据的好处在于节省空间
静态变量的生命周期要比成员变量要长
2,那么静态函数呢?
我们当前的成员函数如果在不访问任何成员变量的情况下,这个函数就可以定义为静态的
还是上面那个代码

class staticDemo{
public static void main(String[] args){
 Chinese t1=new Chinese();
 Chinese t2=new Chinese();
 Chinese t3=new Chinese();
}
class Chinese{
//三个成员变量
private String name;
private int age;
private String country;
//定义一个静态的方法
public static void show(){
System.out.println(name+"+"+age+"+"+country);
//**这样写结果就会报错,因为静态函数不能直接去调用类中的成员变量**
public void show2(){
System.out.println(name+"+"+age+"+"+country);
//如果把static关键字去掉了,那么访问就不会报错了
}
}

那么出现上述两种不同的原因是什么呢?
1,静态的变量或者函数的生命周期都比对象要长,所以当对象还没有创建的时候,静态的已经存在了,两者不同步,所以就会出错
下来来看对象的内存图解
1,javac将java的源代码进行编译,生成字节码文件
2,java将字节码文件加载进虚拟机中,开始运行程序,方法可以大致分为非静态方法区或者静态方法区
3,所有非静态的代码(二进制)内容加载进非静态区
所有静态的代码(二进制)内容加载进静态区
然后JVM接下来会根据参数(java字节码文件名(类名))区静态区找主函数
那么我们来看,如果我们来打印一下
System.out.println(t1.country);//也能打印出来
那么这个t1.country如何操作呢?首先它回去这个对象所属的空间去找,如果找不到了,再去静态方法区中该对象所属类的空间去找,如果再找不到的话,就去该类的父类去找
还是上面的那个代码
public void show2(){
/*
成员函数内部在调用变量时的顺序:
1,先找局部变量
2,去对象空间中找
3,去静态区该对象所属类的空间找
*/
System.out.println(name+"+"+age+"+"+country);
如果是这个代码呢?
public static void show(){
静态函数内部在调用变量时的顺序:
1,先找局部变量
2,去静态区该对象所属类的空间找
3,去对象中找
*/
System.out.println(name+"+"+age+"+"+country);
所以静态是优先于对象存在的
静态页称之为是类的成员,我们可以直接通过类去调用 ,类.静态成员
但是类是不能直接调用非静态变量

那么为什么主函数是静态的呢?
是因为主函数程序的入口,优先于其他函数的运行
静态的特点:
1,共有的
2,长时间存在
3,加载一次,后期随便使用
静态变量与成员变量的区别
1,生命周期
成员变量随着对象的创建而创建,对象的消亡而消亡
静态变量随着类的加载而创建,随着程序结束而消失
2,调用方式
成员变量必须先创建对象,再通过对象去调用
静态变量可以被对象调用,也可以直接用类调用
3,存储位置
成员变量存在于堆内存中对象的所属空间里
静态变量存在于静态方法区类的所属空间里
4,命名
成员变量----对象的特有属性
静态变量—对象的共有属性—类成员

package test1;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
             A a=new A();
             //这样的话,就会构造函数调用构造函数
             //java.lang.StackOverflowError栈溢出的错误       
	}
}
class A{
	public A(){//构造函数
		
	}
	A a =new A();
}

package test1;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
             //A a=new A();
             //这样的话,就会构造函数调用构造函数
             //java.lang.StackOverflowError栈溢出的错误       
		    B b =new B();
		    System.out.println(b==b.b); //false
		    //先去对象中找,如果找不到了,再去静态区去找,参照上述举例
		    System.out.println(b.b==b.b.b.b.b.b);//true
	}
}
class B{
	static B b=new B();
}
class A{
	public A(){//构造函数
		
	}
	A a =new A();
}

记住啦 静态变量和成员变量一样,都是有初始化值的,也有显示初始化,唯独没有针对性初始化
基本就这样了,看过的老铁记得点歌赞,么么哒!

发布了52 篇原创文章 · 获赞 0 · 访问量 1175

猜你喜欢

转载自blog.csdn.net/qq_37244548/article/details/104975201