介绍
在类中,使用 static 关键字修饰的 属性(成员变量),称为 静态变量(类变量,类属性)
静态变量在类的 所有实例之间共享
应用场景
同一型号手机的 配置 都是相同的,但每台手机的 热点名、app、手机号是不同的
对象之间共享数据
特性
静态成员属于类本身,而不是类的任何实例。
例子
class Mate80 {
// 静态属性
static type:string = "华为Mate80"
// 热点名,实例属性
wifiName:string = ""
}
访问静态属性
使用 类名.成员名
console.log("Mate80的名字:",Mate80.type)
不能通过实例访问静态成员
let lileiMate80 = new Mate80()
// 执行报错
console.log("Mate80的名字:",lileiMate80.type)
修改静态属性
Mate80.type = "华为Mate80升级款"
console.log("Mate80的名字:",Mate80.type)
例子:对象之间共享数据
在 Mate80类 中定义 静态属性 联系人,创建2个方法:
add()方法添加联系人show()方法遍历显示联系人
创建两个手机对象,一个手机添加联系人,另一个手机就可以显示该联系人,实现了数据共享
定义类
class Mate80 {
// 联系人,静态属性
static contact:string[] = []
// 添加联系人
add(name:string):void{
Mate80.contact.push(name)
}
// 显示联系人
show():void{
for(let item of Mate80.contact){
console.log(item)
}
}
}
创建对象、添加联系人
let lileiMate80 = new Mate80()
// 李雷在他的手机添加了lili
lileiMate80.add("lili")
创建对象、显示联系人
let hmmMate80 = new Mate80()
// 韩梅梅的手机上就有了lili,实现共享数据
hmmMate80.show()
静态成员 vs 实例成员
| 特性 | 静态成员 (Static) | 实例成员 (Instance) |
|---|---|---|
| 所属 | 属于类 | 属于类的每个实例 |
| 关键字 | static |
无 (public, private, protected 可修饰两者) |
| 访问方式 | ClassName.member |
instance.member |
| 内存 | 只有一份,所有实例共享 | 每个实例都有一份独立的副本 |
| 初始化时机 | 类加载时(程序启动时) | 实例创建时 (new) |
能否访问 this |
❌ 不能(因为没有实例) | ✅ 能 |
示例对比
class Mate80 {
// 静态属性
static type:string = "华为Mate80"
// 热点名,实例属性
wifiName:string = ""
}
let lileiMate80 = new Mate80()
// 修改实例属性,需要通过 对象名.属性名
lileiMate80.wifiName = "李雷的mate80"
let hmmMate80 = new Mate80()
// 修改实例属性,需要通过 对象名.属性名
hmmMate80.wifiName = "韩梅梅的mate80"
// 修改静态属性,需要通过 类名.静态属性名
Mate80.type = "华为Mate80升级款"
// 访问静态属性,需要通过 类名.静态属性名
console.log("Mate80的名字:",Mate80.type)
// 访问对象属性,需要通过 对象名.属性名
console.log("lilei的热点名:",lileiMate80.wifiName)
// 访问对象属性,需要通过 对象名.属性名
console.log("韩梅梅的热点名:",hmmMate80.wifiName)
注意:不能用静态属性name
类中默认内置 静态属性 name,所以不能再定义 静态属性 name
class Mate80 {
// 下行代码报错
static name:string = "华为Mate80"
}
静态成员可以被继承
class Parent {
static parentStatic = "I'm static in Parent";
}
class Child extends Parent {
// Child 类也拥有 parentStatic
}
console.log(Child.parentStatic); // "I'm static in Parent"
可以有同名的静态和实例成员
可以有同名的静态和实例成员,但它们是完全独立的。
class Confusing {
static name = "Static Name";
name = "Instance Name"; // 这是允许的,但容易混淆,不推荐
}
访问修饰符
静态成员也可以使用 public (默认), private, protected。
* `private static`: 只能在类内部访问。
* `protected static`: 可以在类及其子类内部访问。
总结
static关键字用于定义属于类本身的成员。- 通过
ClassName.member访问静态成员。 - 静态成员在所有实例间共享,只有一份。
- 常用于:常量、单例模式、共享数据。