当前位置: 首页 > news >正文

java传值问题.

Java传递参数只有一种 :值传递 而没有引用传递

一般根据传递类型来分类 可以分为 值类型数据 引用数据类型

值类型是原始数据类型 包括 int,byte,char short long,boolean,float,double

引用类型就是一般的class 当然也包括原始数据的封装类型 比如int

封装类型为Integer

 

比如对象的引用关系是这样的

 

List list=new ArrayList();

 

如上一段代码会产生两个对象 :引用对象(存在于栈中),实例对象(存在于堆中)

引用对象的地址指向了实例化对象的地址,

如果方法调用中传入的是引用对象才属于真正的引用传递 

一般情况下 举个例子:

 

 


public class TestJava {
public static void add(TestJava java){
java=new TestJava();
}
public static void main(String[] args) {
TestJava java=null;
add(java);
System.out.println(java);
}
}

 

输出结果 null

 

其实可以这么去理解:

调用方法时 同时也会产生一个引用对象,产生的新引用对象 同时也指向实例对象 public static void add(TestJava java) 相当于该方法中的TestJava java

在方法中 新的引用地址指向了一个新创建的对象 ,而旧的

java=new TestJava();  里面的java 还是指向的null对象  所以方法传递的时候 实际是传递实例化对象和创建了一个新的引用,而不是旧的引用对象的传递所以不属于 引用传递

 

 

 

 看下面的例子 

 

public class TestJava {

String name=null;
public static void add(TestJava java1){
java1.name="liaomin";
}
public static void main(String[] args) {
  TestJava java=new TestJava();

java.name="huqun";
add(java);
System.out.println(java);
}
}

 

输出结果 liaomin

 

上面的例子 可以进一步确认上面的观点

 

TestJava java=new TestJava();

创建了一个引用对象 和一有个实例化对象

引用对象指向了 实例对象

 

public static void add(TestJava java1)

创建了一个新引用对象

add(java);

调用的时候 同时java1引用对象指向了实例化对象

java1.name="liaomin";

改变了 java1的值 实际上是改变了实例化对象的值

 

Java引用对象也是指向了 实例化对象 所以他的值

也会改变

 

如果觉得理由在不充分 在在看下面的例子 

 

 

 看下面的例子 

 

public class TestJava {

String name=null;
public static void add(TestJava java1){

Java1=new TestJava();
java1.name="liaomin";
}
public static void main(String[] args) {
  TestJava java=new TestJava();

java.name="huqun";
add(java);
System.out.println(java);
}
}

 

输出结果 huqun;

 

 

 TestJava java=new TestJava();

创建了一个引用对象java 和一有个实例化对象 new TestJava()

引用对象指向了 实例对象

 

public static void add(TestJava java1)

创建了一个新引用对象

add(java);

调用的时候 同时java1引用对象指向了实例化对象

Java1=new TestJava();

Java1指向了 新创建的实例化对象

java1.name="liaomin";

改变了 java1的值 实际上是改变了新实例化对象的值,而不是改变

的旧的实例化对象 因为他指向了别人

 

Java引用对象也是指向的是以前实例化对象 所以他的值

不会改变

 

 

 

常量类型的引用

 

public class TestJava {

    public static void add(Integer inte){

       inte=2;

    }

    public static void main(String[] args) {

       Integer in=new Integer(1);

       add(in);

       System.out.println(in);

    }

}

 

任何原始数据类型及原始数据类型的封装类 作为参数传递时

无论怎么在方法中修改都不会影响原始的值 ,因为在传递时

传递的对象的常量值 而不是 地址了 所以不会改变,可以理解

为实例化对象在堆内存中储存的常量值 而不是地址

 

比如 Integer it=new Integer(3);

栈内存中放的是 it地址 对内存中放的是 3

It地址指向的是3

 

 

看一下 String 问题

 

public class TestJava {

 

    public static void main(String[] args) {

       String a="234";

       String b=new String("234");

       String c="234";

       System.out.println(a==b);

       System.out.println(c==b);

       System.out.println(a==c);

    }

}

 

 

a="234"

b=”234”

a==b比较地址  地址绝对是一样的 比较的是实例化对象的地址 而不是引用的地址

 

b=”234” 首先去查看一下 堆内存中是否有 “234”这个常量 如果有 则指向该地址

没有就创建一片地址

 

C=new String(“234”) 很明显重新开辟了一片心地址  和上面的都不相等

 

 

 

 

 

转载于:https://www.cnblogs.com/liaomin416100569/archive/2009/12/03/9332114.html

相关文章:

  • WorldWind学习系列八:Load/Unload Plugins——直捣黄龙篇
  • 计算字符串的相似度(VB2005)
  • AS3+touchlib+GoogleMap=多点触摸GoogleMap
  • 深入浅出ASP.NET
  • 重谈字符串连接性能(下):分析优化
  • [翻译]CryEngine3人工智能的正确设置——高级技巧
  • 莫贪 勿迫
  • PHP连接MySQL的数据库类文件【转】
  • 网络DNS域名转换成IP地址
  • 软件开发综合社区
  • Winform获取本地IP和外网IP
  • 用HttpURLConnection在服务器端发起HTTP Post请求的例子
  • .net开发时的诡异问题,button的onclick事件无效
  • ACCESS转化成sql
  • 【Leetcode】101. 对称二叉树
  • ES6指北【2】—— 箭头函数
  • 收藏网友的 源程序下载网
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • egg(89)--egg之redis的发布和订阅
  • Hibernate最全面试题
  • js 实现textarea输入字数提示
  • Laravel Mix运行时关于es2015报错解决方案
  • Laravel 菜鸟晋级之路
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从setTimeout-setInterval看JS线程
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 高性能JavaScript阅读简记(三)
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 前端路由实现-history
  • 悄悄地说一个bug
  • 入门级的git使用指北
  • 深度学习在携程攻略社区的应用
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微服务入门【系列视频课程】
  • 小试R空间处理新库sf
  • 原生js练习题---第五课
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​2020 年大前端技术趋势解读
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)事件处理——(7)简单事件(Simple events)
  • (52)只出现一次的数字III
  • (9)STL算法之逆转旋转
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (三十五)大数据实战——Superset可视化平台搭建
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)编辑寄语:因为爱心,所以美丽
  • .describe() python_Python-Win32com-Excel