目录
一 、使用 static 声明属性
二 、使用 static 声明方法
三 、static 应用小实例
前面的代码均使用一个类分别开辟栈内存和堆内存,在堆内存中保存对象中的属性,每个对象有自己的属性,使用 static 声明的属性可被所有对象共享,如果一个类中的方法想由类直接调用,则可以声明为 static 方法。
一 、使用 static 声明属性
class Person {
String name;
int age;
static String country = "北京"; //定义 static 属性,此属性为所有对象共享
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void info(){
System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
}
}
public class StaticDemo01 {
public static void main(String[] args) {
Person p1 = new Person("per1",20);
Person p2 = new Person("per2",22);
Person p3 = new Person("per3",24);
System.out.println("----------修改 static 属性之前----------");
p1.info();
p2.info();
p3.info();
Person.country = "广州"; //修改 static 属性
System.out.println("----------修改 static 属性之后----------");
p1.info();
p2.info();
p3.info();
}
}
程序运行结果:

从以上可以发现,修改类中 static 声明的属性,则全部对象的属性内容都跟着改变,因为static 声明的属性为所有对象共享
Java 中主要存在4块内存空间
- 栈内存空间:保存所有对象的名称(保存了引用的堆内存空间的地址)
- 堆内存空间:保存了每个对象的具体属性内容
- 全局数据区:保存 static 类型的属性
- 全局代码区: 保存所有的方法定义
二 、使用 static 声明方法
class Person {
private String name;
private int age;
private static String country = "上海"; //定义 static 属性
public static void setCountry(String c) { //定义 static 方法
country = c; //修改 static 属性
}
public static String getCountry() { //取得 static 属性
return country;
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void info(){
System.out.println("姓名:" + this.name + " 年龄:" + this.age + " 城市:" + country);
}
}
public class StaticDemo02 {
public static void main(String[] args) {
Person p1 = new Person("per1",20);
Person p2 = new Person("per2",22);
Person p3 = new Person("per3",24);
System.out.println("----------修改 static 属性之前----------");
p1.info();
p2.info();
p3.info();
Person.setCountry("深圳"); //修改 static 属性
System.out.println("----------修改 static 属性之后----------");
p1.info();
p2.info();
p3.info();
}
}
程序运行结果:

在以上程序中,Person 类将所有的属性都进行了封装,所以必须使用 setter() 方法设置属性,因为这里的 setter() 方法是使用 static 声明的,所以可以使用 类名称 直接调用
另外,非 static 声明的方法可以去调用 static 声明的属性或方法,但是,static 声明的方法不能调用非 static 声明的属性或方法
class Person {
private String name = "Tony"; //定义 非static 属性
public static void sFun() { //定义 static 方法
System.out.println("name = " + name); //错误,不能调用 非static 属性
fun(); //错误,不能调用 非static 方法
}
public void fun() { //定义 非static 方法
System.out.println("hello");
}
}
程序编译报错:

static 不能调用任何 非static 内容,是因为在程序中,所有的属性和方法必须在对象开辟堆内存(即实例化)之后才可以被调用,而 static 类型的方法在对象未被实例化时就可以被类名调用
三 、static 应用小实例
class Demo {
private static int count = 0;
public Demo() { //实例化对象时自动调用无参构造方法,此时static声明的count属性自增用以计算产生了多少个对象
count++;
System.out.println("实例化了" + count + "个对象");
}
}
public class StaticDemo04 {
public static void main(String[] args) {
new Demo();
new Demo();
new Demo();
}
}
程序运行结果:


2193

被折叠的 条评论
为什么被折叠?



