您的位置:程序门 -> java -> sun java 认证



一个选择题,给出经典的解释,谢过


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


一个选择题,给出经典的解释,谢过
发表于:2007-08-22 23:20:51 楼主
1.   public   class   test   {
2.             public   static   void   add3   (integer   i)   }
3.             int   val   =   i.intvalue   (   );
4.                       val   +=   3;
5.                       i   =   new   integer   (val);
6.             }
7.    
8.       public   static   void   main   (string   args   [   ]   )     {
9.         integer     i   =   new   integer   (0);
10.           add3   (i);
11.             system.out.printin   (i.intvalue   (   )     );
12.       }
13.   )  
what   is   the   result?  
a.   compilation   will   fail.
b.   the   program   prints   “0”.
c.   the   program   prints   “3”.
d.   compilation   will   succeed   but   an   exception   will   be   thrown   at   line   3.  
发表于:2007-08-22 23:27:351楼 得分:0
答案是b不?
发表于:2007-08-22 23:31:252楼 得分:0

,咋来
是b
发表于:2007-08-22 23:34:023楼 得分:0
随便蒙一下居然蒙中了,嘿嘿
发表于:2007-08-22 23:35:484楼 得分:0
解释下你蒙的过程
发表于:2007-08-23 00:16:585楼 得分:0
because  
i   =   new   integer   (val);
发表于:2007-08-23 00:38:426楼 得分:0
val=?
发表于:2007-08-23 12:59:187楼 得分:0
值传递和变量作用域的问题,很基础的问题。

拿本java书,好好看看。
发表于:2007-08-23 13:32:148楼 得分:0
因为方法没有返回值,所以方法执行没有意义的
发表于:2007-08-23 13:43:389楼 得分:0
变量作用域
不同括号里定义的i是不同的i,彼i,非此i
所以您只需要看这两行程序就ok,其他的不用管,
  integer     i   =   new   integer   (0);
  system.out.printin   (i.intvalue   (   )     );
楼主请多看基础书,多思考

发表于:2007-08-23 15:31:0410楼 得分:0
参数不是对象,在方法里改变参数是不会对实参改变的,
发表于:2007-08-23 16:01:5311楼 得分:0
all   above   answer   is   error.

integer   is   a   final   class   is   the   real   reason.
if   parameter   is   not   interger   ,   answer   will   be   what?

public   class   test   {
2.             public   static   void   add3   (data   i)   }
3.             int   val   =   i.intvalue   (   );
4.                       val   +=   3;
5.                       i   =   new   data   (val);
6.             }
7.    
8.       public   static   void   main   (string   args   [   ]   )     {
9.         data   i   =   new   data   (0);
10.           add3   (i);
11.             system.out.printin   (i.intvalue   (   )     );
12.       }
13.   )  
what   is   the   result?  
a.   compilation   will   fail.
b.   the   program   prints   “0”.
c.   the   program   prints   “3”.
d.   compilation   will   succeed   but   an   exception   will   be   thrown   at   line   3.
发表于:2007-08-23 16:23:4012楼 得分:0
首先建议这个程序代码打打好,哪里有“)”结尾的

b是正解,add里面的这个integer引用我们看作a引用,它原来指向我们看作b引用,而b引用指向一个实际的目标0
add里面更改了a的指向,而b的指向没变,所以在输出b引用的时候就等于原来的值
发表于:2007-08-23 16:48:2013楼 得分:0
上面的答案除了   dtliupeng(吉利)   的回答以外,其他的全是错误的。

integer对象是final   class,其对象值是不可改变的(对象实例化以后值就不可改变);其“值的改变”是依靠于重新生成定义新值的对象(string对象也是这样的)。

如果上例中采用的为   非final   class,则应该选择c,而不是b。
发表于:2007-08-23 18:27:3014楼 得分:0
按照yaray的说法答案也应该是b   不是么?   为什么说上面都错了呢。。。糊涂了

另:楼主打代码好粗心
发表于:2007-08-24 14:33:5615楼 得分:0
奇了,一开始我还真以为是我错了,是dtliupeng(吉利)说的这么回事,但是我却测试不出来,如果是真的,请给出证明?谢谢

test.java
=================================================================
final   class   a{
    public   int   i;
    public   a(int   i){
        this.i   =   i;
    }
    public   int   get(){
        return   i;
    }
}
class   b{
    public   int   i;
    public   b(int   i){
        this.i   =   i;
    }
    public   int   get(){
        return   i;
    }
}
public   class   test{
    public   static   void   f(a   a1){
        a1   =   new   a(5);
    }
    public   static   void   f(b   b1){
        b1   =   new   b(5);
    }
    public   static   void   main(string   args[]){
        a   a1   =   new   a(3);
        system.out.println( "a1.1: "+a1.get());
        f(a1);
        system.out.println( "a1.2: "+a1.get());
        system.out.println( "================ ");
        b   b1   =   new   b(3);
        system.out.println( "b1.1: "+b1.get());
        f(b1);
        system.out.println( "b1.2: "+b1.get());
    }
}
===========================================================
c:\java> java   test
a1.1:3
a1.2:3
================
b1.1:3
b1.2:3
发表于:2007-08-24 14:51:3316楼 得分:0
证据:

test.java
=========================================
final   class   a{
    public   int   i;
    public   a(int   i){
        this.i   =   i;
    }
    public   int   get(){
        return   i;
    }
}
public   class   test{
    public   static   void   f(a   a1){
        a1   =   new   a(5);
    }
    public   static   void   main(string   args[]){
        a   a1   =   new   a(3);
        system.out.println(a1.get());
        f(a1);
        system.out.println(a1.get());
    }
}


===========================================
c:\java> javap   -c   test
compiled   from   "test.java "
public   class   test   extends   java.lang.object{
public   test();
    code:
      0:       aload_0
      1:       invokespecial       #1;   //method   java/lang/object. " <init> ":()v
      4:       return

public   static   void   f(a);
    code:
      0:       new           #2;   //class   a
      3:       dup
      4:       iconst_5
      5:       invokespecial       #3;   //method   a. " <init> ":(i)v
      8:       astore_0                                                                                                                         //放入0
      9:       return

public   static   void   main(java.lang.string[]);
    code:
      0:       new           #2;   //class   a
      3:       dup
      4:       iconst_3
      5:       invokespecial       #3;   //method   a. " <init> ":(i)v
      8:       astore_1                                                                                                                         //放入1
      9:       getstatic               #4;   //field   java/lang/system.out:ljava/io/printstream;
      12:     aload_1                                                                                                                           //从1取
      13:     invokevirtual       #5;   //method   a.get:()i
      16:     invokevirtual       #6;   //method   java/io/printstream.println:(i)v
      19:     aload_1                                                                                                                           //从1取
      20:     invokestatic         #7;   //method   f:(la;)v
      23:     getstatic               #4;   //field   java/lang/system.out:ljava/io/printstream;
      26:     aload_1                                                                                                                           //从1取
      27:     invokevirtual       #5;   //method   a.get:()i
      30:     invokevirtual       #6;   //method   java/io/printstream.println:(i)v
      33:     return

}

======================================================================
结论:根本就是不同地址的对象,所以跟是否final无关
发表于:2007-08-25 22:58:5717楼 得分:0
我想问一下,如果我们换个引用类型的话,那么main()方法里面的第一句是调用了哪个构造方法?是不是还要加个构造方法才可以的?
发表于:2007-08-30 12:45:4818楼 得分:0
传值     和     传引用

integer     i   =   new   integer   (0);   首先在堆里面创建一个integer对象   然后在栈里创建一个变量名为i的变量,其值为指向刚才创建的那个integer对象

add3   (i);   又在栈里创建一个变量名为i的i的变量,其值为指向刚才创建的那个integer对象,执行     执行完后只是把这个变量的引用改变了   原先那个i的引用值没变
发表于:2007-08-30 14:02:4019楼 得分:0
yaray(雅睿,生活在别处)   (   )   信誉:110     2007-8-23   16:48:21     得分:   0    
 
 
     
上面的答案除了   dtliupeng(吉利)   的回答以外,其他的全是错误的。

integer对象是final   class,其对象值是不可改变的(对象实例化以后值就不可改变);其“值的改变”是依靠于重新生成定义新值的对象(string对象也是这样的)。

如果上例中采用的为   非final   class,则应该选择c,而不是b。

==========================================================

这题考查是值转递和局部变量引用的问题,system.out.println   (i.intvalue   (   )   );语句中变量i是main方法中定义的,和add3方法的参数变量i没有关系,和integer是final类更没有关系
发表于:2007-08-30 16:04:5020楼 得分:0
补充一下,如果如下修改add3方法,则要考虑到integer是final类:
public   class   test   {
public   static   void   add3   (integer   i){
    //int   val   =   i.intvalue();
    //val   +=   3;
    i   =   i   +   3;
}
public   static   void   main   (string[]   args)   {
    integer     i   =   new   integer   (0);
    add3   (i);
    system.out.println   (i.intvalue());
                  }
}

因为integer是final类,i   =   i   +   3将会产生一个新的integer对象,同样也不会改变main方法中变量i所引用的integer对象,输出还是0;若换成非final类,输出则是3。
发表于:2007-08-30 21:24:5421楼 得分:0
抛出,你程序的笔下错,答案是b
发表于:2007-09-04 12:09:3422楼 得分:0
真热闹。
发表于:2007-09-05 16:30:1023楼 得分:0
对于对象引用,被调用的方法不能重新对调用者原来的引用变量赋值,使其引用另一个不同的对象.
例如:
import   java.awt.dimension;
public   class   refer
{
public   static   void   main(string[]   args)   {
dimension   d   =   new   dimension(5,10);
refer   rt   =   new   refer();
system.out.println(d.height);
rt.modify(d);
system.out.println(d.height);
}

void   modify(dimension   d)   {
        d.height   =   d.height   +   10;
        d   =   new   dimension(5,25);   //这种赋值并不会影响原引用变量,它其实只是一副本
}
}
运行结果是
10
20

另外同final   class   也无任何关系.可参考:scjp学习指南   3.3.2章节.
发表于:2007-09-10 21:22:4724楼 得分:0
要抓住主要的部分,后面都重新定义了~~~
发表于:2007-09-10 21:52:1425楼 得分:0
package   test;

public   class   t1   {

public   static   void   main(string[]   args)   {
integer   i   =   new   integer(0);
add3(i);
system.out.println(i.intvalue());
}

public   static   void   add3(integer   i)   {
int   val   =   i.intvalue();
val   +=   3;
i   =   new   integer(val);
}

}
答案:0   (b)
发表于:2007-09-10 22:01:4726楼 得分:0
在方法里调用的都是i的副本,而最后打出来是i的值,i的值一直都没变过,答案就是0咯,如果你在add3中加入一条打印语句,那么打印出来的结果肯定是3咯。
发表于:2007-09-10 22:03:4927楼 得分:0
答案:c
发表于:2007-09-11 00:48:4728楼 得分:0
1.integer是final类无法改变其值.
2.参数传递的是副本,既此i非彼i.
3.在方法add3中没有改变原始内存的代码.(当然原始内容为fianl的所以也改变不了)
所以在方法中i=new   integer(value)使这个副本引用,指向了另一地方.在退出方法add3后引用会消失(add3方法中的i为局部变量).所以在main方法输出i.value是原来的(真正的i)i.


发表于:2007-09-11 00:50:2129楼 得分:0
答案是b
发表于:2007-09-19 14:00:0630楼 得分:0
b     简单类型   按值传递     如果是对象   那就要按引用地址来传递
发表于:2007-09-19 15:28:1131楼 得分:0
integer换成string也是一样的,也和final有点道理,关键传递了引用的副本,原本的引用指向的内存地址的值(也就是堆的内容)没有被改变过,画一张流程图大家就明白了。。。
发表于:2007-09-21 22:25:4632楼 得分:0
你们用的是jdk   1.5吗?   似乎说的都有道理
可我改了改   也还是选b阿

class   data
{
double   d;
public   data(double   d)
{
this.d=d;
}
public   double   getdata()
{
return   d;
}
}

public   class   helloworld
{
public   static   void   main(   string[]   args   )
{
data   i   =   new   data   (0);
add3   (i);
system.out.println   (   i.getdata()     );
}

public   static   void   add3(   data   i   )
{
double   val   =   i.getdata();
val   +=   3;
i   =   new   data(   val   );
}
}

所以我认为还是   传值得问题   传得是引用,  
i   =   new   data(   val   );
最后这句   只是改变   局部变量i的引用地址   ,并没有改变   原来
data   i   =   new   data   (0);
这句里的i的引用值
发表于:2007-09-21 23:42:2133楼 得分:0
1.   public   class   test   {
2.             public   static   void   add3   (integer   i)   }
3.             int   val   =   i.intvalue   (   );
4.                       val   +=   3;
5.                       i   =   new   integer   (val);
6.             }
7.    
8.       public   static   void   main   (string   args   [   ]   )     {
9.         integer     i   =   new   integer   (0);
10.           add3   (i);
11.             system.out.printin   (i.intvalue   (   )     );
12.       }
13.   )  
what   is   the   result?  
a.   compilation   will   fail.
b.   the   program   prints   “0”.
c.   the   program   prints   “3”.
d.   compilation   will   succeed   but   an   exception   will   be   thrown   at   line   3.  

就题目的这段代码,你把integer再换成任何东西,答案也是b。
除非把第5行代码改成:
        i.setvalue(val);
或类似的语句。

这个和final不final没关系。java的参数传递是:如果是对象类型,永远传引用;如果是primary类型,永远传值。

这里答案是b的原因可以这样理解。

首先要知道,引用其实也就是地址。在main()里,i被创建,假设i变量所引用的integer是在地址0xaaaabbbb,那么调用add3(i)时,会在add3函数的执行堆栈上分配一个空间,里面装了0xaaaabbbb这个地址。执行到第5行给i重新赋值时,假设新integer对象的地址是0xccccdddd,那这个赋值只是将0xccccdddd写到了堆栈上分配的空间里,main()里那个i的指向并不曾发生变化,所以,等add3()返回时,i原来该是啥现在还是啥。

这么说,楼主明白了么??
发表于:2007-09-21 23:52:3434楼 得分:0
p.s.  

integer是定义为final的,这个是为了安全考虑,基本类型保持封闭,不允许被用户程序继承后修改其语意。但楼上几位说final的对象不可修改,那是错误的。final只是不可继承,并非不可修改。比如:

public   final   class   a   {
    public   int   intvalue;
}

a   a   =   new   a();
a.intvalue   =   ...   //   whatever

这个类是final的,但是其内容可以随便改。

一个对象创建后,如果其内部状态不可改变,正确的叫法是说,这是个不可变对象(immutable   object),这个和对象所属类是否final没关系,只要没有类似setter的方法,那么这个类的的对象就都是immutable   object.

题外话:不可变对象有个极大的优势,就是永远是线程安全的(thread-safe),在使用这类对象时,不需要同步原语。
发表于:2007-09-22 17:33:1435楼 得分:0
同意   manbaum(砸锅上网)   的说法
final   修饰   类,   类不可以被继承
final   修饰   方法,   方法不可以被重写或覆盖
final   修饰   变量,   变量不可以被修改!
发表于:2007-09-27 23:14:1236楼 得分:0
yaray(雅睿,生活在别处)   (   )   信誉:110     2007-8-23   16:48:21     得分:   0    
 
 
     
上面的答案除了   dtliupeng(吉利)   的回答以外,其他的全是错误的。

integer对象是final   class,其对象值是不可改变的(对象实例化以后值就不可改变);其“值的改变”是依靠于重新生成定义新值的对象(string对象也是这样的)。

如果上例中采用的为   非final   class,则应该选择c,而不是b。

   

  kome2000()   (   )   信誉:90     2007-9-22   17:33:14     得分:   0    
 
 
     
同意   manbaum(砸锅上网)   的说法
final   修饰   类,   类不可以被继承
final   修饰   方法,   方法不可以被重写或覆盖
final   修饰   变量,   变量不可以被修改!

   
 


先说一下:一个final类型实例的类变量,是不能再指向(引用)另一个地址的类型实例,而不是对象实例化以后值就不可改变,它所指向的地址的值仍是可变的.当然这样的类自是不可继承的,不过这与本题无关.
 


1.   public   class   test   {
2.             public   static   void   add3   (integer   i)   }//第二个i(叫i2),i2指向i1所指向的实例,值为0的那个实例(现在唯一的一个实例)
3.             int   val   =   i.intvalue   (   );//变量val(第三个变量),其值为0,这个值是由i2指向的实例获得的
4.                       val   +=   3;//变量val值变为3
5.                       i   =   new   integer   (val);//由val构造出第二个integer实例(也是本题第二个实例),由i2指向
6.             }
7.    
8.       public   static   void   main   (string   args   [   ]   )     {
9.         integer     i   =   new   integer   (0);//第一个i(叫i1吧),指向一个integer实例,值为0
10.           add3   (i);//i1指针(引用)被传递
11.             system.out.printin   (i.intvalue   (   )     );//最后,i1仍然安静的默默的指向着第一个integer实例(也是本题第一个实例),那么它的值仍然是0了
12.       }
13.   }
发表于:2007-10-01 13:36:4537楼 得分:0
答案是b
发表于:2007-10-08 11:54:2438楼 得分:0
坚决是0
看作用域,不是对象的引用
发表于:2007-10-09 14:20:3339楼 得分:0


结果是0



答案是3

如果是integer而不是data,结果是0

自己去调试,不调试就在这儿瞎说。。
发表于:2007-10-09 14:22:0840楼 得分:0
code没发出来。晕倒。。
public   class   test
{
public   static   void   add3(data   i)
{
int   val   =   i.intvalue();
val   +=   3;
i   =   new   data(val);
}

public   static   void   main(string   args[])
{
data   i   =   new   data(0);
add3(i);
system.out.println(i.intvalue());
}
}

class   data
{
int   data;

public   data(int   i)
{
data   =   i;
}

public   int   intvalue()
{
return   data;
}
}


结果是0


public   class   test
{
public   static   void   add3(data   i)
{
int   val   =   i.intvalue();
val   +=   3;
i.data   =   val;
}

public   static   void   main(string   args[])
{
data   i   =   new   data(0);
add3(i);
system.out.println(i.intvalue());
}
}

class   data
{
public   int   data;

public   data(int   i)
{
data   =   i;
}

public   int   intvalue()
{
return   data;
}
}

答案是3

如果是integer而不是data,结果是0


注意后面的对象是new出来的,不是修改引用!!!
发表于:2007-10-09 23:43:1041楼 得分:0
public   class   test  
{  
    public   static   void   add3(data   i)  
    {  
        int   val   =   i.intvalue();  
        val   +=   3;  
        i   =   new   data(val);   //由变量值为3的变量构造出一个实例,并由第二个i指向,那么前面一个i指向的实例怎么会变?结果当然是0
    }  

    public   static   void   main(string   args[])  
    {  
        data   i   =   new   data(0);  
        add3(i);  
        system.out.println(i.intvalue());  
    }  
}  

class   data  
{  
    int   data;  

    public   data(int   i)  
    {  
        data   =   i;  
    }  

    public   int   intvalue()  
    {  
        return   data;  
    }  
}  


结果是0  


public   class   test  
{  
    public   static   void   add3(data   i)  
    {  
        int   val   =   i.intvalue();  
        val   +=   3;  
        i.data   =   val;   //两个i一起指向的那个实例值变成了3,结果当然是3
    }  

    public   static   void   main(string   args[])  
    {  
        data   i   =   new   data(0);  
        add3(i);  
        system.out.println(i.intvalue());  
    }  
}  

class   data  
{  
    public   int   data;  

    public   data(int   i)  
    {  
    data   =   i;  
    }  

    public   int   intvalue()  
    {  
        return   data;  
    }  
}  

答案是3  


真不知道有什么好争的了
发表于:2007-10-22 09:59:4042楼 得分:0
java--值传递的一个问题.
传递的是i这个引用的一个副本,
所以修改对i这个引用本身没有任何改变.
发表于:2007-10-22 10:02:2943楼 得分:0
忘记说答案了   是b   因为没有改变的只是i这个引用的一个副本,本身没有改变,所以还是0
发表于:2007-10-24 17:24:4444楼 得分:0
1.       public       class       test       {  
2.                           public       static       void       add3       (integer       i)       }  
3.                           int       val       =       i.intvalue       (       );  
4.                                               val       +=       3;  
5.                                               i       =       new       integer       (val);  
6.                           }  
7.          
8.               public       static       void       main       (string       args       [       ]       )           {  
9.                   integer           i       =       new       integer       (0);  
10.                       add3       (i);  
11.                           system.out.printin       (i.intvalue       (       )           );  
12.               }  
13.       )      
what       is       the       result?      
a.       compilation       will       fail.  
b.       the       program       prints       “0”.  
c.       the       program       prints       “3”.  
d.       compilation       will       succeed       but       an       exception       will       be       thrown       at       line       3.      
我不知道是楼主敲错了还是怎么,至少我看这段代码有问题!最起码的大括号就匹配,看看第二行,最后一个大括号是},不是{,也就是说,语法上就通不过!
发表于:2007-10-24 21:14:2145楼 得分:0
值传值并不能改变实参的值,只有引用传值才能改变实参的值
发表于:2007-10-25 09:13:1946楼 得分:0
yaray  
雅睿,生活在别处  
等   级:
  发表于:2007-08-23   16:48:2013楼   得分:0  
上面的答案除了       dtliupeng(吉利)       的回答以外,其他的全是错误的。  

integer对象是final       class,其对象值是不可改变的(对象实例化以后值就不可改变);其“值的改变”是依靠于重新生成定义新值的对象(string对象也是这样的)。  

如果上例中采用的为       非final       class,则应该选择c,而不是b。  
 


======================

红星闪闪     乱说   可是很丢人的
发表于:2007-10-25 09:19:4547楼 得分:0
dtliupeng  
吉利  
等   级:
  发表于:2007-08-23   16:01:5311楼   得分:0  
all       above       answer       is       error.  

integer       is       a       final       class       is       the       real       reason.  
if       parameter       is       not       interger       ,       answer       will       be       what?  

public       class       test       {  
2.                           public       static       void       add3       (data       i)       }  
3.                           int       val       =       i.intvalue       (       );  
4.                                               val       +=       3;  
5.                                               i       =       new       data       (val);  
6.                           }  
7.          
8.               public       static       void       main       (string       args       [       ]       )           {  
9.                   data       i       =       new       data       (0);  
10.                       add3       (i);  
11.                           system.out.printin       (i.intvalue       (       )           );  
12.               }  
13.       )      
what       is       the       result?      
a.       compilation       will       fail.  
b.       the       program       prints       “0”.  
c.       the       program       prints       “3”.  
d.       compilation       will       succeed       but       an       exception       will       be       thrown       at       line       3.  
 
======================================

new   data(long   l)

new   data(0)   和   new   data(3)
只不过相差3毫秒
你当然看不出来
发表于:2007-11-19 08:35:1748楼 得分:0
学习了33楼正解   说的精彩!!!!
发表于:2007-11-20 09:45:3049楼 得分:0
传值不传址,等于没改。
发表于:2007-11-23 14:04:3750楼 得分:0
上机演算后,b。
package   tuzi1;
public   class   test
{   public   static   void   add3(integer   i)
{   int   val=i.intvalue();
    val+=3;
    i=new   integer(val);
}
    public   static   void   main(string   tuzi[])
{   integer   i=new   integer(0);
            add3(i);
    system.out.println(i.intvalue());
        }
}


快速检索

最新资讯
热门点击