标签:width 内部类 ima 隐藏 原来 基本数据类型 .so 理解 可变
---恢复内容开始---
今天主要回顾一下 static 和 final 着两个关键字。
package cn.tedu.staticx; public class StaticExer { public static void main(String[] args) { new SDemo(); new SDemo(); new SDemo(); System.out.println(SDemo.count); } } class SDemo{ static int count = 0;//如果不用 static 则每一个对象创建的时候,都会赋值为 0 ,然后再加一次,只能是1 public SDemo(){ count++; } }
package cn.tedu.staticx; public class StaticDemo5 { public static void main(String[] args) { System.out.println(D.i); } } class D{ static int j = 5;//先将静态变量i放入方法区,并且标记一个值为0;在初始化阶段,再检查i是否有初始值0,如果没有初始值,则将标记值0赋值进去; //如果有初始值,则将初始值设置进去,抛弃标记值,然后顺次执行静态代码块,将静态变量i的值改为7 { j = 7; } //在类加载阶段,由于i处于一个标记值状态,所以实际上是无值的,所以此时不允许直接操作 static{ //先将静态变量i放入方法区,并且标记一个值为0;在初始化阶段,先执行静态代码块,对于i=7;并不是将7直接赋值给i;检查i是否有初始值, //如果没有初始值,则将标记值7赋值进去;如果有初始值则抛弃标记值,将初始值5赋值进去 i = 7; i = 9; //i -= 5;//进行运算就报错了,类在加载的时候是分了 5 个阶段:准备(加载这个类中的静态变量并标记默认值) -> 初始化(初始化静态变量,执行静态代码块) } static int i = 5; }
package cn.tedu.finalx; import java.util.Arrays; public class FinalDemo1 { public static void main(String[] args) { //final int i = 9; final int i; i = 13; final int[] arr = {3,6,1,7,0}; arr[1] = 8;//并没有报错,因为 arr 是一个对象 -> 地址不可变 //arr = new arr[4];//报错了,地址改变了 //arr.length = 9; //changeValue(i); System.out.println(i); expand(arr);//一开始主函数中有一个 arr 了,指向堆内存中的某个地址,当调用这个方法后,方法中的 arr 会指向这个地址,但改变后, System.out.println(arr.length);//方法中的arr指向新的地址,而主函数中的那个还是指向原来的地址(方法用完就释放堆内存中的资源) } //在这个方法中并没有将参数i定义为常量 public static void changeValue(int i){ i++; } public static void expand(int[] arr){ arr = Arrays.copyOf(arr, arr.length * 2); } } class A{ //定义成员常量 //成员常量 i 在对象完成创建之前给值 final int i = 6; int j; //静态常量必须在类加载完成之前给值 static final int k = 0; { //i = 10; } public A(){ //i = 10; } } /*class A{ private final int i; { //i = 4; } public A(){ this(5);//是对的 //this.i = 0;也是对的,两次调用是互不影响的 }//无参构造中未初始化常量 public A(int i){ this.i = i;//常量的二次赋值 } } */
---恢复内容结束---
标签:width 内部类 ima 隐藏 原来 基本数据类型 .so 理解 可变
原文地址:https://www.cnblogs.com/tangdiao/p/9460531.html