五(三)、方法
一、方法:类应该具有的功能;比如 Math.random();Arrays.sort();....
public void eat() {
System.out.println("人可以吃饭");
}
public void talk(String lanuage) {
System.out.println("人可以说话,使用"+lanuage+"语言。");
}
public String getName(){}
1.1方法的声明:
权限修饰符 返回值类型 方法名(形参列表){
方法体
};
1.1.1 权限修饰符 private public 缺省 protected
1.1.2 返回值类型 有返回值、没有返回值;
①若有返回值,在声明时需要指定返回值类型,在方法中使用return 返回指定类型的变量or常量
②若方法没有返回值,则方法声明时使用void来表示,通常没有返回值的方法中,就不用return返回;如果只用 只能 "return;"表示结束此方法;
1.1.3 我们定义方法该不该有返回值?凭经验;
1.1.4方法名 属于标识符;需要遵循标识符规范;
1.1.5 形参列表:方法可以声明0个 1个或者多个形参;格式:数据类型1 形参1,数据类型2 形参二;
1.1.6 方法体:方法功能的体现;
二、再谈方法
1.方法的重载:在同一个类中,允许存在一个以上的同名方法,只用他们的参数个数或者参数类型不同即可。“两同一不同”
同类,同方法名;参数列表不同;参数个数不同,参数类型不同;
重载的特点:与返回值类型无关,只看参数列表,且参数列表必须不同。调用时感觉方法参数列表的不同来区分;
举例;Arrays.sort,/binerySearch();
判断是否是重载:跟方法的修饰符、返回值类型,形参变量名,方法体都没有关系;、
在通过对象调用方法时,如何确定指定方法?1.方法名,2.参数列表
2.可变个数的形参,
a.格式:数据类型 ...变量名
b.当调用可变个数形参方法时,传入的参数个数可以使 0个,1个,2个。。。
c.可变个数形参方法与本类方法名相同,形参不同的方法之间构成重载;但是调用确定参数的方法
d.可变个数形参的方法与本来方法相同,形参了下也相同的数组之间不构成重载,也就是说,二者不能共存。
e.可变个数形参在方法的形参中,必须声明在末尾;
f.可变个数形参在方法的形参中,最多只能声明一个可变形参;
public static void main(String[] args) { Day9Method10 day9Method10 = new Day9Method10(); //重载 day9Method10.getSum(1,2);//默认调用 getSum(int i, int j)若getSum(int i, int j)注释掉,则调用getSum(double i, double j) day9Method10.show(0, "A","B"); day9Method10.show(0, "A");//优先调用确定参数的方法 } public void getSum(int i, int j) { } public void getSum(double i, double j) { } public void getSum(String i, String j) { } //可变个数的形参 str参数个数可变 public void show(int a,String ...str) { System.out.println("可变参数:"+str); for(int i=0;i<str.length;i++) { System.out.println(str[i]); } } public void show(int a,String str) { System.out.println(str); }
三、关于变量的赋值
1.如果变量是基本数据类型,此时赋值的是变量所保存的数据值;
2.如果变量是引用数据类型,此时赋值的是所保存的数据的地址值
四、方法形参的值传递机制
1.形参:方法定义时声明的小括号里面的参数;
实参:方法调用时,(实际传递给形参的数据)
2.值传递机制;
a.如果参数是基本数据类型,此时实参赋值给形参的是,实参真实存储的数据值
b.如果参数是引用数据类型,此时实参赋值给形参的是,实参的地址值;
1 public static void main(String[] args) { 2 System.out.println("****************基本数据类型************************"); 3 int m = 10; 4 int n = m; 5 System.out.println("m = "+m+",n = "+n);//m = 10,n = 10 6 n = 20; 7 System.out.println("m = "+m+",n = "+n);//m = 10,n = 20 8 9 System.out.println("****************引用数据类型************************"); 10 Order o1 = new Order(); 11 o1.orderId = 1001; 12 Order o2 = o1; 13 System.out.println("o1.orderId = "+o1.orderId+",o2.OrderId = "+o2.orderId);//o1.orderId = 1001,o2.OrderId = 1001 14 o2.orderId = 1002; 15 System.out.println("o1.orderId = "+o1.orderId+",o2.OrderId = "+o2.orderId);//o1.orderId = 1002,o2.OrderId = 1002 16 17 //交换两个变量的值 18 Day9ValueTransfer15 day9ValueTransfer15 = new Day9ValueTransfer15(); 19 System.out.println("m = "+m+",n = "+n); 20 day9ValueTransfer15.swap(m, n); 21 System.out.println("m = "+m+",n = "+n); 22 Data data = new Data(); 23 data.m = 10; 24 data.n = data.m; 25 data.n = 20; 26 System.out.println("m = "+data.m+",n = "+data.n); 27 day9ValueTransfer15.swap1(data); 28 System.out.println("m = "+data.m+",n = "+data.n); 29 } 30 31 //交换两个变量的值 32 public void swap(int m,int n) { 33 int temp = m; 34 m = n; 35 n = temp; 36 } 37 38 //交换两个变量的值 39 public void swap1(Data data) { 40 int temp = data.m; 41 data.m = data.n; 42 data.n = temp; 43 } 44 } 45 class Order{ 46 int orderId; 47 48 } 49 50 class Data{ 51 int m; 52 int n; 53 }
基本数据类型,传递的是数据值,所以n = m,改变n的值,不会影响m的值
引用数据类型,传递的是地址值,所以”******************引用数据类型*************“,更改orderId会影响两对象相应的值;
具体请查看内存解析的详解:堆内存 和 栈内存的简单理解
这里String的值传递也是一个比较好面试题,可以好好看看https://www.cnblogs.com/lixiuming521125/p/14404125.html#_label4
补充题目:为什么for(Integer item: arr)不可以改变基本类型对象数组的值,却可以改变引用类型对象数组(比如for(Person item :arr))的值呢?(这里的引用类型对象不包括String)
1 @Test 2 public void testFor() { 3 Integer[] intArr = new Integer[]{1,2,3,4}; 4 for(int i = 0;i<intArr.length;i++) { 5 intArr[i] = intArr[i]+i; 6 } 7 System.out.println("***********普通for循环***********"); 8 for(int i = 0;i<intArr.length;i++) { 9 System.out.print(intArr[i]); 10 } 11 System.out.println(""); 12 } 13 14 @Test 15 public void testFor1() { 16 Integer[] intArr = new Integer[]{1,2,3,4}; 17 int count = 0; 18 for(int i :intArr) { 19 i= i+count; 20 count++; 21 } 22 System.out.println("***********增强for循环更改基本类型数组的值***********"); 23 for(int i = 0;i<intArr.length;i++) { 24 System.out.print(intArr[i]); 25 } 26 System.out.println(""); 27 } 28 29 @Test 30 public void testFor2() { 31 Person person1 = new Person(); 32 Person person2 = new Person(); 33 person1.setName("tom"); 34 person1.setAge(10); 35 person2.setName("jerry"); 36 person2.setAge(10); 37 Person[] intArr = new Person[] {person1,person2}; 38 for(Person item :intArr) { 39 item.setAge(11); 40 } 41 System.out.println("***********增强for循环更改引用类型数组的值***********"); 42 for(int i = 0;i<intArr.length;i++) { 43 System.out.print(intArr[i]); 44 } 45 System.out.println(""); 46 }
结果为:
***********普通for循环***********
1357
***********增强for循环更改基本类型数组的值***********
1234
***********增强for循环更改引用类型数组的值***********
Person [age=11, name=tom]Person [age=11, name=jerry]
附上Person :
1 public class Person { 2 3 private int age; 4 private String name; 5 public int getAge() { 6 return age; 7 } 8 public void setAge(int age) { 9 this.age = age; 10 } 11 public String getName() { 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 @Override 18 public String toString() { 19 return "Person [age=" + age + ", name=" + name + "]"; 20 } 21 22 23 }