Java-面向对象- static关键字
通常情况下,属性/方法都是隶属于对象层级,每创建一个对象就需要申请独立的内存空间来存放该对象独立的成员变量信息,若所有对象的某个成员变量数值完全一样却又单独存放就会造成内存空间浪费。为解决该类问题则使用static关键字修饰变量表达静态含义,此时该类变量由对象层级提升到类层级而被所有对象共享。该成员变量随着类的加载准备就绪,与是否创建对象无关
static就是把对象级提升到类级。static的属性/代码块/方法都隶属于类,在类加载时就准备完成了,而不需要创建对象(new)。
类加载只做一次,包括:
1.类名.的时候会类加载。
2.new对象时会类加载。
3.程序员可以用程序加载,比如:Class.forName()。
静态的成员(属性和方法)可以用对象.调用,但一般推荐用类名.调用。
//国籍是一样的,但是每次创建对象的时候在堆内存都需要开辟空间来存储国籍
//非常的浪费?
//Java考虑到了这个问题,怎么办?
//针对多个对象有共同的成员变量的值的时候
//Java提供了一个关键字 static
class Person{
private String name;
private int age;
static String country="中国";
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("name:"+name+",age:"+age+",country:"+country);
}
}
public class PersonDemo {
public static void main(String[] args) {
Person p1=new Person("小龙", 21);
p1.show();
Person p2=new Person("山本", 21);
p2.country="日本";
p2.show();
Person p3=new Person();
p3.setName("干掉小日本");
p3.setAge(23);
p3.show();
}
}
static关键字内存图解
注意事项
为什么静态方法没有this关键字?
静态方法随着类的加载而加载,this是随着对象的创建而存在
静态的比对象先存在
静态的方法只能访问静态的成员变量和静态的成员方法
非静态方法: 都能访问
静态方法: 静态的只能访问静态