- 静态方法直接通过类调用
java
class A {
static void test() {
System.out.println("A");
}
}
可以直接:
A.test()
当然也可以创建对象,用对象来调用:
A a = new A()
a.test()
不过编译器内部会自动将a.test()这行代码替换为A.test()
- 静态方法绑定引用类型
java
对于则个代码:
class A {
static void test() {
System.out.println("A");
}
}
class B extends A {
static void test() {
System.out.println("B");
}
}
下面两个结果分别是什么:
情形1:
A a = new B();
a.test();
情形2:
B b = new B();
b.test();
结果是:
A
B
而非:
B
B
因为静态方法绑定引用类型,而不是实例
情形1中,A a = new B() 这行代码中 a 是引用类型A、 new B() 得到的是实例对象的类型是B,
当a调用静态方法test时,从引用类型A调用,编译器会把a.test() 变为A.test()
情形2中,B b = new B() 这行代码中 b 是引用类型B、 new B() 得到的是实例对象的类型是B,
当b调用静态方法test时,从引用类型B调用,编译器会把b.test() 变为B.test()
- 静态方法不能访问非静态成员、不能调用非静态方法
java
public class StaticDemo {
// 非静态成员变量
private int count = 10;
// 静态成员变量
private static int total = 100;
// 非静态方法
public void printCount() {
System.out.println("count = " + count);
}
// 静态方法
public static void staticMethod() {
// ✅ 可以访问静态成员
System.out.println("total = " + total);
// ❌ 编译错误:不能访问非静态成员变量
// System.out.println(count);
// ❌ 编译错误:不能直接调用非静态方法
// printCount();
}
}