java面向对象练习6 方法形参的值传递机制测试

/*

  • 变量的赋值
  • 变量是基本数据类型时:此时赋值的是变量所保存的数据值
  • 变量是引用数据类型时:此时赋值的是变量所保存的数据的地址值
  • 方法中参数的传递机制
  • 方法必须由其所在类或对象调用才有意义。若方法含有参数:
  • 实参:方法调用时实际传递给形参的参数值
  • 形参:方法声明时的参数
  • Java中方法的参数传递方式只有一种:值传递。将实际参数值的副本传入方法内,而参数本身不受影响。
  • 形参是基本数据类型时:将实参的基本数据类型的数据值传递给形参
  • 形参是引用数据类型时:将实参的引用数据类型变量的地址值传递给形参

*/

package com.atguigu.contact;
import java.util.*;
public class Object6 {
  public static void main(String[] args) {
	Scanner scan = new Scanner(System.in);
	//变量赋值情况
	int a = 23;
	int b = a;
	b = 11;
	System.out.println("a=" + a + ",b=" + b);
	Arguments argu = new Arguments();
	argu.num = 33;
	Arguments argu1 = argu;
	System.out.println(argu.num + " " + argu1.num);
	argu1.num = 22;
	System.out.println(argu.num + " " + argu1.num);
	//方法形参传递测试1
	//交换方法形参为基本数据类型,变量m,n与方法形参m,n都在栈空间中存储,指向两套地址。
	int m = 11;
	int n = 22;
	System.out.println("m = " + m + ",n = " + n);//m = 11,n = 22
	argu.exchange(m, n);
	System.out.println("m = " + m + ",n = " + n);//m = 11,n = 22,交换失败
	//交换方法形参为引用基本数据类型,变量d与方法中date指向同一地址值,操作同一块堆空间。
	Date d = new Date();
	d.m = 11;
	d.n = 22;
	System.out.println("m = " + d.m + ",n = " + d.n);//m = 11,n = 22
	argu.swap(d);
	System.out.println("m = " + d.m + ",n = " + d.n);//m = 22,n = 11,交换成功
	Date d1 = new Date();
	d1.m = 11;
	d1.n = 22;
	System.out.println("m = " + d1.m + ",n = " + d1.n);//m = 11,n = 22
	argu.swap1(d1);
	System.out.println("m = " + d1.m + ",n = " + d1.n);//m = 11,n = 22,交换失败
	//方法形参传递测试2
	Object6 o = new Object6();
	o.frist();
	//0, 9
	//17, 7
	
	//遍历数组每个元素除以第一个元素形成新数组
	//说明:数组元素在运算后会被改变赋值,需要创建临时变量储存首元素值,或者倒序遍历
	int[] arr = new int[] {11,23,45,6,78,7,90,12,11};
	System.out.println(Arrays.toString(arr));
	//错误方式
	for (int i = 0; i < arr.length; i++) {
		arr[i] = arr[i] / arr[0];
	}
	System.out.println(Arrays.toString(arr));
	//正确方式1
	int[] arr1 = new int[] {11,23,45,6,78,7,90,12,11};
	for (int i = arr1.length - 1; i >= 0; i--) {
		arr1[i] = arr1[i] / arr1[0];
	}
	System.out.println(Arrays.toString(arr1));
	//正确方式2
	int[] arr2 = new int[] {11,23,45,6,78,7,90,12,11};
	int temp = arr2[0];
	for (int i = 0; i < arr2.length; i++) {
		arr2[i] = arr2[i] / temp;
	}
	System.out.println(Arrays.toString(arr2));
	//测试题3,println方法的特例
	int[] array = new int[] {1,2,3};
	System.out.println(array);//输出地址值
	char[] array1 = new char[] {'a','b','c'};
	System.out.println(array1);//输出abc
	//测试题4,输出圆的面积
	CircleA c = new CircleA();
	c.radius = 4.5;
	System.out.println(c.findArea());
	ErgodicCircleA circle = new ErgodicCircleA();
	circle.printAreas(c, 10);
	//circle.printAreas(new CircleA(),10);只调用一次Circle类,可以使用匿名对象的形式
	//测试题5,无关方法值传递
	int i = 10;
	int j = 20;
	method(i,j);
	//编写方法method,实现输出 i = 100,j = 200
	System.out.println("i = " + i);
	System.out.println("j = " + j);
	
  }
    public static void method(int i,int j) {
    	i = i * 10;
    	j = j * 10;
    	System.out.println("i = " + i);
    	System.out.println("j = " + j);
    	System.exit(0);//退出JVM,不在输出后面的语句
    }
    //方法二,方法重写,调用新的println方法,输出特定结果
//    public static void method1(int i,int j) {    	
//    	PrintStream ps = new PrinStream(System.out)
//    	{
//    		public void printlin(String x) {
//    			if("i = 10".equals(x)) {
//    				x = "i = 100";
//    			}else if("j = 20".equals(x)) {
//    				x = "j = 200";
//    			}
//    			super.println(x);
//    			    			
//    		}
//    	};
//    	System.setOut(ps);
//    }
    
    //Object6 类内创建方法frist,second以供测试2调用
	public void frist() {
		int m = 7;
		Date d = new Date();
		d.m = 11;
		second(d,m);
		System.out.println(d.m + ", " + m);
	}
	
	public void second(Date d,int m) {
		m = 9;
		d.m = 17;
		Date da = new Date();
		d = da;
		System.out.println(d.m + ", " + m);
	}

  }
//为测试一创建类Arguments
class Arguments{
	int num;
	public int setValue(int i) {
		return i;
	}
	public void exchange(int m,int n) {//方法内参数为基本数据类型,接收实参数据值,交换方法内变量m,n,与方法外变量m,n无关
		int temp;
		temp = m;
		m = n;
		n = temp;
	}
	public void swap(Date date) {//参数是引用数据类型时交换地址值,这样才能对方法外的变量实现交换
		int temp;
		temp = date.m;
		date.m = date.n;
		date.n = temp;
	}
	public void swap1(Date date) {
		date = new Date();//相当于在堆中新建一个空间,date指向新地址值,后面语句不影响d
		int temp;
		temp = date.m;
		date.m = date.n;
		date.n = temp;
	}
	
		
}
//创建类Date为测试2使用
class Date{
	int m ;
	int n ;				
}
//创建类CircleA为测试4使用
class CircleA{
	double radius;
	public double findArea() {
		return radius * radius * Math.PI;
	}	
}
//创建类ErgodicCircle为测试4使用
class ErgodicCircleA{
	public void printAreas(CircleA c,int i) {
		System.out.println("Radius\t\tArea");
		for (int j = 1; j <= i; j++) {
			c.radius = j;
			System.out.println(c.radius + "\t\t" + c.findArea());
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值