静态方法用static声明,属于类而非实例,不可通过this访问实例属性或方法,只能通过类名调用;可被子类继承和重写,支持super调用父类静态方法;不能是箭头函数;与静态属性初始化时机不同。
static 关键字声明,不能访问 this
类中定义静态方法只需在方法前加 static,它属于类本身而非实例。这意味着你无法在静态方法里用 this 访问实例属性或方法,this 指向的是类(如 MyClass),不是实例对象。
常见错误是误以为静态方法能直接读取 this.name 或调用 this.instanceMethod()——这会报 undefined 或 is not a function 错误。
new MyClass().staticMethod() 会报错MyClass.staticMethod()
static 方法可被子类继承,也能被重写子类默认继承父类的静态方法,行为和普通方法继承一致。如果子类定义同名 static 方法,就会覆盖父类版本,且 super 在静态上下文中仍可用。
注意:子类静态方法里的 super 指向父类(不是父类原型),所以 super.staticMethod() 是合法的。
立即学习“Java免费学习笔记(深入)”;
Animal.count() 返回 0,子类 Dog.count() 可返回特定计数super.staticMethod() 显式调用this,也不支持 super
static 属性在类定义时执行赋值(类似模块顶层代码),而 static 方法只是声明,不立即执行。这点影响初始化顺序和副作用控制。
例如:static cache = new Map() 会在类加载时创建新 Map;但 static getCache() 不会自动运行,必须显式调用。
static get cache() { return this._cache ?? (this._cache = new Map()) }
require 同一模块,静态属性只初始化一次;浏览器 ESM 多次 import 也共享同一类对象new 和直接类名调用这是最常踩的坑:把静态方法当构造函数用,或者漏掉类名直接写方法名。
错误示例:MyClass() // TypeError: Class constructor MyClass cannot be invoked without 'new';staticMethod() // ReferenceError: staticMethod is not defined。
MyClass.staticMethodName(arg1, arg2)
import MyClass from './MyClass.js',而不是 import { MyClass } from
this 绑定、继承链调用、模块导入导出这几处出问题。尤其多人协作时,有人在静态方法里偷偷改实例状态,会导致难以追踪的隐性 bug。
来电咨询