已有101人关注
final变量例题疑问
发表在Java图书答疑 2019-11-14 悬赏:2 学分 《Java从入门到精通(第4版)》第11章 类的高级特性
是否精华
版块置顶:

《java从入门到精通》第五版,197页例11.4在项目中创建FinalData类,在该类中创建Test内部类,并定义各种类型的final变量

import static java.lang.System.*;

import java.util.*;

class Test {

int i = 0;

}

public class FinalData {

static Random rand = new Random();

private final int VALUE_1 = 9; // 声明一个final常量

private static final int VALUE_2 = 10; // 声明一个final、static常量

private final Test test = new Test(); // 声明一个final引用

private Test test2 = new Test(); // 声明一个不是final的引用

private final int[] a = { 1, 2, 3, 4, 5, 6 }; // 声明一个定义为final的数组

private final int i4 = rand.nextInt(20);

private static final int i5 = rand.nextInt(20);

public  String toString() {               //问题1

return i4 + " " + i5 + " ";

}

public static void main(String[] args) {

FinalData data = new FinalData();

// data.test=new Test();

//可以对指定为final的引用中的成员变量赋值

//但不能将定义为final的引用指向其他引用

//data.VALUE_2=3;   不能改变定义为final的常量值

data.test2 = new Test(); // 可以将没有定义为final的引用指向其他引用

for (int i = 0; i < data.a.length; i++) {

a[i]=9; //不能对定义为final的数组赋值           问题2

}

out.println(data);

out.println("data2");

out.println(new FinalData());

out.println(data.a[3]);

// out.println(data);

}

}

这里碰到两个问题 


第一个问题是toString方法的重写,这个方法的返回类型是String型,但方法体中return后面返回的是i4 + " " + i5 + " ";这里面既有整型数,又有字符串。与方法声明中定义的String型不符,这样合规吗,还是我的理解有误。


第二个问题是给定义为final类型的数组重新赋值的字段 a[i]=9;编译的时候提示不能对非静态字段a进行静态引用,改成data.a[i]=9;后错误提示消失,在主方法里加一条输出语句out.println(data.a[3]);然后执行程序,运行正常,显示数组a[i]中的值已经被重新赋值都变成了9。这跟课本里说的不能对定义为final型的数组进行重新赋值不符,这又是怎么回事。


望解惑,谢谢。

分享到:
精彩评论 3
根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
2019-11-14
沙发
  1. 如视频课程截图图  

    image.png

  2. 静态方法中只能调用静态属性,非静态属性要通过对象调用。

stq20192019
学分:62 LV3
2019-11-14
板凳

老师第一个问题我明白了,但第二个问题,我想问的是在《java从入门到精通》第五版P197例11.4中讲到不能对定义为final的数组重新赋值,但例子中的代码 纠正不能在静态方法中调用静态属性的错误后运行显示可以对定义为final的数组重新赋值,前后矛盾了。

根号申
学分:4736 LV12
TA的每日心情
2021-07-16 23:48:46
2019-11-14
地板

并不矛盾,数组是引用变量,引用指向的是内存地址而不是具体值,你给数组赋值成另一个数据就报错了。

首页上一页 1 下一页尾页 3 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照