静态变量
用static 修饰的变量称为静态变量。
static String favorite;
favorite 为静态方法
静态方法
用static 修饰的方法称为静态方法。
public static void fav() {
System.out.println(favorite);
}
fav() 为静态方法
静态变量和方法、普通变量和方法之间的区别
静态变量和方法从属于类,普通变量和方法从属于对象。
代码示例1
public class TestStatic {
String name;
int age;
static String favorite;//静态变量favorite
//构造器
TestStatic(String name ,int age) {
this.name = name;
this.age = age;
}
// 普通方法nam()
public void nam() {
System.out.println("我的名字是:"+name);
}
// 静态方法fav()
public static void fav() {
System.out.println("我的爱好是:"+favorite);
}
public static void main(String[] args) {
TestStatic stu = new TestStatic("李四",20);
stu.nam();
stu.favorite = "看电影";
stu.fav();
}
}
运行结果为:
我的名字是:李四
我的爱好是:看电影
代码示例2
public class TestStatic {
String name;
int age;
String favorite;//普通变量favorite
//构造器
TestStatic(String name ,int age) {
this.name = name;
this.age = age;
}
// 普通方法nam()
public void nam() {
System.out.println("我的名字是:"+name);
}
// 静态方法ag()
public static void ag() {
System.out.println("我的年龄是:"+age);
}
// 静态方法fav()
public static void fav() {
System.out.println("我的爱好是:"+favorite);
}
public static void main(String[] args) {
TestStatic stu = new TestStatic("李四",20);
stu.nam();
stu.ag();
stu.favorite = "看电影";
stu.fav();
}
}
运行结果为:
Error:(17, 37) java: 无法从静态上下文中引用非静态 变量 age
Error:(21, 37) java: 无法从静态上下文中引用非静态 变量 favorite
对比结果分析:
代码分析
static String favorite;//静态变量favorite
变为:
String favorite;//普通变量favorite
但是静态方法fav()没有 变化
// 静态方法fav()
public static void fav() {
System.out.println("我的爱好是:"+favorite);
}
同时
int age;//普通变量
和
// 静态方法ag()
public static void ag() {
System.out.println("我的年龄是:"+age);
}
也是如此
代码里面的 age 和 favorite 是普通变量,属于对象 stu 的。而静态方法 fav() 和 ag() 是属于类的,对象 stu 可以访问类的静态变量、静态方法、字符串常量等。但是通过静态方法、静态变量无法找到对象。可以理解为:类的静态变量、静态方法为对象提供了材料,像盖房子的图纸。通过房子可以找到图纸,但是通过图纸你无法知道是哪一个房子。当然静态方法可以调用静态变量同类型可以相互调用。
内存分配分析
可以先学习我的这一篇文章:java面向对象内存分析–栈和堆,方法区
总结:方法区就像是房子的图纸,对象是根据图纸建造出来的房子,通过图纸不能找到是那一个房子,而通过房子必定能找到图纸。