static
看一下官方解释
static 是用来干嘛的,
如果想要一个类的所有实例共享数据,就要使用静态变量。也叫类变量
所以static关键字的作用就是用来共享数据的。
- 所以方法里面的变量不能用static修饰(局部变量)
- static修饰的变量如果修改,所有用的对象实例的值都修改了
- static 修饰的变量,在类的初始化加载阶段 链接中的准备 阶段为类变量分配内存并且设置该类变量的默认初始值,即零值。然后初始化阶段如果显式赋值就会赋值。
初始化阶段就是执行类构造器法(),此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来。
- static 变量存在常量池中,运行时保存在 方法区中jdk6,jdk7之后保存在堆中 和 StringTable一起。
关键字final表示属性只能被赋值一次,一旦被赋值就不能更改,不同对象的值不同。
关键字static修饰的属性所有对象都只有一个值,在初始化后值可以改变。
static final修饰的属性只被赋值一次,初始化后不可修改,所有对象的值相同
final
被final修饰就是最终的
不能被重写、继承,不能被重新赋值等等
方法内的最终局部变量就是常量,但是还是存放在局部变量表中的。
final修饰必须初始化
内存中 存储在哪里? 对象的堆中,用jclasslib看一下
说明final变量还是存放在堆中的(因为 putfield意思就是给对象的filed赋值),对象存在堆中,没问题。
方法在创建对象时候调用
final static
常量,就是把final和static的特点结合到一起
在编译的时候就被分配了
内存中 存储在哪里? 常量池 也就是 方法区中
总结一下:
关键字final表示属性只能被赋值一次,一旦被赋值就不能更改,不同对象的值不同。
关键字static修饰的属性所有对象都只有一个值,在初始化后值可以改变。
static final修饰的属性只被赋值一次,初始化后不可修改,所有对象的值相同
Java中final、static和static final值的区别
Java 类中可以重写(覆盖)静态方法吗?
答案是不能。
静态方法是非虚方法,在编译期就确定了具体的调用版本,在运行时是不可变的。
是早期绑定的。
虽然这样写也没有错(子类中声明一个具有相同名称和方法签名的方法),但是并没有覆盖,方法被隐藏了。
举个🌰
public class CanWeOverrideStaticMethod {
public static void main(String args[]) {
Screen scrn = new ColorScreen();
scrn.show();
}
}
class Screen{
public static void show(){
System.out.printf("Static method from parent class");
}
}
class ColorScreen extends Screen{
public static void show(){
System.err.println("Overridden static method in Child Class in Java");
}
}
如果能覆盖的话,应该输出子类的show方法,但是结果是父类的。
因为**编译时类型由声明 该变量时使用的类型决定,运行时类型由实际赋给该变量的对象 决定**,在show方法编译期就绑定了声明的对象Screen,所以运行也是Screen的show方法
静态变量的初始化
- 声明 和 赋值是2个操作,顺序不影响
- 后声明 不能访问 只能赋值
public class Test {
static {
i = 20;
}
static int i =10;
}
等价与
public class Test {
static {
i = 20;
}
static int i;
static {
i =10;
}
}
等价于
public class Test {
static int i;
static {
i = 20;
i =10;
}
}
所以最后输出的值是10;
static{
i = 20; //给变量赋值可以正常通过
// System.out.println(i); //这句编译器会提示“非法向前引用”
}
static int i ;