国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 全面理解Java中的引用傳遞和值傳遞

全面理解Java中的引用傳遞和值傳遞

2022-03-02 00:44邴越 Java教程

這篇文章主要介紹了全面理解Java中的引用傳遞和值傳遞,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

關于Java傳參時是引用傳遞還是值傳遞,是一個討論比較多的話題,

有說Java中只有值傳遞,也有些地方說引用傳遞和值傳遞都存在,本篇記錄思考過程,不保證正確性,

感興趣的同學一起討論。

1.基本類型和引用類型在內存中的保存

Java中數據類型分為兩大類,基本類型和對象類型。相應的,變量也有兩種類型:基本類型和引用類型。

基本類型的變量保存原始值,即它代表的值就是數值本身;

而引用類型的變量保存引用值,"引用值"指向內存空間的地址,代表了某個對象的引用,而不是對象本身,

對象本身存放在這個引用值所表示的地址的位置。

基本類型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,

引用類型包括:類類型,接口類型和數組。

相應的,變量也有兩種類型:基本類型和引用類型。

2.變量的基本類型和引用類型的區別

基本數據類型在聲明時系統就給它分配空間:

?
1
2
int a;
a=10;//正確,因為聲明a時就分配了空間

引用則不同,它聲明時只給變量分配了引用空間,而不分配數據空間:

?
1
2
3
4
5
6
7
Date date;
//執行實例化,開辟數據空間存放Date對象,然后把空間的首地址傳給today變量
//date=new Date();
//如果注釋掉上一步操作
//The local variable date may not have been initialized
//也就是說對象的數據空間沒有分配
date.getDate();

看一下下面的初始化過程,注意"引用"也是占用空間的,一個空Object對象的引用大小大概是4byte:

?
1
2
3
Date a,b; //在內存開辟兩個引用空間
a = new Date();//開辟存儲Date對象的數據空間,并把該空間的首地址賦給a
b = a; //將a存儲空間中的地址寫到b的存儲空間中

3.引用傳遞和值傳遞

這里要用實際參數和形式參數的概念來幫助理解,

值傳遞:

方法調用時,實際參數把它的值傳遞給對應的形式參數,函數接收的是原始值的一個copy,此時內存中存在兩個相等的基本類型,即實際參數和形式參數,后面方法中的操作都是對形參這個值的修改,不影響實際參數的值。

引用傳遞:

也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,函數接收的是原始值的內存地址;

在方法執行中,形參和實參內容相同,指向同一塊內存地址,方法執行中對引用的操作將會影響到實際對象。

看一個例子:

?
1
2
3
class MyObj{
    public int b=99;
}

分別傳參int和對象類型:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ReferencePkValue2 {
     
    public static void main(String[] args) {
        ReferencePkValue2 t = new ReferencePkValue2();
        int a=99;
        t.test1(a);//這里傳遞的參數a就是按值傳遞
        System.out.println(a);
         
        MyObj obj=new MyObj();
        t.test2(obj);//這里傳遞的參數obj就是引用傳遞
        System.out.println(obj.b);
    }
     
    public void test1(int a){
        a=a++;
        System.out.println(a);
        }
     
    public void test2(MyObj obj){
        obj.b=100;
        System.out.println(obj.b);
        }
}

輸出是:

99

99

100

100

可以看到,int值沒有發生變化,但是在test2方法中對obj類做的修改影響了obj這個對象。

這里要特殊考慮String,以及Integer、Double等幾個基本類型包裝類,它們都是immutable類型,

因為沒有提供自身修改的函數,每次操作都是新生成一個對象,所以要特殊對待,可以認為是和基本數據類型相似,傳值操作。

看下面的例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ReferencePkValue1 {
    public static void main(String[] args){
        ReferencePkValue1 pk=new ReferencePkValue1();
        //String類似基本類型,值傳遞,不會改變實際參數的值
        String test1="Hello";
        pk.change(test1);
        System.out.println(test1);
         
        //StringBuffer和StringBuilder等是引用傳遞
        StringBuffer test2=new StringBuffer("Hello");
        pk.change(test2);        
        System.out.println(test2.toString());
    }
     
    public void change(String str){
        str=str+"world";
    }
     
    public void change(StringBuffer str){
        str.append("world");
    }
}

輸出是:

Hello

Helloworld

對String和StringBuffer的操作產生了不同的結果。

4.結論

結合上面的分析,關于值傳遞和引用傳遞可以得出這樣的結論:

(1)基本數據類型傳值,對形參的修改不會影響實參;

(2)引用類型傳引用,形參和實參指向同一個內存地址(同一個對象),所以對參數的修改會影響到實際的對象;

(3)String, Integer, Double等immutable的類型特殊處理,可以理解為傳值,最后的操作不會修改實參對象。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/binyue/p/3862276.html

延伸 · 閱讀

精彩推薦
  • Java教程SpringMVC中Controller類數據響應的方法

    SpringMVC中Controller類數據響應的方法

    這篇文章主要介紹了SpringMVC中的數據響應的問題,主要來了解 Controller 類如何進行數據響應的,本文給大家介紹的非常詳細,需要的朋友可以參考下...

    初秋微微8222021-10-27
  • Java教程mybatis-generator如何自定義注釋生成

    mybatis-generator如何自定義注釋生成

    這篇文章主要介紹了mybatis-generator如何自定義注釋生成的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教...

    一頭磕在鍵盤上6902021-12-23
  • Java教程java獲取網絡類型的方法

    java獲取網絡類型的方法

    這篇文章主要介紹了java獲取網絡類型的方法,涉及java針對網絡類型的參數獲取及判定技巧,具有一定參考借鑒價值,需要的朋友可以參考下 ...

    小賈4912020-01-08
  • Java教程一篇文章帶你了解Java方法的使用

    一篇文章帶你了解Java方法的使用

    這篇文章主要給大家介紹了關于Java中方法使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    一朵花花10182021-11-19
  • Java教程Java靜態方法不具有多態性詳解

    Java靜態方法不具有多態性詳解

    下面小編就為大家帶來一篇Java靜態方法不具有多態性詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 ...

    jingxian1862020-05-09
  • Java教程MyBatis實現Mysql數據庫分庫分表操作和總結(推薦)

    MyBatis實現Mysql數據庫分庫分表操作和總結(推薦)

    這篇文章主要介紹了MyBatis實現Mysql數據庫分庫分表操作和總結,需要的朋友可以參考下...

    LinkinStar4192020-12-19
  • Java教程java對象初始化順序驗證示例

    java對象初始化順序驗證示例

    以下這段小程序對調用對象構造函數時,父類構造函數、成員變量初始化函數,以及非靜態初始化塊調用順序進行驗證,不考慮靜態成員及靜態初始化塊...

    java教程網5222019-11-05
  • Java教程Java static關鍵字詳細介紹與用法總結

    Java static關鍵字詳細介紹與用法總結

    這篇文章主要介紹了Java中static關鍵字的作用和用法詳細介紹,主要講了靜態方法、靜態變量、靜態類、static和final一塊用等內容。需要的朋友可以參考下...

    ppdyhappy4502020-09-10
主站蜘蛛池模板: 欧美日韩一级二级三级 | 日韩精品在线视频观看 | 九一视频在线免费观看 | 亚洲精品一区二区三区在线 | 欧美精品在线一区二区三区 | 亚洲色图50p| 精品中文一区 | 欧美日韩一区二区三区在线观看 | 欧美日韩专区 | 九九久久久 | 色婷婷av久久久久久久 | 在线国产视频观看 | 日韩成人在线影院 | 亚洲无线看| 日本在线观看www | 精品久久久久久久久久久久久久 | 欧美福利在线 | 国产精品不卡av | av电影资源 | 亚洲视频在线观看免费 | 久久久99国产精品免费 | 欧美一区二区三区在线观看 | 亚洲精品视频一区二区三区 | 亚洲不卡视频在线 | 亚洲一区免费观看 | 亚洲精品二三区 | 亚洲欧美日韩在线 | 国产精品视频成人 | 久久99精品久久久 | 91亚洲国产成人久久精品网站 | 午夜视频导航 | 动漫一区二区三区 | 北条麻妃在线一区二区免费播放 | 狠狠se | 中文字幕av一区二区三区免费看 | 国产精品中文字幕在线观看 | 色视频网站在线观看 | 欧美精品久久久 | 黄色综合 | 精品午夜久久 | 国产精品久久久久久久久小说 |