Java面向对象:声明static属性

static是一个关键字,这个关键字主要用来定义属性的一种方法,下面将针对此关键字进行分析。

static定义属性

在一个类之中,所有的属性一旦定义了实际上内容都交给堆内存空间来保存。
范例:定义一个程序类,观察传统操作的问题。

class Person {
	private String name;
	private int age;
	private String country="中华民国";//国家,暂时不封装
	public Person (String name ,int age)
	{
		this.name=name;
		this.age=age;
	}
	public String getInfo()
	{
		return  this.name+this.age+this.country;
	}
}
public class Test{
	public static void main(String args[])
	{
		Person perA=new Person("张三",10);
		Person perB=new Person("李四",10);
		Person perC=new Person("王五",11);
		System.out.println(perA.getInfo());
		System.out.println(perB.getInfo());
		System.out.println(perC.getInfo());
	}
}

为了更好得观察出程序的问题,下面对此作出一个内存分析:
在这里插入图片描述

一个对象要保存有各自的属性,所以此时的程序没有任何问题,但是如果突然有一天,国家解放了,变为了中华人民共和国,并且已经产生了五千万个对象,那么此时面对你的将是一场噩梦。所以这个时候就会发现整体的设计上出现了问题(重复保存数据并且修改不方便)

public class Test{
	public static void main(String args[])
	{
		Person perA=new Person("张三",10);
		Person perB=new Person("李四",10);
		Person perC=new Person("王五",11);
		perA.country="中华人民共和国";
		System.out.println(perA.getInfo());
		System.out.println(perB.getInfo());
		System.out.println(perC.getInfo());
	}
}

在这里插入图片描述
那么这个时候最好的解决方案,就是将country修改成我们的公共属性,而这种情况下就必须使用我们的static属性
范例:修改Person类定义,使用static定义公共类属性:

	static String country="中华民国";

在这里插入图片描述
此时会发现,所有对象中的country属性的内容都发生了改变,所以这是一个公共属性,此时的内存发生了变化:
在这里插入图片描述
但是对于static属性的访问需要注意一点:由于其本身是一个公共的属性,虽然可以通过对象对其访问,但是其最好的做法是通过所有对象的最高代表(类)来进行访问,所以static属性可以用类名称来直接调用。

	Person.country="中华人民共和国";

由类名称来调用是最合适的。
static虽然定义在类之中,但是其并不受到类实例化对象的控制。static属性可以在没有实例化的时候使用。
范例:不产生实例化对象调用static属性:

class Person {
	private String name;
	private int age;
	static String country="中华民国";//国家,暂时不封装
	public Person (String name ,int age)
	{
		this.name=name;
		this.age=age;
	}
	public String getInfo()
	{
		return  this.name+this.age+this.country;
	}
}
public class Test{
	public static void main(String args[])
	{
		System.out.println(Person.country);
		Person.country="中华人民共和国";
		Person per=new Person("张三",10);
		System.out.println(per.getInfo());
	}
}

在以后进行类设计的时候,首选的是一定是非static属性,而考虑公共信息存储的时候才会用到static属性。非static属性必须在实例化对象产生之后才可以使用,而static属性可以在没有实例化对象产生的情况下直接通过类名称进行调用。

posted @ 2020-11-01 22:55  Zeker62  阅读(107)  评论(0编辑  收藏  举报