/*
- 变量的赋值
- 变量是基本数据类型时:此时赋值的是变量所保存的数据值
- 变量是引用数据类型时:此时赋值的是变量所保存的数据的地址值
- 方法中参数的传递机制
- 方法必须由其所在类或对象调用才有意义。若方法含有参数:
- 实参:方法调用时实际传递给形参的参数值
- 形参:方法声明时的参数
- 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());
}
}
}