方法是类的行为属性,标志着类所具有的功能和操作。
声明方式
修饰符1 修饰符2···返回值类型 方法名(形式参数表)[throws 异常列表]{
语句;
}
其中对于返回值的方式有两种表达:
return 表达式;//返回结果表达式的值
return;//用于无返回值的退出
实战演练:杨辉三角输出
import java.util.Scanner;
class Test{
public static int num(int i,int k){
if(k==1||i==k){ return 1;}/*如果列等于1或者列等于行,按照样式输出的应该是1,然后又发现除了1以外的每个数字就是它左右肩上的数字之和,因此,从一行作为开始向下就可以得到每个位置的值,因此采用递归,求每处的值的时候,只需要一直递进到第2层的1 1,然后又回归到第4层的3 3 依次类推到下面位置的值*/
else{
return num(i-1,k-1)+num(i-1,k);
}
}
public static void print(int row){
for(int i=1;i<=row;i++){
for(int j=1;j<=row-i;j++){
System.out.print(" ");//呈现的样式是左右//对称的样子,所以在每行输出数字的左边输出空格
}
for(int k=1;k<=i;k++){
System.out.print(num(i,k)+" ");//输出每行的数字
}
System.out.print("\n");//输完就换行
}
}
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("Please enter the rows:");
int row=scanner.nextInt();
print(row);
}
}
参数传递
两种方式:
1.按值传递,就是实参调用方法时将自己的值传给相应的形参,在方法里发挥作用的是形参,而实参没有发挥作用(这个不必多说)
2.当一个对象被当做参数传递的方法就是引用类型的传递
实例讲解:
class User{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
class Test{
public static void setName(User user){
user.setName("Welcome!");
//user=new User();
//user.setName("Come on!");
}
public static void main(String[] args){
Test test=new Test();
User user=new User();
test.setName(user);
System.out.println(user.getName());
}
}
很显然,最后的结果输出为Welcome!
然而我把注释解除,结果会怎么样呢?
试试就逝世!
结果还是Welcome!并不是我新user.setName("Come on!");
那么原因是什么?
首先我们要清楚,我们利用类实例化一个对象的时候实际上是在堆里创建一个对象,然后在栈里创建一个引用
这个引用指向我们在堆里创建的对象
User user=new User();
然后我们调用test.setName(user);方法,实际上是在栈里对原来的user对象的引用做了一次拷贝,然后存放在栈里,引用拷贝,引用指向的对象自然是一样的。都是指向的原对象
我们使用这个拷贝引用的同时也是对原对象的一种修改
结果自然是Welcome!
然而,我把注释解除
public static void setName(User user){
user.setName("Welcome!");
user=new User();
user.setName("Come on!");
}
我们这里新创建了一个user对象,并将这个拷贝的引用指向我们新建的对象
此时内部的状态是这样的:
我们在user.setName("Come on!");是对对象'所进行的,原对象还是Welcome!
user的拷贝引用在我new User();之前已经对原来的对象进行了修改Welcome所以返回mian方法的时候实参user.name="Welcome!"而不是Come on!
递归
在杨辉三角的有人体现,不用多说