首页 > 试题广场 >

What is the result of compilin

[单选题]
What is the result of compiling and executing the following fragment of code:
Boolean flag = false;
if (flag = true)
{
    System.out.println("true");
}
else
{
    System.out.println("false");
}

  • The code fails to compile at the “if” statement.
  • An exception is thrown at run-time at the “if” statement.
  • The text“true” is displayed.
  • The text“false”is displayed.
  • Nothing is displayed.
Boolean修饰的变量为包装类型,初始化值为false,进行赋值时会调用Boolean.valueOf(boolean b)方法自动拆箱为基本数据类型,因此赋值后flag值为true,输出文本true。 如果使用==比较,则输出文本false。if的语句比较,除boolean外的其他类型都不能使用赋值语句,否则会提示无法转成布尔值。
发表于 2015-09-02 16:30:57 回复(25)
JAVA的赋值运算是有返回值的,赋了什么值,就返回什么值
发表于 2016-08-09 19:39:14 回复(19)
boolean flag ;括号内是对flag进行复制。(true) 执行第一句话。
发表于 2016-02-02 19:26:20 回复(0)
我觉得在
if(flag=true){
}
中,只是一个赋值语句=======》隐含条件为
if((flag=true)==true){
}
发表于 2016-05-28 19:43:28 回复(18)

因为boolean 类型的变量可以用if()进行判断,但是如果是基本的数据类型 if(int/float/double=值)是不被允许的。

发表于 2015-08-27 19:50:56 回复(0)
JAVA的赋值运算是有返回值的,赋了什么值,就返回什么值,大家可以拿这个做理解
int a=b=1;
选d的都是有一定基础的人,因为第一行Boolean,包装类,不是基本类型boolean,有些高手可能觉得,包装类被重新赋值后返回的是旧值,但并不是这样。
发表于 2015-08-18 21:37:56 回复(7)
public static void main(String[] args){
	Boolean flag=false;//先调用Boolean.valueOf(boolean b)返回false对应的Boolean对象Boolean.FALSE,然后赋值给flag,flag值为Boolean.FALSE
	/* 先赋值,遇到if条件表达式自动拆箱
	 * 1. 先调用Boolean.valueOf(boolean b)返回true对应的Boolean对象Boolean.TRUE,然后赋值给flag,flag值为Boolean.TRUE
	 * 2. 调用booleanValue()返回flag值对应的基础数据类型值true
	 * 3. 结果输出true
	 */
	if (flag=true){
	    System.out.println("true");
	}else{
	    System.out.println("false");
	}
}            

编辑于 2016-11-25 15:23:44 回复(1)
C,因为flag = true,将flag置成了true, 即等价于if(true),所以会输出true
编辑于 2018-10-23 20:08:53 回复(3)
flag=true,这里赋值并没有错,被自己误导了
发表于 2015-07-14 23:01:13 回复(8)
Boolean flag = false
自动装箱将false变为Boolean
if (flag = true)
先赋值自动装箱将true变为Boolean
然后执行if (flag)
自动拆箱将flag变为boolean且值为true
如果条件语句是if (flag == true)
则返回false;
发表于 2017-07-12 15:39:43 回复(0)
答案:A
if (fag = true)
java中不允许赋值语句做判断条件,这里编译出错
编辑于 2015-08-03 14:15:50 回复(7)
flag = true这是一个赋值语句,不是判断语句。
发表于 2017-02-26 22:41:37 回复(0)
我忍不住要写解析啦,我看懂了原理是这样的:
1、首先定义了一个Boolean包装型的变量flag,先初始化赋值,指向false;
2、其次if(flag=true)  中,相当于对变量flag进行了一次赋值,即flag=true(也即flag指向装有true的布尔值的箱子);
3、if()执行过程中会对里面进行解析,由于是包装型,需要先解析转换成基本数据类型才能参与if条件句,即进行拆箱,当然拆完该箱子值为true啦;
4、接下来就正常运算就OK啦,
我也是结合上面大家评论总结出最正确的原理来的,嘿嘿
我自己也是学习了,第一次遇到~~
其实这题的关键核心就是if()条件句括号里面只针对基本数据类型运算,以后大家都记住了就行了
编辑于 2019-07-17 21:56:56 回复(1)
if () 语句只有布尔型数据可以赋值。
发表于 2018-05-11 16:59:25 回复(0)
大家看到没有
if()这里面竟然是赋值,不是布尔判断
又被他坑了
发表于 2017-01-07 12:14:55 回复(0)
我来说说错误答案A的设计目的。 不少看书仔细的朋友肯定都知道诸如String,包装类等都是不可变类,即其创建后对象不可再被修改。那么这类人就会认为if语句将flag的值重新改变了,所以编译会出问题。这就正好中了题目的圈套了。选A的人对java的final和不变类没理解。 final修饰基本类型不能对其重新赋值。 final修饰引用类型只保证对象的引用(地址)不变,对象的内容还是可以变的。//这就解释了if里的重新赋值问题。包装类还有String是可以重新赋值的。 Boolean flag = false; 栈中flag指向对象池的false对象。 flag = true; 栈中flag指向对象池的true对象。 对象池(String叫常量池)里的内容jvm会进行缓存处理。 而且除非程序退出池里的内容一直缓存着呢。这就是为何密码不能用字符串 不可变类的意思是创建该类的实例后,该实例的field不可变。 困惑点1.final 类并不等于不可变类,final类只是不能被继承的类,不可变类不一定有修饰符前缀final 困惑点2.不可变类与仅仅用final修饰的引用类型不同。前者保证内容不变,后者保证引用(地址)不变。 扩展:如何创建一个类为不可变类呢。 由上两点可知仅仅是声明final类和final field是错误的思路。 正确思路应该是: 1.private final field//注意若这个field是引用类型时,我们仅仅只是保证了这个引用不变,引用的内容可以变,那么最终将导致类转变为不可变类失败。 2.带参构造方法用于初始化field 3.设置getField方法 4.重写equals和hashCode 参考: 1.《疯狂java讲义第二版》 6.4 final 2.知乎问题 为什么Java中的密码优先使用 char[] 而不是String? psjava为什么采用string pool的设计? 在java中string为什么要设计成final的? 3. http://m.jb51.net/article/49092.htm 更多内容上stackoverflow/java 关键字wrapper classes,String,String pool,final,immutable
发表于 2015-10-27 09:50:11 回复(0)
应该选C
if中的判断为flag=true,是一个赋值语句,在java中返回值为true
发表于 2015-07-11 17:29:31 回复(0)
flag是一个boolean类型,在if中给flag赋值为true,在判断flag是否为true,那当然是真咯,输出true。看到解析恍然大悟啊~
发表于 2015-11-09 20:14:51 回复(0)
先赋值,再判断
发表于 2022-05-26 17:05:44 回复(0)

涉及装箱拆箱
给Boolean赋值时,会通过调用Boolean.valueOf(boolean)方法将基本类型自动装箱为包装器类型,此时实际为TRUE
然后在if中比较时,Boolean又通过调用Boolean.booleanValue()将包装器类型自动拆箱为基本类型,此时实际为true

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}
发表于 2020-03-14 17:00:16 回复(0)