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属性可以在没有实例化对象产生的情况下直接通过类名称进行调用。
本文来自博客园,作者:{Zeker62},转载请注明原文链接:https://www.cnblogs.com/Zeker62/p/15046308.html