黑马程序员技术交流社区

标题: 参数传递问题 [打印本页]

作者: 左耳的鱼    时间: 2013-7-15 00:40
标题: 参数传递问题
本帖最后由 左耳的鱼 于 2013-7-16 21:02 编辑

public class ArugmentTest {
     static class IntA {
         private int a;
         public IntA(int a) {
              this.a = a;
         }
         public int getA() {
              return a;
         }
         public void setA(int a) {
              this.a = a;
         }
     }
     static public void change(int a) {
         a = 3;
     }
     static public void change(IntA a) {
         a.setA(3);
     }
     static public void changeRef(IntA a) {
         a = new IntA(9);
     }
     public static void main(String[] args) {
         int a = 2;
         change(a);
         System.out.print(a);
         IntA ia = new IntA(5);
         change(ia);   
         System.out.print(ia.getA());
         changeRef(ia);         
         System.out.println(ia.getA());
     }
}//为什么233 讲下流程

作者: chensc    时间: 2013-7-15 05:48
学习学习!
作者: chslzj    时间: 2013-7-15 09:18
  1. package com.itheima.test;
  2. public class ArugmentTest {
  3.      static class IntA {
  4.          private int a;
  5.          public IntA(int a) {
  6.               this.a = a;
  7.          }
  8.          public int getA() {
  9.               return a;
  10.          }
  11.          public void setA(int a) {
  12.               this.a = a;
  13.          }
  14.      }
  15.      static public void change(int a) {
  16.              System.out.println("change(int a) invoke");
  17.          a = 3;
  18.      }
  19.      static public void change(IntA a) {
  20.          a.setA(3);
  21.      }
  22.      static public void changeRef(IntA a) {
  23.              /**
  24.               * 这里a指向了一个新的对象
  25.               */
  26.          a = new IntA(9);
  27.          System.out.println("方法内a 的对象:"+a);
  28.      }
  29.      public static void main(String[] args) {
  30.          int a = 2;
  31.          change(a);
  32.          /**
  33.           * a是原生数据类型
  34.           * 不是对象,所以改变不了
  35.           */
  36.          System.out.println(a);
  37.          IntA ia = new IntA(5);
  38.          change(ia);   
  39.          /**
  40.           * 这里ia是一个对象
  41.           * 把对象里面的属性改变了,未改变其地址
  42.           */
  43.          System.out.println(ia.getA());
  44.          System.out.println("方法未执行时ia 的对象:"+ia);
  45.          changeRef(ia);
  46.          /**
  47.           * 这里,在方法内部的地址改变不会影响外部的地址
  48.           */
  49.          System.out.println("方法外ia 的对象:"+ia);
  50.          System.out.println(ia.getA());
  51.      }
  52.      }
复制代码

java里面参数有两种传参方式,按值传参和按址传参
1 按值传递的数据类型:八种基本数据类型和String,方法内部的改变不影响方法外部
2  按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口 ,也就是方法内部会影响外部,因为使用同一个地址,当然,内部地址改变不会影响外部

作者: sergio    时间: 2013-7-15 15:03
第一个打印的2,chang(a)只是对象3的引用,并不会改变其本身值类型为2.
第二个打印的3,chang(ia)还是是引用类型的引用,并不会改变其设置的值3。
第三个同上




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2