先看代码
class People {
int i;
People(int ii) {
i = ii;
System.out.println(i);
}
}public class FinalTest {
private final int i = 1;
private final int j;
private final People p;
public FinalTest() {
j = 2; //问题在这,被final修饰的变量不是常量吗?不是不能改变吗?
p = new People(3);
System.out.println(j);
}
public FinalTest(int x) {
j = x;
p = new People(x);
System.out.println(j);
}
public static void main(String[] args) {
FinalTest ft = new FinalTest();
FinalTest ft1 = new FinalTest(4);
}
}在这个代码中,不管是被final修饰的基本数据类型还是引用似乎都可以改变,高手来解释!
此程序可以编译通过,并能正确运行。
class People {
int i;
People(int ii) {
i = ii;
System.out.println(i);
}
}public class FinalTest {
private final int i = 1;
private final int j;
private final People p;
public FinalTest() {
j = 2; //问题在这,被final修饰的变量不是常量吗?不是不能改变吗?
p = new People(3);
System.out.println(j);
}
public FinalTest(int x) {
j = x;
p = new People(x);
System.out.println(j);
}
public static void main(String[] args) {
FinalTest ft = new FinalTest();
FinalTest ft1 = new FinalTest(4);
}
}在这个代码中,不管是被final修饰的基本数据类型还是引用似乎都可以改变,高手来解释!
此程序可以编译通过,并能正确运行。
解决方案 »
- 一个月看大流星概率91%,半个月是多少?
- java 打印的时候怎样设置页边距??????
- 如何在jdk api中查看有关构造函数的相关信息?
- 有关final 类的一个简单问题
- java有没有象msdn那样的帮助手册?
- 一直未得到解决的笔试题目
- jBuilderX使用问题? 在线等,解决立即给分!!
- 知道一个日期如何获得这个日期是该年的第几天?
- 如何把一個文件復制到另一個目錄??
- 请教组织一个StyledDocument类型的“量子级应用”的学习方法.
- import Object.Mine; 报错说 软件包 Object 找不到 怎么搞的
- unicode字符集只能表示65536个编码,为何说全世界都够用呢?中国的字符就几万个呀?
如果你这里都不赋值,连编译都过不了,好好想想为什么吧.
对于final修饰的引用,只是引用不能再指向其他对象,但其所指对象的属性还是可以被修改的.
要不就是在构造函数中显示赋值(当然此时它是成员变量。)
ft和ft1两个引用操作的j算是第一次赋值,final 表示被赋值后不能再改变
public static void main(String[] args) {
System.out.println(i);
i=2;//你试试
System.out.println(i);
}
你在声明时: private final int j; 没有显示初始化,那么就必须在构造方法中初始化赋值,或者在初始化块中初始化赋值,否则编译时出错,正因为你在构造方法里面:j=2;给j赋值了,所以编译通过;你把j=2注释掉,试一下就知道了;
2.final修饰的引用类型变量赋值之后,不能再指向其他对象!但是所引用对象的内部属性的值是可以改变的。
public FinalTest() { //构造方法
j = 2; //问题在这,被final修饰的变量不是常量吗?不是不能改变吗?
p = new People(3);
System.out.println(j);
}
public FinalTest(int x) { //(有参)构造方法
j = x;
p = new People(x);
System.out.println(j);
}
final必须在构造方法结束之前被赋值。可以在构造方法前面,也可以在构造方法中。
LZ,请问你还能在别的地方把j的值改变吗。
在未给予初始化值的情况下,可以在以后给final变量赋一次值,但这次赋完值之后就不能改动了。
按你们的意思这里是重新初始化了,但之前然不成对j赋值了2没有成功?前面我知道意思了,关键是要解释下这一点,还有我用debug测试了下程序,j会默认初始化为0,然后它的值再改变为2,然后改变为3. 请哪位大侠用myeclipse去debug一下。然后帮我解释一下啊。
FinalTest ft1 = new FinalTest(4);这分别是实例化了2个FinalTest类
虽然都是FinalTest 但是是两个不同的内存块另外在第一个不带参数的构造函数中 p=new People(3);
这里需要搞清楚People类里面有个i变量
在FinalTest类中你也定义了一个i
但是这两个i其实是不一样的两个变量
对应的是两个不同的内存地址
我对i没有疑问,就是对j有疑问,我用debug跑的时候j的赋值情况是0-->2-->0-->4
意思就是说j的值在构造函数已经由0变成2了,既然它要在构造函数里初始化,为什么还会事先初始化为0呢?不懂!!!
数据类型都是继承了object类 所以数据类型也是类 他也有属性方法等 如 string s, 变量s有length属性,有trim方法等 所以数据类型也有构造函数
在定义变量的时候 数据类型自带的构造器或者说构造函数会预先给变量一个默认值 int默认值为0,string的默认值为null
楼主可以这样理解:定义一个变量其实就是在实例化一种数据类型
楼主是知道答案的,O(∩_∩)O哈哈~ 把普通问题刻意敏感化。
这个问题都不知道还怎么学java呀
这是最基本的了(⊙o⊙)哦
刚看了书明白了其中道理final的变量是一定要赋值的,但是这个赋值的时间是在构造对象时。
也就是new 之后 final int j; 一定要有值。之后j不可以再被改变。当然如果你new两个对象就有两个j了。而不是改变原来的jclass test1
{
final int i;//在构造对象之后必须已对常量初始化
public static void main(String[] args)
{
test1 t = new test1(123);
test1 tt = new test1(12);
}
public test1(int i){
this.i = i;
System.out.println(i);
}
}