静态的运行时机
之前的属性和方法都是通过对象调用的。
使用static修饰可以使之成为静态的转移到类上
static修饰符和访问修饰符之间没有顺序要求,可以任意一个写在前面
类是在程序加载时一起加载的
人.年龄 = 12;
class 人
{
public static int 年龄 = 12;
}
以对象绑定的属性在对象产生时产生。静态的随着程序开始运行就产生。
使用静态修饰可以省去程序运行中的一些时间,但是省去那段时间转移到了程序运行前的准备过程中。
基于这种顺序关系,非静态的可以调用或使用静态的变量或方法。
但是非静态的属性或方法,对于静态的而言是不存在的
所有实例共用静态变量
非静态的属性—hp对于每个对象而言是独立的。一个对象的属性改变不影响另一个对象。
但是他们访问静态属性时,都是访问同一个类下的同一个变量。
静态构造方法
类似于构造函数,有些成员变量只能在构造函数中赋值。
静态成员变量也可以使用静态构造函数赋值,或执行一些其他的初始操作。
如同其他静态成员,静态构造方法也是在程序加载前执行的。
如同析构函数,它由程序自动调用,因此访问修饰符,参数,返回值都是不可用的
class 英雄
{
public static int hp;
static 英雄() {
hp = 18; }
}
静态类
若一个类中没有任何非静态成员,可以使用static修饰整个类,使之称为静态类。
因为静态类中没有任何非静态成员,因此无法定义构造函数。系统也不会为其生成默认构造函数
诸如Console这样的工具类,他们不需要实例对象,只需要方法的类一般修饰为静态类
使用静态方法返回实例
不带有public的构造方法虽然不能被外部访问,
但是如果有其他的静态公开的方法调用它,那么也能间接调用构造函数。
英雄 a = 英雄.Get(10);
class 英雄
{
public int hp;
英雄(int h) {
hp = h; }
public static 英雄 Get(int h)
{
return new 英雄(h);
}
}
非静态的指代
英雄 a = new(12);
a.hp++;
class 英雄
{
public int hp;
public 英雄(int hp) {
this.hp = hp; }
}
正常从实例访问成员变量需要用到声明的名字。
但是定义变量时无法预测用什么名字,因此,在定义时使用this指代当前实例。
静态属性不需要指代。直接使用类名.属性,这是没有歧义的。
转载:https://blog.csdn.net/zms9110750/article/details/116081327