从 final 这个关键字来看,没有区别int 和 Integer 的区别 是 一个是原始数据类型,一个是封装类Map<Integer,String>是可以的,int就不行。 而且int没有方法
final int a = 100; 是声明一个final常量 此变量值是不能改变的。 final Integer i = new Integer(100); 声明一个final引用,它只能恒定指向一个对象,无法将其改变指向另一个对象
用 final 修饰之后,表示楼主的 a, i 两个变量不能被重新赋值如果是类的非静态成员变量,则必须在声明时初始化,或者在构造方法中初始化如果是类的静态成员变量,则必须在声明时初始化,或者在类的静态块中初始化
final int a = 100; final StringBuffer sb = new StringBuffer(); a = 100;//这样会报错 sb = new StringBuffer();//这样也会报错 sb.append("OK");//这样就没问题final修饰基本类型,就是该变量的值不变;而修饰对象的时候,是该对象的引用不能变,里面的值可以修改的!
i指向Integer
学习到的总结如下: int 和 Integer 的区别 是 一个是原始数据类型,一个是封装类 final int a = 100; 是声明一个final常量 此变量值是不能改变的。 final Integer i = new Integer(100); 声明一个final引用,它只能恒定指向一个对象,无法将其改变指向另一个对象
final int a = 100; 标记 a 为不可变的常量。final Integer i = new Integer(100); 标记 i 只能指向初期化时的那个对象! 不能再指向别的对象! 但是 ---- 这个对象的值是可以被改变的!! 但是 ---- 你的这个例子有些特殊, 因为 Integer 和 String 一样具有不可变性, 所以在本例中, 对象的值也不能改变了!
final去修饰一个变量,表示这个变量为常量,不能再被重新赋值。 举例: ---------- final int i = 1; i=2;//这里将发生编译错误 ---------- final int i = 1; i=1;//同样也将发生错误,所以final去修饰变量。 ---------- //而这样是可以的,所以进一步说明,final修饰变量的时候,只能进行一次显式赋值。 final int i; i = 1; ---------- Integer integer = 2; final Integer i = integer; i = integer; //依然不行,更能说明上面的问题。 ---------- final Integer i = null; i = new Integer(2); //依然会报错,所以就算初次所赋值为空值也不能改变。 ---------- //but ...... final StringBuffer strB = new StringBuffer("123"); strB.append("456"); System.out.println(strB); //以上却是可以执行的,打印结果为"123456"。 ---------- 总结:被final修饰后的变量只能进行一次赋值,所以,它所持有的到对象的引用是不能变的(不能先指向A对象,继而指向B对象),但是它所引用的对象本身在内存中的值却是可以改变的。 ---------- 用final修饰类,则表示此类不能被继承。因此,final不能作用于抽象类和接口。 用final修饰方法,表示这个方法不能被重写(但是可以重载)。 ----------- 其实综上所述: final就是用来限制一个栈空间里的内存指引不能发生改变。 包括Method或Class也是一样,可以用这句话解释。
final修饰变量代表该变量为常量,其本身不能改变。如果是基本数据类型那么该值是不能改变的。 比如 final int i =10; 那么i的值是不能改变的。但是如果是复合数据类型,那么是其引用(也叫句柄)不能改变 比如 final StringBuffer test = new StringBuffer("Hello"); 那么其引用不能改变的意思是test不能再指向其他对象了 test = new StringBuffer("");//报错 但是在不更改其句柄的情况下修改其值是可以的。 test.append("World");//正确
而且int没有方法
final Integer i = new Integer(100); 声明一个final引用,它只能恒定指向一个对象,无法将其改变指向另一个对象
final int a = 100;
final StringBuffer sb = new StringBuffer();
a = 100;//这样会报错
sb = new StringBuffer();//这样也会报错
sb.append("OK");//这样就没问题final修饰基本类型,就是该变量的值不变;而修饰对象的时候,是该对象的引用不能变,里面的值可以修改的!
int 和 Integer 的区别 是 一个是原始数据类型,一个是封装类
final int a = 100; 是声明一个final常量 此变量值是不能改变的。
final Integer i = new Integer(100); 声明一个final引用,它只能恒定指向一个对象,无法将其改变指向另一个对象
标记 a 为不可变的常量。final Integer i = new Integer(100);
标记 i 只能指向初期化时的那个对象! 不能再指向别的对象! 但是 ---- 这个对象的值是可以被改变的!! 但是 ---- 你的这个例子有些特殊, 因为 Integer 和 String 一样具有不可变性, 所以在本例中, 对象的值也不能改变了!
举例:
----------
final int i = 1;
i=2;//这里将发生编译错误
----------
final int i = 1;
i=1;//同样也将发生错误,所以final去修饰变量。
----------
//而这样是可以的,所以进一步说明,final修饰变量的时候,只能进行一次显式赋值。
final int i;
i = 1;
----------
Integer integer = 2;
final Integer i = integer;
i = integer; //依然不行,更能说明上面的问题。
----------
final Integer i = null;
i = new Integer(2); //依然会报错,所以就算初次所赋值为空值也不能改变。
----------
//but ......
final StringBuffer strB = new StringBuffer("123");
strB.append("456");
System.out.println(strB);
//以上却是可以执行的,打印结果为"123456"。
----------
总结:被final修饰后的变量只能进行一次赋值,所以,它所持有的到对象的引用是不能变的(不能先指向A对象,继而指向B对象),但是它所引用的对象本身在内存中的值却是可以改变的。
----------
用final修饰类,则表示此类不能被继承。因此,final不能作用于抽象类和接口。
用final修饰方法,表示这个方法不能被重写(但是可以重载)。
-----------
其实综上所述:
final就是用来限制一个栈空间里的内存指引不能发生改变。
包括Method或Class也是一样,可以用这句话解释。
比如 final int i =10;
那么i的值是不能改变的。但是如果是复合数据类型,那么是其引用(也叫句柄)不能改变
比如 final StringBuffer test = new StringBuffer("Hello");
那么其引用不能改变的意思是test不能再指向其他对象了
test = new StringBuffer("");//报错
但是在不更改其句柄的情况下修改其值是可以的。
test.append("World");//正确