搜尋
首頁Javajava教程解析java中的引用型別的概念

解析java中的引用型別的概念

Mar 18, 2017 pm 01:56 PM
java引用類型

1、什麼是引用型別
    引用型別(reference type)指向一個對象,不是原始值,指向對象的變數是引用變數。
    在java裡面除去基本資料類型的其它型別都是引用資料型,自己定義的class類別都是引用類型,可以像基本型別一樣使用。
    範例如下:

    public class MyDate {
        private int day = 8;
        private int month = 8;
        private int year = 2008;
        private MyDate(int day, int month, int year){...}
        public void print(){...}
    }
    public class TestMyDate {
        public static void main(String args[]) {
            //这个today变量就是一个引用类型的变量
            MyDate today = new MyDate(23, 7, 2008);
        }
    }

#2、引用型別的賦值
    在java程式語言中,以類別的一個型別宣告的變數被指定為引用類型,這是因為它正在引用一個非原始類型,這對賦值具有重要的意義。如下程式碼:

    int x = 7;
    int y = x;
    String s = "Hello";
    String t = s;

    四個變數建立:兩個原始型別 int 和兩個參考型別String。 x的值是7,而這個值被複製到y;x和y是兩個獨立的變數且其中任何一個的進一步的變化都不對另外一個構成影響。至於變數s和t,只有一個String物件存在,它包含了文字"Hello",s和t都引用這個單一物件。

解析java中的引用型別的概念

如果將變數t重新定義為t="World";則新的物件World被創建,而t引用這個物件。

解析java中的引用型別的概念

3、傳遞數值和按引用傳遞的差異
    1)以數值傳遞
    指的是方法呼叫時,傳遞的參數是按值的拷貝傳遞。例如:

public class TempTest {
    private void test1(int a) {
        // 做点事情
        a++;
    }
   
    public static void main(String args[]) {
        TempTest t = new TempTest();
        int a = 3;
         t.test1(a);//这里传递的参数a就是按值传递。
         System.out.printIn("main方法中的a===" + a);
      }
  }

    按值傳遞的重要特點:傳遞的是值的拷貝,也就是說傳遞後就互不相關了。第9行的a和第2行的a是兩個變量,當改變第2行的a的值,第9行a的值是不變的,所以列印結果是3。
    main  方法中的a 為3
    test1 方法中的a 為4
    我們將第9行的a稱為實參,第2行的a稱為形參;基本資料類型,形參資料的改變,不影響實參的資料。
    2)依引用傳遞
    指的是方法呼叫時,傳遞的參數是依照引用傳遞,其實傳遞的是所引用的位址,也就是變數所對應的記憶體空間的地址。
    範例如下:
##

public class TempTest {
    private void test1(A a) {
        a.age = 20;
        System.out.printIn("test1方法中的age="+a.age);
    }
    public static void main(String args[]) {
        TempTest t = new TempTest();
        A a = new A();
        a.age = 10;
        t.test1(a);// 这里传递的参数a就是按引用传递
           System.out.printIn("main方法中的age="+a.age);
      }
  }
  classA {
      public int age = 0;
  }

    運作結果如下:test1方法中的age = 20  main方法中的age = 20

    與引用傳遞的重要特性:# 值的引用,也就是說傳遞前和傳遞後都指向同一個引用(也就是同一個記憶體空間)。
    要正確理解依引用傳遞的過程,就必須學會理解記憶體分配的過程,記憶體分配示意圖可以輔助我們去理解這個過程。
    用上面的範例來分析:
    (1)、運作開始,執行第8行,創造了一個A的實例,記憶體分配示意圖如下:
     main方法中的a 


解析java中的引用型別的概念


解析java中的引用型別的概念

H 解析java中的引用型別的概念


##(2)、執行第9行,修改了A實例裡面的age的值,記憶體分配示意圖如下:   

      main方法中的a  


      main方法中的a  

解析java中的引用型別的概念#(3)、執行第10行,是把main方法中的變數a所引用的記憶體空間位址,依引用傳遞給test1方法中的a變數。請注意:這兩個a變數是完全不同的,不要被名稱相同所蒙蔽,但它們指向了同一個A實例。記憶體分配示意圖如下:

###############################(4)、執行第3行,為test1方法中的變數a指向A實例的age進行賦值,完成後形成新的記憶體示意圖如下:############

此时A实例的age值的变化是由test1方法引起的。
    (5)、运行第4行,根据此时的内存示意图,输出test1方法中的age=20
    (6)、运行第11行,根据此时的内存示意图,输出main方法中的age=20
    3)对上述例子的改变
    理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面的呢?
    方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:

public class TempTest {
    private void test1(A a) {
        a = new A();// 新加的一行
        a.age = 20;
        System.out.printIn("test1方法中的age="+a.age);
    }
    public static void main(String args[]) {
        TempTest t = new TempTest();
        A a = new A();
         a.age = 10;
        t.test1(a);// 这里传递的参数a就是按引用传递
           System.out.printIn("main方法中的age="+a.age);
      }
  }
  classA {
      public int age = 0;
  }

 运行结果为:test1方法中的age=20  main方法中的age=10
    实现了按引用传递的值传递前与传递后互不影响,还是使用内存示意图来理解一下:
    (1)、运行开始,运行第9行,创建了一个A实例,内存分配示意图如下:

解析java中的引用型別的概念

(2)、运行第10行,是修改A实例里面的age的值,运行后内存分配示意图如下:

解析java中的引用型別的概念


(3)、运行第11行,是把mian方法中的变量a所引用的内存地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。

解析java中的引用型別的概念

(4)、运行第3行,为test1方法中的变量a重新生成了新的A实例,完成后形成的新的内存示意图如下:

解析java中的引用型別的概念

(5)、运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成新的内存示意图如下:

1解析java中的引用型別的概念

注意:这个时候test1方法中的变量a的age被改变,而main方法中的a变量是没有改变的。
     (6)、运行第5行,根据此时的内存示意图,输出test1方法中的age=20
     (7)、运行第12行,根据此时的内存示意图,输出main方法中的age=10
    说明:
    (1)、“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
    (2)、在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义的字符串方式:String str = "Java快车";

相关文章:

Java四种引用类型的具体介绍

详细比较Java中的基本类型变量和引用类型变量

JavaScript 基本数据类型和引用类型的区别详解

以上是解析java中的引用型別的概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JVM如何處理操作系統API的差異?JVM如何處理操作系統API的差異?Apr 27, 2025 am 12:18 AM

JVM通過JavaNativeInterface(JNI)和Java標準庫處理操作系統API差異:1.JNI允許Java代碼調用本地代碼,直接與操作系統API交互。 2.Java標準庫提供統一API,內部映射到不同操作系統API,確保代碼跨平台運行。

Java 9影響平台獨立性中引入的模塊化如何?Java 9影響平台獨立性中引入的模塊化如何?Apr 27, 2025 am 12:15 AM

modularitydoesnotdirectlyaffectJava'splatformindependence.Java'splatformindependenceismaintainedbytheJVM,butmodularityinfluencesapplicationstructureandmanagement,indirectlyimpactingplatformindependence.1)Deploymentanddistributionbecomemoreefficientwi

什麼是字節碼,它與Java的平台獨立性有何關係?什麼是字節碼,它與Java的平台獨立性有何關係?Apr 27, 2025 am 12:06 AM

BytecodeinJavaistheintermediaterepresentationthatenablesplatformindependence.1)Javacodeiscompiledintobytecodestoredin.classfiles.2)TheJVMinterpretsorcompilesthisbytecodeintomachinecodeatruntime,allowingthesamebytecodetorunonanydevicewithaJVM,thusfulf

為什麼Java被認為是一種獨立於平台的語言?為什麼Java被認為是一種獨立於平台的語言?Apr 27, 2025 am 12:03 AM

javaachievesplatformIndependencEthroughThoJavavIrtualMachine(JVM),wodecutesbytecodeonyanydenanydevicewithajvm.1)javacodeiscompiledintobytecode.2)

圖形用戶界面(GUIS)如何提出Java平台獨立性的挑戰?圖形用戶界面(GUIS)如何提出Java平台獨立性的挑戰?Apr 27, 2025 am 12:02 AM

JavaGUI開發中的平台獨立性面臨挑戰,但可以通過使用Swing、JavaFX,統一外觀,性能優化,第三方庫和跨平台測試來應對。 JavaGUI開發依賴於AWT和Swing,Swing旨在提供跨平台一致性,但實際效果因操作系統不同而異。解決方案包括:1)使用Swing和JavaFX作為GUI工具包;2)通過UIManager.setLookAndFeel()統一外觀;3)優化性能以適應不同平台;4)使用如ApachePivot或SWT的第三方庫;5)進行跨平台測試以確保一致性。

Java開發的哪些方面取決於平台?Java開發的哪些方面取決於平台?Apr 26, 2025 am 12:19 AM

JavadevelovermentIrelyPlatForm-DeTueTososeVeralFactors.1)JVMVariationsAffectPerformanceNandBehaviorAcroSsdifferentos.2)Nativelibrariesviajnijniiniininiinniinindrododerplatefform.3)

在不同平台上運行Java代碼時是否存在性能差異?為什麼?在不同平台上運行Java代碼時是否存在性能差異?為什麼?Apr 26, 2025 am 12:15 AM

Java代碼在不同平台上運行時會有性能差異。 1)JVM的實現和優化策略不同,如OracleJDK和OpenJDK。 2)操作系統的特性,如內存管理和線程調度,也會影響性能。 3)可以通過選擇合適的JVM、調整JVM參數和代碼優化來提升性能。

Java平台獨立性有什麼局限性?Java平台獨立性有什麼局限性?Apr 26, 2025 am 12:10 AM

Java'splatFormentenceHaslimitations不包括PerformanceOverhead,versionCompatibilityIsissues,挑戰WithnativelibraryIntegration,Platform-SpecificFeatures,andjvminstallation/jvminstallation/jvmintenance/jeartenance.therefactorscomplicatorscomplicatethe“ writeOnce”

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用