成员方法传参机制


成员方法传参机制

方法的传参机制对我们今后的编程非常重要,一定要搞的清清楚楚明明白白。我们通 过案例来学习

基本数据类型的传参机制

Method Parameter01.java

  1. 看一个案例,分析结果是什么?

public void swap(int a,int b){
int tmp = a;
a = b;
b = tmp;
System.out.println("a=" + a + "/tb=" + b);
}
  1. 结论

public class Method_Parameter01 {
  public static void main(String[] args) {

      int a = 10;
      int b = 20;
      //创建AA对象
      AAB aa = new AAB();
      aa.swap(a,b);
      //调用swap方法
      System.out.println("a=" + a + "/tb=" + b);

  }
}

class AAB{

  public void swap(int a,int b){
      System.out.println("a=" + a + "/tb=" + b);
      //没有交换之前
      int tmp = a;
      a = b;
      b = tmp;
      System.out.println("a=" + a + "/tb=" + b);
      //交换之后
  }
}

打印得到的结果 为 : 10 ,20 20 ,10 / n 10, 20

在内存之中 , 一开始代码中创建的变量 a ,b 赋值都存放于 main这个栈中 ,后面创建的swap方法则是另外创建了一个swap栈 ,当我们传参将 a ,b到swap中的a ,b的时候 这里的值就和 main栈中的变量 a b没有关系了 ,更换完顺序打印的结果当然也不会因为方法swap的缘故改变 (两个栈都是独立的内存空间 ,互相不冲突)

基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!

 

引用数据类型的传参机制

  1. 看一个案例 MethodParametert02.java B类中编写一个方法test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?

    B类中编写一个方法test200,可以接收一个Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变化?

  2. 结论

    由于数组是引用类型 因此数组和对象一样指向堆空间 ,b.test100 ,表示传入一个数组

    调用了方产生一个新的栈 , 方法test100就在这个栈中 ,一旦我们传入一个参数给这个引用类型就不再是拷贝而是传递了一个地址 ,虽然在test100中也会有一个变量arr ,但是arr变量的地址也和main方法的arr指向同一块堆空间 ,此时arr = 200就等于更改同一块地址的空间内容 ,也就是main栈中的内容也会跟着变化

    同时不管是数组还是对象以及引用类型 ,都会和以上的原理一致

    引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!

  3. 在看一个案例,下面的方法会对原来的对象有影响吗?

仍然会 ,因为对象也是属于引用类型 ,使用方法传递的也是地址 ,一旦修改内容的话都是在堆空间的地址内容修改 ,例如我们编写的test200的方法 ,使用过后 ,年龄的20就会改变为方法的年龄值 ,打印结果就是修改后的内容

 

 

这是代码

public class MethodParametert02 {
  public static void main(String[] args) {

      //测试
      BB b = new BB();
      int[] arr = {1,2,3};
      b.test100(arr);
      System.out.println("main的数组");
      //遍历数组
      for (int i =0; i<arr.length;i++){
          System.out.println(arr[i] + "/t");
      }
      System.out.println();


      Personx p = new Personx();
      p.name = "jack";
      p.age = 10;

      b.test200(p);
      System.out.println("main的p.age="+p.age+" main的p.name="+p.name);
  }
}


class Personx{
  String name;
  int age;
}


class BB{
  public void test200(Personx p){
      p.age = 10000;
      p.name = "mike";
      //修改对象的属性
  }


  //B类中编写一个方法test100
  //可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?
  public void test100(int [] arr){
      arr[0] = 200;
      System.out.println("test100的数组");
      //遍历数组
      for (int i =0; i<arr.length;i++){
          System.out.println(arr[i] + "/t");
      }
      System.out.println();
  }
}

作业 : 编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象, 注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同

public class MethodExercise02 {
  public static void main(String[] args) {
      //编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象,
      //注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
      Persona p = new Persona();
      p.name = "milan";
      p.age = 100;

      Mytoolss tools = new Mytoolss();
      Persona p2 = tools.copyPerson(p);

      //到此p和p2都是person对象, 但是是两个独立的对象,属性一致
      System.out.println("p的属性 age="+p.age+" p的名字 name="+p.name);
      System.out.println("p2的属性 age="+p2.age+" p2的名字 name="+p2.name);
      //可以通过 对象的比较来看看是否为一个对象
      System.out.println("验证是否为一个对象 " + (p == p2));

  }
}

class Persona{
  String name;
  int age;
}

class Mytoolss {
  //这里创建一个类,是复制之后的类
  public Persona copyPerson (Persona p){
      //方法为复制对象,复制后的返回类型为对象,同时接收的参数类型也为对象
      //创建一个新的对象
      Persona p2 = new Persona();
      p2.name = p.name; //把原来对象的名字赋给p2.name
      p2.age = p.age; //把原来对象的年龄赋给p2.age

      return p2;
      //返回复制之后的到的对象
  }
}

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/245313.html

(0)
上一篇 2022年4月18日
下一篇 2022年4月18日

相关推荐

发表回复

登录后才能评论