A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于清云 中级黑马   /  2012-4-24 17:25  /  3662 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

先看这段小程序
class Question1{
public static void main(String[]args){
byte a=1000; //x1
long b=123456789012345789; //x2
System.out.println(a);
System.out.println(b);
}
}
这段程序在编译时,java首先指出变量b有问题,而不是a,在b后加上L,继续编译,java才指出a有问题;难道不是先执行语句x1,在执行x2吗?
下面这是关于构造函数的问题:
public class Question2{
int a;
Question2(){
a=10;
System.out.println("hello");
}
public static void main(String[]args){
Question2 ob=new Question2();
System.out.println(ob.a);
}
}
这段程序编译执行后会输出"hello"和"10",ob不是只引用了a吗?为什么连hello也输出了呢?
接下来的这个问题是关于for循环的:
class Question3{
public static void main(String[]args){
for(int a=1;a<=3; a++){ //x1
for(int b=1; b<=a; b++){ //x2
System.out.println('*'); //x3
}
System.out.println(); //x4
}
}
}
这段程序按照书本的说法应输出如下:
*
* *
* * *
但实际结果并非如此,而是
*

*
*

*
*
*
先不管输出结果,在两个for循环中:当a=1时,b=1,那么打印出一个‘*’,但当b自加1时,b<=a为false,这是执行x4后,a=2,b=1,接下来不应还输出一个'*'么?为什么是两个呢?
另外,a,b的值与*号有什么关系?为什么它们的值增加时,*的数目也跟着增加?怎样才能得出像书本所说的那种结果?
And one more question:
class Question4{
public static void main(String[]args){
int x=1;
for(int i=1;i<=10;i++){
while(x<50){
x+=1;
if(i*x++>40)break;
System.out.println(i*x+++" ");
}
}
}
}
这段程序的输出结果如下:
3 6 9 12 15 18 21 24 27 30 33 36 39
第一个结果是3这应没问题,第二次循环时x的值为3,i*x++无论是i乘x后再自加1,还是x自加1再与i相乘,这是的值都应为4,为什么会是6呢?
请各位高手多多指教,这里先谢过了。

7 个回复

倒序浏览
是先执行x1后执行x2的,肯定是顺序执行的。要不你再试试。
public class Question1 {
        public static void main(String[]args){
          byte a=1000; //x1
          long b=123456789012345789; //x2
          System.out.println(a);
          System.out.println(b);
        }
        }
回复 使用道具 举报
这个事默认执行的,只要你创建了Question2对象就会执行,不行你把System.out.println(ob.a);注释掉,再执行看看,还会
输出Hello
public class Question2 {
     int a;
     Question2(){
                a=10;
                System.out.println("hello");
                }
                public static void main(String[]args){
                        Question2 ob=new Question2();
                System.out.println(ob.a);
                }
                }
回复 使用道具 举报
本帖最后由 Friends★ 于 2012-4-24 18:10 编辑

/*这个问题是你多打印了一个回车
* */
class Question3 {
public static void main(String[]args){
for(int a=1;a<=3; a++){ //x1
for(int b=1; b<=a; b++){ //x2
System.out.print('*'); //x3  这个地方你多打印了一个回车
}
System.out.println(); //x4
}
}
}
回复 使用道具 举报
/*这个问题主要是运算符优先级的问题 ++的优先级高于*号,所以i*x++ 先算的是++*/
class Question4{
public static void main(String[]args){
int x=1;
    for(int i=1;i<=10;i++){
while(x<50){
    x+=1;
if(i*x++>40)break;
    System.out.print(i*x+++" ");
}
}
}
}
回复 使用道具 举报
本帖最后由 陆强强 于 2012-4-24 18:15 编辑

Question4:第二次循环时i 的值为2,while和if运行完,i++一次;
X++在i*x++运行的时候发生,不参与循环也就是说x++的值就是3,i 每循环一次就 i++一次;
如果打印结果换成i*x,
2 4 6 8 10 12 ......
回复 使用道具 举报
魏征 中级黑马 2012-4-24 19:52:32
7#
问题三是应为你在打印是换行了:System.out.println('*'); //x3 打印完内容会自动换行的。
应该System.out.print('*');x3位置换成这个就可以了。
回复 使用道具 举报
高鑫 中级黑马 2012-4-24 23:59:57
8#
class Question1{
public static void main(String[]args){
byte a=1000; //x1
long b=123456789012345789; //x2
System.out.println(a);
System.out.println(b);
}
}

这个问题是因为你的b定义的是long型,long型数据占64位,即-2的63次方~2的63次方-1之间的区间,你给b赋值的数字超过了这个区间,而byte型的a的区间是-128~127之间,也超出了byte型的范围,至于为什么先报b错,因为long型已经是最大类型的常量了,无法再提升,而byte a=1000,因为a容纳不下1000所以可以自动提升成为int型进行计算,所以先提示b错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马