一、基本信息:
1.什么是static关键字:
static修饰的代码属于类,定义的变量存储在方法区的静态常量池当中
2.为什么存在static关键字:
方便类去使用自己的变量
3.static可以修饰什么?
- 修饰变量
- 修饰方法
- 修饰类
二、static的应用:
1.修饰变量:
修饰的变量叫做类变量,存储在方法区的静态常量池中,被所有该类产生的对象所共享的
例:
public class Person {
public String name= "张三";
public static String address = "BaoDing";
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
"address='" + address + '\'' +
'}';
}
}
public class Test {
public static void main(String[] args){
Person p1 = new Person();
Person p2 = new Person();
p1.name= "李四";
p1.address="BeiJing";
p2.name="王五";
p2.address="ShangHai";
System.out.println(p1.toString());
System.out.println(p2.toString());
}
}
运行结果:
Person{name='李四'address='ShangHai'}
Person{name='王五'address='ShangHai'}
为什么二人的地址一样呢,就在于static关键字修饰变量,来看其内存图:
在静态常量池里边存储的static所修饰的代码,person.class存储在方法区中(类信息是存储在方法区当中的)。开始时,address=保定
1.main方法入栈,创建出p1,p2两个对象,地址指向0x1,0x2;此时,name的值为张三
2.p1.name= 李四;将0x1里的name变成李四;静态常量池中的address改为北京
p2.name= 王五;将0x2里的name变成王五;静态常量池中的address改为上海
3.最终输出结果,为Person{name='李四'address='ShangHai'}
Person{name='王五'address='ShangHai'} 由此可知,static修饰的变量static修饰的变量是被所有类所共享的。
2.修饰方法:
1. 类级别的方法
- 独立于实例:
static
方法属于类本身,而不是任何特定的对象实例。这意味着你可以在不创建类实例的情况下调用static
方法。
2. 访问限制
- 只能访问
static
成员:static
方法只能直接访问类中的static
变量和static
方法。它不能直接访问实例变量或实例方法,除非通过类的实例访问这些非static
成员。
原因:非静态方法想要表达时就已经创建了对象,那么静态方法是一定存在的
3. 调用方式
- 通过类名调用:虽然可以通过类的实例调用
static
方法,但推荐通过类名直接调用,以提高代码的可读性和清晰性。
public class Example {
public static void staticMethod() {
System.out.println("Static method called");
}
}
public class Main {
public static void main(String[] args) {
Example.staticMethod(); // 推荐:通过类名调用 static 方法
}
}
4. 不可被重写
- 不能被实例方法重写:
static
方法不能被子类重写。子类可以定义一个与父类中static
方法同名的方法,但这被称为方法隐藏,而不是重写。
注意:main方法是static修饰的方法
方法要被main方法调用的解决方案:
1.1.在非静态方法上加入static关键字
1.2.在main方法中创建对象,让对象调用非静态方法
3.修饰代码块:
在main方法之前运行,目的是优化程序
public class Example {
static int count;
static {
count = 10; // 在 static 块中初始化 static 变量
System.out.println("Static block executed");
}
public static void printCount() {
System.out.println("Count: " + count);
}
}
public class Main {
public static void main(String[] args) {
Example.printCount(); // 输出 Count: 10
}
}