文章目录
static
分类
static根据修饰的成员不同,分类
- 被static修饰的成员变量 —> 静态成员变量
- 被static修饰的成员方法 —> 静态成员方法
静态成员变量
语法
[ 访问权限修饰符] static 数据类型 变量名;
说明
- 修饰符先写
public
- 数据类型可以可以是基本数据类型,也可以是引用数据类型
- 命名规范 —> 小驼峰
- 使用的时候,通过
类名.静态成员变量名
调用 - 静态成员变量的默认值,跟普通成员变量是一样的
- 静态成员变量属于类,跟对象没关系,所有对象共享静态成员变量
注意
虽然可以通过对象名.静态成员变量名
访问,但不要这样写
要使用类名.静态成员变量名
去访问
只存在静态成员变量,不存在静态局部变量
静态成员方法
语法
权限修饰符 static 方法返回值类型 方法名(形参列表){
// 方法体
}
说明
- 无需创建对象就可以通过
类名.方法名
直接调用 - 同一个类中的
static
方法相互调用可以省略类名,直接用方法名调用。(这就是我们之前方法的调用)
注意事项
-
一个类中,静态方法无法直接调用非静态的方法和属性,也不能使用
this
,super
关键字(super后面会讲),静态的方法只能访问静态的,不能访问非静态的方法和属性- 经典错误:
Non-static field/method xxx cannot be referenced from a static context
- 原因:静态方法调用的时候,完全有可能没有对象,没有对象普通成员就无法访问。
- 经典错误:
-
普通成员方法当中,既可以访问静态成员的, 也可以访问非静态成员。普通成员方法访问任意的
- 访问静态成员变量的时候,使用
类名.变量名
的形式访问,以示区别,增加代码可读性
- 访问静态成员变量的时候,使用
类加载的时机(更新)
- 执行
main
方法的时候 - 首次创建对象之前
- 首次访问类中的静态成员的时候(静态成员变量、静态方法)
static VS 非static
- 成员的所属
static属于类;非static属于对象 - 在内存中的位置
static在类加载过程中生成的这个类所对应的字节码文件对象中(Class对象),或者在方法区的静态域当中。
非static在堆上的的对象里面 - 在内存中出现的时间
static伴随着类的加载而加载,一定先于非static
非static的成员随着对象的创建而存在 - 调用方式
static调用,可以通过类名.
,也可以通过对象.
调用(使用的时候要求使用类名.
方式调用)
非static调用,通过对象.
方式调用
使用场景
静态成员变量
- 属于全体对象所共享而不是独属于某个对象的成员变量
- 在整个类全局独一份的(因为类加载只有一次)
静态成员方法
- 静态方法的主要特点就是调用简单,无需创建对象即可调用
- 当一个类中全部都是静态成员方法时,类中所有方法的调用都可以使用
类名.
完成,这就是Java当中的”工具类“。
匿名对象
含义
之前的写法:类名 对象名 = new 类名()
现在: new 类名()
,没有引用接受,没有名字,匿名对象
使用场景
- 方法调用的时候,匿名对象作为参数进行传递
- 方法的返回值,匿名对象作为方法的返回值
优点:
- 使用匿名对象,代码简洁(相当于少写了一些代码)
- 从理论上来说,可以提升内存利用率
缺点
匿名对象由于没有引用指向,所以它是一次性的,用完之后就无法再次使用了
eg:
test(new Student());