ststic关键字可以修饰 属性, 方法, 代码块, 内部类 static属于类不属于对象, Static不能修饰局部变量和外部类
静态的东西共同特点, 先于对象存在, 在类加载时被优先加载, 会被所有该类的对象共享静态域
- static修饰属性: 会在创建对象加载类时一并载入方法区中的静态域里, 这个载入早于创建对象存在
- 两种访问方式 类名和对象: 对象名.属性名 类名.属性名(推荐)
- 静态属性(叫类变量), 非静态属性(叫实例变量,就是没static修饰的)
- 使用思维: 当变量被反复赋予相同值时用static让其成为共享属性/或某些值需要被共享时则用ststic修饰
- 注意: static只能修饰成员变量, 不能修饰局部变量
- static修饰方法//没staic修饰的方法叫实例方法
- 方法常见修饰符为public和static, 它们之间没有先后顺序是并列的, static public void main( );也是可以的.
- 什么时候不能用static: 当一个行为执行过程中需要对象参与,则不能用static,要定义为实例方法
- 作用: 使方法实现类名调用(正常是要创建对象才能调用方法)
- 静态方法不能访问非静态属性和非静态方法//原理: 因为静态属性先于对象被加载, 而静态方法可以不用依托对象调用. 如果在未创建对象之前-, 静态方法就调用它的非静态属性, 由于对象还未创建所以会调用失败(非静态属性只能被对象调用).
- 如何访问非静态方法和属性: 由于静态方法属于类, 而非静态方法属于类的实例, , 因此从静态方法访问非静态方法则要创建类的实例, 然后通过实例调用非静态方法和属性. //就是创建非静态方法的类的对象, 然后通过对象调用.
- 静态方法不能使用this和super,他们都属于对象范畴,而static属于类范畴
- //原因同上, 静态属性先于对象被加载, 可能存在对象还未创建的情况
- static静态方法可通过类名和对象访问, 非静态方法只能用对象访问
- 在同一类中静态方法能被直接调用: 示例 在静态b方法调用静态c
static void b(){
System.out.println("b方法被执行了");
c(); } //直接写方法名既可以调用
static void c(){
System.out.println("c方法被执行了");
}
- 当static修饰的main方法遇见内部类时// 内部类也必须定义成静态否则会报错
-
- static使用场景:
- 当想用类名调用对象时用static
- 共享方法:当多个对象需要使用同一个方法时,可将方法设为静态。这样所有对象共享同个方法实例,便于管理和维护
- 避免创建过多的对象, 将原本需要实例化的对象设置为静态
- 静态方法只有在顶层类或者在静态内部类中定义,顶层类指的是public修饰的类和文件名相同的那个类,静态内部类是类中的静态类,所以静态方法只能在public类下或在类中的静态类里。
- 简单理解: static调用与static相对应的东西