static 静态
static修饰符:成员修饰符,只能修饰类的成员(变量和方法),方法里面不能使用static修饰
被static修饰的成员,称为静态成员
静态内存图
静态的调用规则
内存图进行分析,静态的成员在内存中有自己的所属,属于自己的类
因此:静态的调用方式:类名.静态成员
静态使用的注意事项
- 不能在静态上下文中引用非静态变量
。静态不能直接使用非静态
。原因:生命周期,静态成员优先于非静态成员出现在内存中
静态不能调用非静态
非静态可以调用静态 - 静态方法中,禁止使用this和super
。this和super都和对象有关联
。静态优先对象存在
静态和对象无关性
多态:对象的多态性
静态成员:属于自己的类,和对象无关
public static void main(String[] args) {
FU f = new zi();
system. out. println(f.s); //s 静态变量,编译运行全是父类
f. show(); //方法show() 静态方法,编译运行全那是父类
}
成员的调用方式
- 静态成员
。类名调用
。可以被对象调用(错)javac编译器,直接编译为类名 - 非静态成员
。只能被对象调用
main方法解释
- public:被JVM调用,权限足够大
- static :JVM通过类名调用方法main
- void:返回值,返回调用者,JVM获得返回值无意义
- main:名字固定
- String[] args:存储字符串数组,以后会添加JVM的启动参数
静态成员和非静态成员的区别
- 内存上看区别
。静态成员变量,跟随类进入到静态区
。非静态成员变量,跟随对象进入到堆内存 - 所属上看区别
。静态成员变量,属于自己的类
。非静态成员变量,属于对象 - 从生命周期上看
。静态成员优先于非静态进入内存,在静态区里,程序结束才释放,最长
。非静态成员进入堆,对象成为垃圾后JVM进行回收相对较短 - 调用方式上看
。静态类名调用
。非静态对象调用 - 数据使用上看
。静态的成员,是所有对象的共享数据
。非静态的成员,是对象自己的特有数据
什么时候使用静态修饰
具体事务具体分析了,根据分析的结果,决定是否使用静态修饰
分析方法:分析这些事物之间是否存在共享数据,出现共享数据,static修饰
以上说的是静态成员变量
什么时候使用静态方法:如果方法中的功能使用了静态的成员变量,这个方法就应该static修饰
final修饰符
final翻译为最终的,不可改变的
- 可以修饰类
public final class A{} 最终类
最终类不被子类继承,A类没用孩子(太监类)
以前学过最终类:String Scanner System
- 可以修饰方法
public final 返回值类型 方法名(参数列表){} 最终方法
最终方法,不能被子类重写
有些累,定义的方法,一部分很完美,另一些方法不是很完善
- 可以修饰局部变量
final 数据类型 变量名 = 值 ; 最终变量
被final修饰的变量,一次赋值,终身不变
final修饰的是引用类型,引用类固定的是内存地址
- 可以修饰成员变量
成员变量定义在类中,方法外面.内存是在堆里面,变量会有默认值的.
固定的不是变量在内存中的默认值, final锁住的是我们手动赋值.
一次赋值,终身不变
成员变量的赋值方式: - 定义赋值
- 构造方法赋值
- set方法赋值
注意:成员变量使用final修饰 final int a ;构造方法可以为变量a赋值set方法不行