十二、面向对象-高级
1. 关键字static、final
1.1 static 概念
将类的成员(属性、方法、代码块、内部类)归属于类本身所有,所有实例对象共享同一个 static 成员
也就是说,无论创建多少个对象,共享同一份 static 修饰的类成员(属性、方法、代码块、内部类)
- static 的含义是 “
静态的” - 被 static 修饰的属性,称之为静态属性
- 被 static 修饰的方法,称之为静态方法
- 被 static 修饰的代码块,称之为静态代码块
- 被 static 修饰的内部类,称之为静态内部类
1.2 static 的特点
- 随着类的加载而加载(不需要依托于创建对象时才加载)
- 被 static 修饰的成员,被该类的
所有对象共享 - 在访问权限允许时,可以
直接通过类调用
1.3 静态变量
被 static 修饰的属性(变量),称之为静态属性(变量),常用于作为常量等
语法格式:
[权限修饰符] static 数据类型 变量名;
- 静态变量的默认值规则和实例变量一样
- 静态变量所有对象共享
- 静态变量的 get/set 方法也静态的,当局部变量与静态变量
重名时,可使用类名.静态变量进行区分
内存解析: 暂无
1.4 静态方法
被 static 修饰的方法,称之为静态方法,常用于工具类中的方法等
语法格式:
[权限修饰符] static 返回值类型 方法名(形参列表) {
// 方法体
}
- 在 static 方法内部
只能访问类的static修饰的属性或方法,不能访问类的非static的结构 - 静态方法可以被子类继承,但不能被子类重写
- 静态方法的调用都只看编译时类型
内存解析: 暂无
1.5 静态代码块
类加载时自动执行一次,常用于初始化静态资源、加载配置、连接数据库等
语法格式:
public class Test {
// 静态代码块
static {
System.out.println("类加载时执行,只执行一次");
}
}
"tips: 类加载顺序中,静态代码块 > 构造代码块 > 构造方法"
1.6 静态内部类
静态内部类 不需要创建外部类对象 就能使用,但只能访问外部类的 静态成员
语法格式:
public class Outer {
static int num = 100;
// 静态内部类
static class Inner {
public void show() {
System.out.println(num);
}
}
}
1.7 拓展知识点
- 静态方法能不能重写? 不能,静态方法是 属于类 的,重写是针对对象的多态
- 静态变量存在哪里? JDK8 之前在方法区,JDK8+ 在 堆内存 的类元数据中
- main 方法为什么是 static? 程序启动时还没有对象,必须用 static 让 JVM 直接调用