形式引數和返回值型別的對比

hello_future發表於2024-08-07

方法的形式引數

  1. 形式引數是基本資料型別

  2. 形式引數是引用型別
    (1)形式引數是基本資料型別
    基本資料型別作為方法的形參,形式引數的改變不影響實際引數
	public static void main(String[] args) {
		int a = 10;
		int b = 20;
		System.out.println(a);
		System.out.println(b);
		change(a, b);
		System.out.println(a);
		System.out.println(b);
	}

	public static void change(int a,int b){
		  a = b+10 ;
          b = a-b;
		  System.out.println("a:"+a+",b:"+b);
	}
在呼叫change()方法時,分別給變數“a”和“b”做了賦值的轉換。作為區域性變數,它的生命週期隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失。在記憶體中的體現,就是在棧記憶體中呼叫完畢後,裡面區域性變數就立即被GC垃圾回收器回收。所以,此時變數“a”和“b”的值不會發生改變。執行結果如下:

(2)形式引數是引用型別

引用型別:
    類:當你看到一個類作為方法引數型別的時候,將來呼叫時需要傳遞該類及其該類的子類物件
    class Demo1 {
    public void fun1() {
        System.out.println("好好學習,天天向上!");
    }
}
class Demo1Zi extends Demo1{

}
class Demo1Test {
    public void show(Demo1 demo1) { //Demo1 demo1 = new Demo1Zi()
        demo1.fun1();
    }
}
public class StudentDemo1 {
    public static void main(String[] args) {
        Demo1Test demo1Test = new Demo1Test();
        demo1Test.show(new Demo1());
        demo1Test.show(new Demo1Zi());
    }
}

    抽象類:當你看到一個抽象類作為方法的引數型別的時候,將來呼叫時需要傳遞繼承該抽象類的具體子類物件
    abstract class Demo2{
    public abstract void fun1();
}

class Demo2Zi extends Demo2{
    @Override
    public void fun1() {
        System.out.println("我真棒!");
    }
}

class Student2{
    public void show(Demo2 demo2){ //Demo2 demo2 = new Demo2Zi()
        demo2.fun1();
    }
}

public class StudentDemo2 {
    public static void main(String[] args) {
        Student2 student2 = new Student2();
        student2.show(new Demo2Zi());
    }
}
    介面:當你看到一個介面作為方法引數型別的時候,將來呼叫時需要傳遞實現該介面的具體子類物件
    interface Inter1{
    public abstract void fun1();
}

class Inter1Impl implements Inter1{
    @Override
    public void fun1() {
        System.out.println("Hello World!");
    }
}

class Student3{
    public void show(Inter1 inter1){ //Inter1 inter1 = new Inter1Impl() 介面多型
        inter1.fun1();
    }
}

public class StudentDemo3 {
    public static void main(String[] args) {
        Student3 student3 = new Student3();
        student3.show(new Inter1Impl());
    }
}
    

返回值型別

1、返回值型別是基本資料型別

(1)包括 byte, short, int, long, float, double, char, boolean 等原始資料型別,方法返回的是這些基本型別的具體數值。

(2)無返回值型別:

使用 void 關鍵字表示,這類方法不返回任何值,主要用於執行某種操作,如列印資訊、修改物件狀態等

若一個方法沒有返回值,return可以省略不寫

2、返回值型別是引用資料型別

類:當你看到一個類作為方法的返回值型別的時候,將來方法內部應該返回該類或該類的子類物件
package com.shujia.day10.ketang.bao2;
class Student1{
    public void fun1(){
        System.out.println("歡迎大家來到數加學院!");
    }
}
class Demo1{
    public Student1 show(){
        return new Student1();
    }
}
public class StudentDemo1 {
    public static void main(String[] args) {
        Demo1 demo1 = new Demo1();
        Student1 s1 = demo1.show(); // Student1 s1 = new Student1()
        s1.fun1();
    }
}

抽象類:當你看到一個抽象類作為方法的返回值型別的時候,將來方法內部應該返回繼承該抽象類的具體子類物件
abstract class Demo2{
    public abstract void fun1();
}
class Demo2Zi extends Demo2 {
    @Override
    public void fun1() {
        System.out.println("小祝是阿里巴巴的高階開發程式設計師");
    }
}
    class Student2 {
        public Demo2 show() {
            return new Demo2Zi();
        }
    }
    public class StudentDemo2 {
        public static void main(String[] args) {
            Student2 student2 = new Student2();
            Demo2 d1 = student2.show(); //Demo2 d1 = new Demo2Zi() 抽象多型
            d1.fun1();
        }
    }
介面:當你看到一個介面作為方法的返回值型別的時候,將來方法內部應該返回實現了該介面的具體子類物件
interface Inter1{
    public abstract void fun1();
}
class Inter1Impl implements Inter1{
    @Override
    public void fun1() {
        System.out.println("昨天南京下冰雹了");
    }
}
class Student3{
    public Inter1 show(){
        return new Inter1Impl();
    }
}
public class StudentDemo3 {
    public static void main(String[] args) {
        Student3 student3 = new Student3();
        Inter1 i1 = student3.show(); //Inter1 i1 = new Inter1Impl() 介面多型
        i1.fun1();
//         new Student3()
//                .show()
//                .fun1(); // 呼叫方式:鏈式呼叫
    }
}

相關文章