public class Test{
public static void add3(Integer i){
int val=i.intValue();
val+=3;
i=new Integer(val);
}
public static void main(String args[]){
Integer i=new Integer(0);
add3(i);
System.out.println(i.intValue());
}
}
请问这个为什么输出的结果是0呢?
public static void add3(Integer i){
int val=i.intValue();
val+=3;
i=new Integer(val);
}
public static void main(String args[]){
Integer i=new Integer(0);
add3(i);
System.out.println(i.intValue());
}
}
请问这个为什么输出的结果是0呢?
class EnclosingOne{
public class InsideOne{}
}
public class InnerTest{
public static void main(String args[]){
EnclosingOne eo=new EnclosingOne();
//insert code here
}
}
A) InsideOne ei=eo.new InsideOne();
B) eo.InsideOne ei=eo.new InsideOne();
C) InsideOne ei=EnclosingOne.new InsideOne();
D) InsideOne ei=eo.new InsideOne();
E) EnclosingOne.InsideOne ei=eo.new InsideOne();
这是关于内部类的问题,请问哪位高手知道这是考内部类的哪些内容?请介绍详细一点,谢谢!
那个值怎样传递呢?
我怎么觉得结果是3呢?不是调用那个add()方法吗?
public class Lian {
public static void add3(Integer i) {
int val = i.intValue();
val += 3;
i = new Integer(val);
System.out.println(i.intValue());
} public static void main(String args[]) {
Integer i = new Integer(0);
add3(i);
}
}
main函数中的i为局部变量,所以在main方法中,输出时为此局部变量的值。
这个应该是作用域的问题
public class Test{
public static void add3(Integer i){
int val=i.intValue(); //而这i只可以在add3函数中
val+=3;
i=new Integer(val); //所以在这里i是3
}
public static void main(String args[]){
Integer i=new Integer(0); //这个i貌似是全局的
add3(i); //没有任何数据的返回,只是把add3中的i变成3啦,main中的i还是0
System.out.println(i.intValue()); //这个还是main中的i
}
}
举个例子:public class Test { public void exchangeXandY(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a= " + a);
System.out.println("b= " + b);//可以看出在被调用方法中确实交换了
} public static void main(String args[]) {
int a = 8;
int b = 9;
Test7 test = new Test7();
test.exchangeXandY(a, b);//在被调用函数中交换了a,b的值,但是不影响在main方法
System.out.println("a= " + a);
System.out.println("b= " + b); }
}
其实这个程序不符合面向对象程序的设计思想,所以只会出现在考试中,自己写OOP千万不能这样写。
public static void add3(Integer i){
int val=i.intValue();
val+=3;
i=new Integer(val); /*方法执行到此,i拆箱后的值是3,但是在方法内,没有继续传递所以只在方法内有效*/
}
public static void main(String args[]){
Integer i=new Integer(0);
add3(i);//调用结束,i依然是0,因为只是i拷贝了一份数据在方法内,i本身并未受到影响。
System.out.println(i.intValue());
}
} 要想得到i=3可以改成这样
public class Test{
public static Integer add3(Integer i){
int val=i.intValue();
val+=3;
i=new Integer(val);
return i;
}
public static void main(String args[]){
Integer i=new Integer(0);
i=Test.add3(i);
System.out.println(i.intValue());
}
}
add3(i); //因为该方法是void类型的,没有返回值 System.out.println(i.intValue()); //所以i的值一直是'0'。
你如果知道他们之间的内存关系,你就明白是怎么一回事了。
package shang;class Obj{
int val;
Obj(int i){
val = i;
}
}public class Arg {
public static void main(String[] args){
Obj obj = new Obj(1);
int val = 1;
valfn(val);
objfn(obj);
System.out.println(val);
System.out.println(obj.val);
}
public static void valfn(int i){
i++;
}
public static void objfn(Obj o){
o.val++;
}
}这段代码输出的结果是:1
2
首先我们需要搞清楚的是,引用时如何传递的。
1、首先将当前的引用复制一份,然后传递给函数。那么函数使用的就是复制品引用。但是这个引用仍然是指向你所创建的new Integer(0)的。
当你写 i = new Integer(val);时
那么这个复制品引用就指向了new Integer(3)了。
你真正的引用仍然是指向的new Integer(0)。这就是为什么输出的是0了。
如果换成这种情况。
public class Test {
private int i = 0;
public Test(int i) {
this.i = i;
}
public int intValue() {
return i;
}
public static void add3(Test i) {
i.i = 10;
}
public static void main(String args[]) {
Test i = new Test(0);
add3(i);
System.out.println(i.intValue());
}
}那么这里传递的引用仍然是复制品。
但是我们在写i.i = 10;语句时,其实真是是这样操作的。
使用复制品引用i。但是i指向的是new Test(0);。
然后i.i = 10;就是让复制品引用i指向的内存块new Test(0)中的变量i修改为10。
因此我们打印出的是10.
这里插入的应该是E) EnclosingOne.InsideOne ei=eo.new InsideOne();
这里涉及到得就完全是内部类的关系了。
根据内部类的定义。因为InsideOne是内部类。它是与EnclosingOne相关联的。根据内部类的定义,如果不是static class。那么内部类就不能脱离其从属类。因此我们在创建内部类的对象的时候,就必须使用通过它从属的类来创建。如果我们不通过它从属的类来创建,那么久违反了java 内部类的定义。
因为我们的创建语法为:E) EnclosingOne.InsideOne ei=eo.new InsideOne();