🌠个人主页 : @赶路人- -
🌌个人格言 :要努力成为梧桐,让喜鹊在这里栖息。
要努力成为大海,让百川在这里聚积。
1.静态变量
静态变量(静态字段):使用static修饰的成员变量属于类本身,而不是实例对象。它在内存中只有一份副本,所有的实例对象共享这个变量。可以通过类名直接访问静态变量,无需创建对象。 示例代码如下
public class Example {
public static int count = 0;
public Example() {
count++;
}
public static void main(String[] args) {
Example e1 = new Example();
Example e2 = new Example();
System.out.println(Example.count);
System.out.println(e1.count);
System.out.println(e2.count);
}
}
执行结果:
2
2
2
!
后面两句e1.counte2.count可以运行,但编译器会警告。(不建议这样写)
2.静态方法
静态方法:使用static修饰的方法也属于类本身,而不是实例对象。它可以通过类名直接调用,无需创建对象。静态方法不能直接访问非静态的成员变量和方法,因为它没有this指针。 示例代码如下:
public class Example {
public static void printMessage() {
System.out.println("Hello, world!");
}
public static void main(String[] args) {
Example.printMessage();
}
}
输出结果:
Hello, world!
可以发现我们并没有创建对象,也可以打印,更加验证static修饰的属于类本身,而不是实例对象。
3.静态代码块
静态代码块:使用static关键字定义的代码块称为静态代码块。它在类加载时执行,且只执行一次。通常用于进行静态成员的初始化操作。 示例代码如下:
public class Example {
public static int count;
static {
count = 0;
System.out.println("静态代码块被执行");
}
public Example() {
count++;
System.out.println("构造方法被执行");
}
public static void main(String[] args) {
Example e1 = new Example();
Example e2 = new Example();
System.out.println(Example.count);
}
}
运行结果:
静态代码块被执行
构造方法被执行
构造方法被执行
2
4.静态内部类
静态内部类:使用static修饰的内部类称为静态内部类。静态内部类与外部类相互独立,可以直接访问外部类的静态成员,但不能访问外部类的非静态成员。 示例代码如下:
public class Outer {
private static int x = 1;
private int y = 2;
public static class Inner {
public void print() {
System.out.println("x = " + x); // 访问外部类静态成员
//System.out.println("y = " + y); // 编译错误,不能访问外部类非静态成员
}
}
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.print();
}
}
运行结果:
x = 1
内存解析
修饰属性,Java静态属性和类相关, 和具体的实例无关. 换句话说, 同一个类的不同实例共用同一个静态属性.
class TestDemo{
public int a;
public static int count;
}
public class Main{
public static void main(String[] args) {
TestDemo t1 = new TestDemo();
t1.a++;
TestDemo.count++;
System.out.println(t1.a);
System.out.println(TestDemo.count);
System.out.println("============");
TestDemo t2 = new TestDemo();
t2.a++;
TestDemo.count++;
System.out.println(t2.a);
System.out.println(TestDemo.count);
}
}
运行结果:
1
1============
1
2
示例代码内存解析:count被static所修饰,所有类共享。且不属于对象,访问方式为:类名 . 属性