最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中值類型和引用類型詳解

 更新時(shí)間:2022年01月04日 09:26:20   作者:我是你bby  
大家好,本篇文章主要講的是Java中值類型和引用類型詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

我們都知道java是一種面向?qū)ο蟮木幊陶Z(yǔ)言,但是在實(shí)際意義上java并不是純面向?qū)ο?,因?yàn)槊嫦驅(qū)ο蟮囊饬x就是萬(wàn)物皆對(duì)象,那么如果說(shuō)int類型的變量也是一個(gè)對(duì)象的話,那么我們應(yīng)該能用"."這個(gè)東西訪問到它的屬性或者是方法,例如:

import java.util.ArrayList;
import java.util.List;
 
public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.get(0);
    }
}

就好比是這樣,我們把這個(gè)list這個(gè)對(duì)象看做一個(gè)變量,如果他是對(duì)象的話那么我們應(yīng)該能夠訪問到它的屬性和方法,但是在java中的基本數(shù)據(jù)類型是沒屬性和方法的,那么我們就可以說(shuō),只要點(diǎn)"."不出來(lái)東西的變量都是基本數(shù)據(jù)類型(于是就出現(xiàn)了包裝類這種東西)。

關(guān)于java中的值類型和引用類型的方法傳遞問題

咱們先看看Java中的這些數(shù)據(jù)是怎么存儲(chǔ)的

不知道兄弟們能不能理解,我在用語(yǔ)言描述一遍

在一個(gè)函數(shù)中兩個(gè)基本類型的變量在聲明了之后,將這兩個(gè)變量作為參數(shù)傳遞給另一個(gè)方法,這個(gè)方法會(huì)復(fù)制兩個(gè)副本,也就是說(shuō)在swap(int, int)方法中交換的是兩個(gè)副本的值,其真實(shí)的值并沒有交換,那么就會(huì)有人想了,那用包裝類啊,用引用類型的數(shù)據(jù)不就能交換了嗎,咱么看一下: 

public class Test {
    public static void main(String[] args) {
        Integer n1 = 1, n2 = 2;
        System.out.println("交換前: num1: " + n1 + "\tnum2: " + n2);
        swap(n1, n2);
        System.out.println("交換后: num1: " + n1 + "\tnum2: " + n2);
    }
    public static void swap(Integer num1, Integer num2) {
       Integer temp = num1;
       num1 = num2;
       num2 = temp;
    }
}

這個(gè)結(jié)果是沒有交換的,那么就會(huì)有人想了,這是怎么回事呢?

其實(shí)雖說(shuō)是引用類型,但是在傳參數(shù)的過(guò)程中,還是按照副本的方式傳遞的,只不過(guò)是將棧區(qū)中存儲(chǔ)的地址作為副本進(jìn)行交換,但是數(shù)據(jù)在堆中,并沒有交換。

Oracle官方也說(shuō)過(guò),java是沒有引用傳遞的,只有值類型的按值傳遞和引用類型的按值傳遞,說(shuō)白了只有按值傳遞,是無(wú)他將引用進(jìn)行傳遞的。但是C++中是有引用類型的,我們來(lái)看一段代碼:

#include <iostream>
using namespace std;
 
int main(int agv, char** args)
{
	int num1 = 1, num2 = 2;
	cout << "交換前 " << "num1: " << num1 << "\tnum2: " << num2 << endl;
	swap(num1, num2);
	cout << "交換后 " << "num1: " << num1 << "\tnum2: " << num2 << endl;
}
 
void swap(int& num1, int& num2)
{
	int temp = num1;
	num2 = num1;
	num2 = temp;
}

結(jié)果顯示為:

這個(gè)是C++中的引用類型傳遞,傳遞的參數(shù)確確實(shí)實(shí)是數(shù)據(jù)的引用

在C++中或者利用指針進(jìn)行地址中的值交換操作也可以,只不過(guò)相對(duì)來(lái)說(shuō)麻煩一些(其實(shí)這是在C中的操作)輸出結(jié)果和上面的是一樣的

#include <iostream>
using namespace std;
 
int main(int agv, char** args)
{
	int num1 = 1, num2 = 2;
	cout << "交換前 " << "num1: " << num1 << "\tnum2: " << num2 << endl;
	swap(num1, num2);
	cout << "交換后 " << "num1: " << num1 << "\tnum2: " << num2 << endl;
}
 
void swap(int* num1, int* num2)
{
	int temp = *num1;
	*num1 = *num2;
	*num2 = temp;

在C#中也有引用傳遞,需要用到關(guān)鍵字ref,代碼如下

        static void Main(string[] args)
        {
            int num1 = 1, num2 = 2;
            Console.WriteLine("交換前: num1: {0}\tnum2: {1}", num1, num2);
            swap(ref num1, ref num2);
            Console.WriteLine("交換后: num1: {0}\tnum2: {1}", num1, num2);
            Console.ReadKey();
        }
 
        static void swap(ref int num1, ref int num2)
        {
            int temp = num1;
            num1 = num2;
            num2 = temp;
        }

輸出結(jié)果為:

 確實(shí)也進(jìn)行交換了

說(shuō)了這么多都快跑題了,這時(shí)候可能就有人想  誒 明明標(biāo)題是Java的標(biāo)題,怎么說(shuō)了這么一大堆其他語(yǔ)言的東西,馬上了  不用著急

但是Java這兩個(gè)功能沒有怎么辦呢?

我們可以用數(shù)組的方式,反正就是想法設(shè)法把堆中的數(shù)據(jù)進(jìn)行交換,或者用返回值的方式,但是返回的話也只能返回一個(gè)數(shù)據(jù)(不像C#中能返回多個(gè)數(shù)據(jù),有人就會(huì)想了,怎么java這么菜,啥啥干不了),但是事實(shí)就是如此,我們又能有什么辦法。。。

    public static void main(String[] args) {
        int[] n1 = {1}, n2 = {2};
        System.out.println("交換前: num1: " + n1[0] + "\tnum2: " + n2[0]);
        swap(n1, n2);
        System.out.println("交換后: num1: " + n1[0] + "\tnum2: " + n2[0]);
    }
    public static void swap(int[] num1, int[] num2) {
        int temp = num1[0];
        num1[0] = num2[0];
        num2[0] = temp;
    }

所以咯,java只能這么進(jìn)行交換了

到此這篇關(guān)于Java中值類型和引用類型詳解的文章就介紹到這了,更多相關(guān)Java值類型和引用類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Spring Boot中Controller用法

    詳解Spring Boot中Controller用法

    Controller是SpringBoot里最基本的組件,他的作用是把用戶提交來(lái)的請(qǐng)求通過(guò)對(duì)URL的匹配,分配個(gè)不同的接收器,再進(jìn)行處理,然后向用戶返回結(jié)果。下面通過(guò)本文給大家介紹Spring Boot中Controller用法,需要的朋友參考下
    2017-05-05
  • SpringCloud 如何使用feign時(shí)的復(fù)雜參數(shù)傳遞

    SpringCloud 如何使用feign時(shí)的復(fù)雜參數(shù)傳遞

    這篇文章主要介紹了SpringCloud 如何使用feign時(shí)的復(fù)雜參數(shù)傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟

    SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟

    這篇文章主要介紹了SpringBoot配置MongoDB多數(shù)據(jù)源的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 使用Guava?Cache原理及最佳實(shí)踐

    使用Guava?Cache原理及最佳實(shí)踐

    文章介紹了GuavaCache,這是一種支持高并發(fā)的本地緩存,它支持多種回收策略,如基于容量、時(shí)間和引用的回收,并提供了自動(dòng)加載、定時(shí)刷新和顯式清除緩存的功能,文章還討論了GuavaCache的適用場(chǎng)景和使用方法,并通過(guò)代碼示例和源碼分析,幫助讀者更好地理解和使用GuavaCache
    2025-02-02
  • 在SpringBoot中配置日志級(jí)別和輸出格式的教程詳解

    在SpringBoot中配置日志級(jí)別和輸出格式的教程詳解

    在開發(fā)一個(gè)應(yīng)用程序時(shí),日志記錄是非常重要的一環(huán),SpringBoot提供了多種日志輸出方式和配置選項(xiàng),本文將介紹如何在SpringBoot應(yīng)用程序中配置日志級(jí)別和輸出格式,需要的朋友可以參考下
    2023-06-06
  • MyBatis-Plus?分頁(yè)查詢的實(shí)現(xiàn)示例

    MyBatis-Plus?分頁(yè)查詢的實(shí)現(xiàn)示例

    本文主要介紹了MyBatis-Plus?分頁(yè)查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java日期處理工具類DateUtils詳解

    Java日期處理工具類DateUtils詳解

    這篇文章主要為大家詳細(xì)介紹了Java日期處理工具類DateUtils的相關(guān)代碼,包含日期和時(shí)間常用操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Flutter實(shí)現(xiàn)容器組件、圖片組件 的代碼

    Flutter實(shí)現(xiàn)容器組件、圖片組件 的代碼

    容器組件(Container)可以理解為在Android中的RelativeLayout或LinearLayout等,在其中你可以放置你想布局的元素控件,從而形成最終你想要的頁(yè)面布局。這篇文章主要介紹了Flutter實(shí)現(xiàn)容器組件、圖片組件 的代碼,需要的朋友可以參考下
    2019-07-07
  • Java forEach對(duì)原數(shù)組的操作過(guò)程

    Java forEach對(duì)原數(shù)組的操作過(guò)程

    forEach對(duì)于基本數(shù)據(jù)類型,是直接賦值,對(duì)于引用數(shù)據(jù)類型,是引用地址值,forEach遍歷時(shí),是創(chuàng)建的臨時(shí)變量,引用的數(shù)據(jù)地址,本文給大家介紹Java forEach對(duì)原數(shù)組的操作過(guò)程,感興趣的朋友一起看看吧
    2024-02-02
  • Java Annotation(Java 注解)的實(shí)現(xiàn)代碼

    Java Annotation(Java 注解)的實(shí)現(xiàn)代碼

    本篇文章介紹了,Java Annotation(Java 注解)的實(shí)現(xiàn)代碼。需要的朋友參考下
    2013-05-05

最新評(píng)論

颍上县| 青铜峡市| 浮山县| 辽中县| 溧水县| 禹城市| 平舆县| 桃江县| 贵德县| 河间市| 五大连池市| 调兵山市| 怀仁县| 上蔡县| 尖扎县| 清新县| 明星| 大丰市| 二手房| 西城区| 肥西县| 汨罗市| 新乡市| 盐边县| 石嘴山市| 亚东县| 佛教| 灵台县| 景洪市| 晋州市| 石渠县| 汤阴县| 南京市| 班玛县| 定南县| 新巴尔虎左旗| 嘉黎县| 柳江县| 溧水县| 襄樊市| 邵武市|