Java里可以使用static声明属性或者方法,对于非static的属性和方法,每个对象都占有各自的内容,如果想要有一个方法或者属性为所有对象所共有,可以声明为static类型,声明了static类型的属性或方法之后,此方法也称为类方法,可以由类名直接调用。
1、使用static声明属性
static可以声明全局属性,全局属性有什么作用呢?看一下如下代码
public class Demo5 {
public static void main(String[] args) {
Person p1 = new Person("张三", 30);
Person p2 = new Person("李四", 31);
Person p3 = new Person("王五", 32);
p1.getInfo();
p2.getInfo();
p3.getInfo();
System.out.println("----------- 修改 p1 的country 属性 ----------");
p1.country = "B城";
p1.getInfo();
p2.getInfo();
p3.getInfo();
}
}
class Person{
String name; // 声明name属性,暂时不封装
int age; // 声明age 属性,暂时不封装
String country="A城"; // 声明country属性,给默认值
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void getInfo(){
System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
}
}
执行结果:
姓名:张三 年龄:30 城市:A城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城
----------- 修改 p1 的country 属性 ----------
姓名:张三 年龄:30 城市:B城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城
我们看到,上面的程序基本实现了我们想要的功能,但是当改变country属性的时候,只有明确修改属性的p1改变了,p2,p3都没变,如果只有几个对象,我们打不了逐个修改,但是如果对象有成千上万个,那逐个修改就是非常耗时耗力的重复工作,这个时候,我们就可以用static关键字来处理,只要把country属性声明为static就行
public class Demo5 {
public static void main(String[] args) {
Person p1 = new Person("张三", 30);
Person p2 = new Person("李四", 31);
Person p3 = new Person("王五", 32);
p1.getInfo();
p2.getInfo();
p3.getInfo();
System.out.println("----------- 修改 p1 的country 属性 ----------");
p1.country = "B城";
p1.getInfo();
p2.getInfo();
p3.getInfo();
}
}
class Person{
String name; // 声明name属性,暂时不封装
int age; // 声明age 属性,暂时不封装
String country="A城"; // 声明country属性,给默认值
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void getInfo(){
System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
}
}
执行结果:
姓名:张三 年龄:30 城市:A城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城
----------- 修改 p1 的country 属性 ----------
姓名:张三 年龄:30 城市:B城
姓名:李四 年龄:31 城市:B城
姓名:王五 年龄:32 城市:B城
可以看到,修改一个对象的country属性值,所有对象的country属性都发生改变,这表明这个country属性是所有对象所共享的
说到这里,顺便提一下Java的内存区域
- 栈内存:可以保存对象的名称
- 堆内存:每个对象的具体属性
- 全局数据区:保存static类型的属性
- 全局代码区:保存所有方法的定义
再回来看一下刚才的代码,在修改static属性的时候,我们用的是 对象.属性=" "来修改,这种方式其实不推荐,最好是用 “类名称 . 属性” 来修改。
2、使用static声明方法
public class Demo5 {
public static void main(String[] args) {
Person p1 = new Person("张三", 30);
Person p2 = new Person("李四", 31);
Person p3 = new Person("王五", 32);
System.out.println("----------- 修改前 ------------");
p1.getInfo();
p2.getInfo();
p3.getInfo();
Person.setCountry("B城"); // 调用静态方法修改country属性
System.out.println("----------- 修改后 ------------");
p1.getInfo();
p2.getInfo();
p3.getInfo();
}
}
class Person{
private String name; // 声明name属性
private int age; // 声明age 属性
private static String country="A城"; // 声明country属性,给默认值
public static String getCountry() {
return country;
}
public static void setCountry(String country) {
Person.country = country;
}
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void getInfo(){
System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
}
}
执行结果:
----------- 修改前 ------------
姓名:张三 年龄:30 城市:A城
姓名:李四 年龄:31 城市:A城
姓名:王五 年龄:32 城市:A城
----------- 修改后 ------------
姓名:张三 年龄:30 城市:B城
姓名:李四 年龄:31 城市:B城
姓名:王五 年龄:32 城市:B城
注意:静态方法不能调用非静态属性或方法