33--static关键字

当我们在给一个类进行实例化时,在内存中会分别开辟栈内存和堆内存,在堆内存中保存对象的属性,每个对象都有自己的属性,如果希望这些属性被所有的对象共享,则就必须将其声明为static属性,而且一个属性使用了static关键字声明之后,可以直接使用类名进行调用。如果一个类中的方法由类名直接调用,该方法也可以使用static声明。
static修饰属性:
实例1:看一种需要属性共享的场景

package com.qwy.demo;

public class StaticDemo {
    
    
	public static void main(String[] args) {
    
    
		Person per1 = new Person("张三",20);
		Person per2 = new Person("李四",21);
		Person per3 = new Person("王五",22);
		per1.info();
		per2.info();
		per3.info();
	}
}
class Person{
    
    
	String name;
	int age;
	String address="泰安";
	public Person(String name, int age) {
    
    //通过构造方法设置name和age
		this.name = name;
		this.age = age;
	}
	public void info(){
    
    
		System.out.println("姓名:"+this.name+"\t年龄:"+this.age+"\t住址:"+this.address);
	}
}

运行结果:
姓名:张三 年龄:20 住址:泰安
姓名:李四 年龄:21 住址:泰安
姓名:王五 年龄:22 住址:泰安
现在考虑一种情况:如果地址该变了,并且此类产生了很多的对象,那么意味着把这些对象地址属性修改很多遍,这样肯定是不行的,最好的做法就是一次修改之后,所有的对象都该变了。此时就可以使用static关键字把address属性进行修饰,将其改变为公共属性。
实例2:使用static声明属性

package com.bdqn.demo;

public class StaticDemo {
    
    
	public static void main(String[] args) {
    
    
		Person per1 = new Person("张三",20);
		Person per2 = new Person("李四",21);
		Person per3 = new Person("王五",22);
		System.out.println("**********************修改之前*************");
		per1.info();
		per2.info();
		per3.info();
		System.out.println("**********************修改之后*************");
		per1.address="北京";
		per1.info();
		per2.info();
		per3.info();
		
	}
}
class Person{
    
    
	String name;
	int age;
	static String address="泰安";//使用static修饰属性
	public Person(String name, int age) {
    
    //通过构造方法设置name和age
		this.name = name;
		this.age = age;
	}
	public void info(){
    
    
		System.out.println("姓名:"+this.name+"\t年龄:"+this.age+"\t住址:"+this.address);
	}
}

运行结果:
*********修改之前
姓名:张三 年龄:20 住址:泰安
姓名:李四 年龄:21 住址:泰安
姓名:王五 年龄:22 住址:泰安
*********修改之后
姓名:张三 年龄:20 住址:北京
姓名:李四 年龄:21 住址:北京
姓名:王五 年龄:22 住址:北京

从以上代码可以发现,只修改了其中一个对象的address属性,则全部的对象的address属性都改变了。说明使用static声明的属性是所有对象共享的。
static关键字的使用说明:
1.static:静态的
2.static可以用来修饰:属性、方法、代码块、内部类
3.使用static修饰属性:静态变量(或类变量)
属性,按是否使用static修饰,又分为:静态属性 和 **非静态属性(实例变量)**实例变量:我们创建了类的多个对象,每个对象都独立 的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
4.静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用。
5.静态变量的加载要早于对象的创建。
6.由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。
static修饰方法:
1.使用static修饰方法:静态方法
2.随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
3.静态方法中,只能调用静态的方法或属性,非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性。
4.在静态的方法内,不能使用this关键字、super关键字.
实例:

package com.qwy;

public class StaticDemo {
    
    
	public static void main(String[] args) {
    
    
		Person per1 = new Person("张三",20);
		Person per2 = new Person("李四",21);
		Person per3 = new Person("王五",22);
		per1.info();
		per2.info();
		per3.info();
	}
}
class Person{
    
    
	String name;
	int age;
	static String address="泰安";
	public Person(String name, int age) {
    
    //通过构造方法设置name和age
		this.name = name;
		this.age = age;
	}
	public void info(){
    
    
		//调用静态的show()方法
		show();
	}
	public static void show(){
    
    
		//错误:调用非静态的name和age属性
		//System.out.println("Person [name=" + name + ", age=" + age + ", address=" + address + "]");
		System.out.println("address=" + address);
	}
	
	
}

猜你喜欢

转载自blog.csdn.net/qwy715229258163/article/details/114671210
今日推荐