/*
*一般情况不建议这么使用类对象
*要这么做可以,场景只有一种内部类
*这样的做法违反数据封装设计原则,极少情况会这么用。
*如果非得这么用,设计成私有内部类,这么用少get、set方法,效率会稍有提高
*因为类权限声明符为缺省,因此此类的访问权限为同包内的其它类可使用
*/
class ValHold{
//实例成员变量i初始化为10
public int i = 10;
}
public class Obparm {
public static void main(String[] args) {
/*
*申明int类型变量z,0开头代表8进制表示方法
*换算成10进制整数是:13
*此变量你的整个程序中都未使用到
*/
int z = 015;
/*
*实例化对象本省,因为main方法是程序入口点,静态方法,
*此方法中能直接访问的成员变量必须申明为静态的
*能访问的成员方法,也必须申明为静态的
*此处是为了调用实例方法amethod,所以必须先实例化对象
*/
Obparm o = new Obparm();
/*
*调用Obparm类实例O的amethod方法
*/
o.amethod();
}
public void amethod(){
//申明变量i,栈级别变量,只在当前运行的方法块内生效
int i = 99;
//申明并初始化类ValHold实例变量v,栈级别变量,只在当前运行的方法块内生效
ValHold v = new ValHold();
//修改实例v的成员变量i为30
v.i=30;
//调用Obparm 实例方法,隐含实例指针this,代表实例自身
//此处完整的写法是,this.another(v,i);但this关键字可省略
another(v,i);
System.out.print(v.i);
}
public void another(ValHold v,int i){
//修改实参i
i = 0;
//修改v实例变量i的值为20,实参引用的对象变量i也会被修改
v.i = 20;
//重新实例化一个ValHold对象
ValHold vh = new ValHold();
//修改实参v引用vh,或者让v的指针指向vh
v = vh;
//输出vh实例变量i
System.out.print(v.i);
//输出i
System.out.print(i);
}
}
/*
*********************************************************************************
从以上我做的注释,最终输出结果为:
10020
如果调用
System.out.println
输出结果是:
10
0
20
我不知道那个老师教你们这个的,如果对初学者,很难理解这么多内容。
他想考你们的是,代码的作用域,类方法的实参参数的传递是引用传递,实参可以当方法中的变量,修改了实参的引用,知会在方法块内生效(或者当前运行栈上生效)。
不知道你能看明白不?
*********************************************************************************
*/
没有换行 输出为连续的数字 10020
package com.liu.thread;
public class Obparm {
public static void main(String[] args) {
int z = 015;
Obparm o = new Obparm();
o.amethod(); //调用函数------------|
}// |
public void amethod(){ // <--------|
int i = 99;
ValHold v = new ValHold();// v.i初始化为10
v.i=30;//将 v.i的值修改为30
another(v,i);// (此时的对象 v 为对象1) 调用函数传递对象1的地址值---|
System.out.print(v.i);// 第三个输出 对象1的i值 为20 |
}// |
public void another(ValHold v,int i){// <--------------------------------------|
i = 0;
v.i = 20;//对象1的i值 设为20
ValHold vh = new ValHold();//创建新的对象 对象2 初始化v.i=10
v = vh;//将 v 的地址值改为对象2 的地址值
System.out.print(v.i);// 第一个输出 v.i 为10
System.out.print(i);// 第二个输出 i 为0
}
}
class ValHold{
public int i = 10;
}
答案是:20,10,0
答案是:10020
三次打印的值分别是:
10,0,20
第一个10因为v指向了新建的vh对象
第二个0是因为i=0的赋值操作
第三个20可能最难理解,在 another方法中手动修改了v.i=20,由于JAVA对于对象是采取引用传递的方式,所以当v=vh操作的时候,只是把another方法的入参v的引用改变了,并不改变amethod方法中ValHold v对象的引用,所以,后续的操作和它就没关系了
输出结果是 10020
还不懂的话,我在跟你讲讲