`

JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)

阅读更多
removed.

请到博文下载PDF文件:http://zangweiren.iteye.com/blog/241218
42
13
分享到:
评论
57 楼 lyongjn 2013-11-23  
深入浅出,很容易理解,而且覆盖也很全面,看得出来花了相当大的精力编写。多谢LZ。
56 楼 wzju64676266 2010-02-07  
bboyuan 写道
臧圩人 写道
liaozh2004  写道
int型值可以赋给所有数值类型的变量;?????


是的,而且还包括char型:
public class Test {
	public static void main(String[] args) {
		byte b = (int) 1;
		short s = (int) 1;
		int i = (int) 1;
		long l = (int) 1;
		float f = (int) 1;
		double d = (int) 1;

		char c = (int) 1;
	}
}


连着看了博主的前几篇文章,让我更深刻的理解了java,非常感谢。
另外,我想再想博主请教一下,虽然按照char c = (int)1;这样写是可以的。
但是,为什么直接把int的引用赋值给char c就不行了呢?
请再帮我分析一下原因吧。
代码如下:

public class Test {

	public static void main(String [] args) {

		int i = 1;
                // Type mismatch: cannot convert from int to char
		char c = i;
		System.out.println(c);
	}

}




char c = (int)1  这样定义其实编译器做了处理,形成char c = '\001';
而下面的编译器不做处理,你只能强制转换
int i = 1;
// Type mismatch: cannot convert from int to char
char c = i;



int数值可以赋给所有数值类型的变量???

其实小于int类型的byte short char 都可以随便赋值的,只要不超出范围,在jdk5.0下都已经做了优化,
例如:
byte b = (short) 1;  
short s = (int) 1;  
int i = (int) 1;  
char cc = (byte) 1; 
会形成
byte b = 1;
short s = 1;
int i = 1;
char cc = '\001';

,这样效果就跟直接赋值一样,开发过程中如果这么写,就等于脱了裤子放屁,
但float double就不可以了


55 楼 bboyuan 2009-12-18  
臧圩人 写道
liaozh2004  写道
int型值可以赋给所有数值类型的变量;?????


是的,而且还包括char型:
public class Test {
	public static void main(String[] args) {
		byte b = (int) 1;
		short s = (int) 1;
		int i = (int) 1;
		long l = (int) 1;
		float f = (int) 1;
		double d = (int) 1;

		char c = (int) 1;
	}
}


连着看了博主的前几篇文章,让我更深刻的理解了java,非常感谢。
另外,我想再想博主请教一下,虽然按照char c = (int)1;这样写是可以的。
但是,为什么直接把int的引用赋值给char c就不行了呢?
请再帮我分析一下原因吧。
代码如下:

public class Test {

	public static void main(String [] args) {

		int i = 1;
                // Type mismatch: cannot convert from int to char
		char c = i;
		System.out.println(c);
	}

}

54 楼 lahvey 2009-07-29  
正数四舍五入
复数五舍六入
对否?
53 楼 shanshan_shan 2009-02-26  
对我的帮助很大。。。说的很是到位,把我不懂的细节都说的透彻。
52 楼 wangyazhen 2009-02-05  
臧圩人 写道

回复yuxh2008:
yuxh2008 写道
谢谢楼主, 提个建议先: 关于Math.round()方法曾看过一本书, 记忆相当深刻(当时初学java无意中看到这种方法简直佩服的五体投地), 这样记或许比较简单, 不管是什么参数, +0.5后再取整. 你仔细比较运行结果就会发现,+0.5后再取整是有问题的

那个貌似可以这样处理

如果参数是正数,则将参数+0.5 然后取参数的整数部分
如果参数是负数,则将参数-0.4 然后取参数的整数部分
不知道楼主怎么看
51 楼 dclwork 2008-12-17  
目前中国的程序员普篇水平还比较低和国外差很远,特别是高端软件人才算是凤毛麟角,我看了许多的国内出版的书(包括清华大学著名教授的书)也不怎么样,所以我经常卖国外的书开,不过在看了LZ的文章后感觉比国外资深专家写的毫不逊色,而且也符合中国人的思维方式,中国只有有你这样的程序员,软件行业才有真正的出路!
50 楼 Ronald9 2008-12-07  
   1. byte、char、short、int四种基本类型以及它们的包装类(需要Java5.0/1.5以上版本支持)都可以用于switch语句。
   2. long、float、double、boolean四种基本类型以及它们的包装类(在Java所有版本中)都不能用于switch语句。
   3. enum类型,即枚举类型可以用于switch语句,但是要在Java5.0(1.5)版本以上才支持。
   4. 所有类型的对象(包括String类,但在Java5.0/1.5以上版本中,该项要排除byte、char、short、int四种基本类型对应的包装类)都不能用于switch语句。


上面的是您的总结..我觉得太麻烦了.下面是我的总结:

switch(表达式)
第1类:
只要结果是 int 类型及其兼容类型就可以了.
1)byte, short, char类型因为不参与运算.在运算时直接转成int类型.所以它们都可以用在 switch语句中.
2)int类型不用说,肯定能用.
3)至于float, double类型,只要能转换成int类型就可以了.
float f1 = 2.3f;
switch ((int)f1) 这样也没什么不可以...
第2类:
可以使用枚举类型

其他都不可以,boolean类型根本不与其他类型进行运算所以根本不用考虑
49 楼 Ronald9 2008-12-07  
对不起.是我的错.
因为我看得崩溃了.没看到你下面有说明..
这是我的错.对不起.麻烦您删了我刚发的..
再次声明对不起..我没看完..呵呵.
48 楼 Ronald9 2008-12-07  
楼主.看了你的这些教程.感觉有些还是不错.可是有些地方却也是有些值得商榷的地方..

1)
int int_int = 0; 
// int类型用Integer类型初始化 
int int_Integer = new Integer(0); 
// Integer类型用Integer类型初始化 
Integer Integer_Integer = new Integer(0); 
// Integer类型用int类型初始化 
Integer Integer_int = 0;

像这种写法估计没几个人会这样写.如果是程序员的话,当然.我猜测你只是想试图说明这个变量的作用吧.建议按Java规范取名..这种写法:第1看得难受,第2写起来也麻烦.

还有这里也是.
boolean boolean_boolean = true; 
// boolean类型用Boolean类型初始化 
boolean boolean_Boolean = new Boolean(true); 
// Boolean类型用Boolean类型初始化 
Boolean Boolean_Boolean = new Boolean(true); 
// Boolean类型用boolean类型初始化 
Boolean Boolean_boolean = true;

几乎看得让人崩溃..有些地方能简化就不要这样复杂了..

当然.我觉得您的这些文章还是相当不错的了..请不要见怪..

您是老师是吗??应该不会是程序员吧.
47 楼 Ronald9 2008-12-07  
Integer i1 = 1000;
Integer i2 = 1000;
System.out.println(i1==i2);
System.out.println(i1.equals(i2));

Integer i3 = 100;
Integer i4 = 100;
System.out.println(i3==i4);
System.out.println(i3.equals(i4));

具体过程你可以去参看SCJP考试的书籍.大意如下:
1)语句: Integer i1 = 1000
是自动装箱.是JDK 5.0之后提供的新功能. 与JDK1.4之前的语句等同
Integer i1 = new Integer(1000);

2)i1==i2是判断引用是否相等,因为i1和i2是不同对象所以  打印:false
i1.equals(i2)是判断对象是否相等,,打印:true

3)i3==i4,也是判断引用是否相等,但是java在处理时,如果包装类的值是在-128到127之间,会认为i3==i4,所以这个地方也是打印: true,而上面i1, i2不在-128到127之间,所以不满足这规则.

i3.equals(i4)   打印 true

46 楼 jackdown 2008-10-09  
引用
// 把一个long型值赋值给short型变量,编译时会报错,即使这个值没有超出short类型的取值范围  
// byte short_c = 1L;  


小小的问题
45 楼 lishali12345 2008-09-10  
确实非常的好,特别是对于像我这样的初学者!
十分之有用!
44 楼 臧圩人 2008-08-10  
回复uriesijsif:

引用
1、运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符右边数值类型相同。


这里,最后运算结果应该是与左边的数值类型相同,此处是笔误,新版本中已经修正。

引用
我想应该是这样:1、运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,执行运算的时候会进行提升,但运算结果会强制转换成运算符左边的类型。


我也是这么认为的,请参考这里:

引用
当使用+、-、*、/、%运算符对基本类型进行运算时,遵循如下规则:

1、只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
2、否则,只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
3、否则,只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
4、否则,两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。
43 楼 臧圩人 2008-08-10  
CJSDN网友uriesijsif写道:

引用
上面那个发错了,麻烦版主删下,我要问的是:
1、运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,且运算结果与运算符右边数值类型相同。

运算符右边的数值被强制转换成运算符左边的类型后,再执行运算,运算的时候会进行提升吗,比如说二个short型的变量参加算术运算时会提升为 int型,其结果也是int型,而这里 short s=1;s+=1;先把1转换成short型,然后运算,运算的时候会提升吗???
我想应该是这样:1、运算符右边的数值将首先被强制转换成与运算符左边数值相同的类型,然后再执行运算,执行运算的时候会进行提升,但运算结果会强制转换成运算符左边的类型。
42 楼 臧圩人 2008-08-06  
回复jiakechong:

jiakechong 写道

int型值可以赋给所有数值类型的变量
//////////
这句话不对把,不能赋值给byte,short把
如int int_a =1;
byte byte_a = int_a 会有错误把


看来是我的表述让大家误会了,我指的是int型的数值,不是int型的变量。
41 楼 jiakechong 2008-08-06  
int型值可以赋给所有数值类型的变量
//////////
   这句话不对把,不能赋值给byte,short把
如int int_a =1;
  byte byte_a = int_a 会有错误把
40 楼 臧圩人 2008-08-03  
回复evonli:

evonli 写道
rand 是 参数+0.5的floor值, 而floor返回一个<=参数的,最接近double无穷大的值.
然后就很容易算出来了


这是JDK中注释的写法,不过有点艰涩难懂(就是最接近double无穷大的值这里),这样理解反而容易些:

臧圩人 写道

对于round方法的参数i,经计算后的值是一个<=(i+0.5)的最大整数。
39 楼 evonli 2008-08-01  
rand 是 参数+0.5的floor值, 而floor返回一个<=参数的,最接近double无穷大的值.
然后就很容易算出来了
38 楼 臧圩人 2008-07-31  
liaozh2004  写道
int型值可以赋给所有数值类型的变量;?????


是的,而且还包括char型:
public class Test {
	public static void main(String[] args) {
		byte b = (int) 1;
		short s = (int) 1;
		int i = (int) 1;
		long l = (int) 1;
		float f = (int) 1;
		double d = (int) 1;

		char c = (int) 1;
	}
}

相关推荐

Global site tag (gtag.js) - Google Analytics