第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

java不是值傳遞嗎?為什么會(huì)出現(xiàn)這種情況

java不是值傳遞嗎?為什么會(huì)出現(xiàn)這種情況

陪伴而非守候 2019-02-19 20:04:20
如題,按說(shuō)java是值傳遞的,可下面的代碼能正確運(yùn)行,getClassSet方法中有一個(gè)局部的set變量,在doAddClass方法里對(duì)其進(jìn)行了add但沒(méi)有返回,但最后卻能從getClassSet方法返回的set里獲取到元素,這是為什么?代碼略長(zhǎng),勞煩大佬了 /** * 獲取指定包名下的所有類文件,可讀取class或jar * Enumeration古代迭代器 */ public static Set<Class<?>> getClassSet(String packageName) { Set<Class<?>> classes = new HashSet<>(); try { //獲取文件系統(tǒng)下的資源文件,url路徑類似 file:/C:/Users/Kaibo/OneDrive/workplaceForIDEA/SmartFramework/target/classes/com/smar4j/framework/util Enumeration<URL> urls = getClassLoader().getResources(packageName.replace(".", "/")); while (urls.hasMoreElements()) { URL url = urls.nextElement(); if (null != url) { String protocol = url.getProtocol(); //判斷url協(xié)議,file還是jar if ("file".equals(protocol)) { //替換url中的空格 String packagePath = url.getPath().replaceAll("%20", ""); addClass(classes, packagePath, packageName); } else if ("jar".equals(protocol)) { //操作jar文件 JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); if (null != jarURLConnection) { JarFile jarFile = jarURLConnection.getJarFile(); if (null != jarFile) { Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry jarEntry = entries.nextElement(); String name = jarEntry.getName(); if (name.endsWith(".class")) { String className = name.substring(0, name.lastIndexOf(".")).replaceAll("/", "."); doAddClass(classes, className); } } } } } } } } catch (IOException e) { e.printStackTrace(); } return classes; } private static void addClass(Set<Class<?>> classes, String packagePath, String packageName) { File[] files = new File(packagePath).listFiles(new FileFilter() { @Override public boolean accept(File file) { return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory(); } }); for (File file : files) { String fileName = file.getName(); //如果不是目錄 if (file.isFile()) { String className = fileName.substring(0, fileName.lastIndexOf(".")); if (StringUtil.isNotEmpty(packageName)) { className = packageName + "." + className; doAddClass(classes, className); } else { String subPackagePath = fileName; if (StringUtil.isNotEmpty(packagePath)) { subPackagePath = packagePath + "/" + subPackagePath; } String subPackageName = fileName; if (StringUtil.isNotEmpty(packageName)) { subPackageName = packageName + "." + subPackageName; } addClass(classes, subPackagePath, subPackageName); } } } } private static void doAddClass(Set<Class<?>> classes, String className) { Class<?> cls = loadClass(className, false); classes.add(cls); }
查看完整描述

5 回答

?
揚(yáng)帆大魚

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊

對(duì)于對(duì)象來(lái)說(shuō),傳遞的只是引用,不是以副本形式(值)傳遞的,8 種基本類型(非對(duì)應(yīng)的類類型)才是傳值。

查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

值傳遞沒(méi)錯(cuò), 但相對(duì)于簡(jiǎn)單類型是這樣, 對(duì)于類來(lái)說(shuō),值是類的內(nèi)存地址, 也就是引用. 如果你改了引用對(duì)應(yīng)對(duì)象的內(nèi)部值, 也沒(méi)有誰(shuí)能攔得了你. 網(wǎng)上資料太多, 不重復(fù)了.

打個(gè)比方說(shuō), 集合類型就是書包, 你背上書包進(jìn)了樓, 相當(dāng)于是調(diào)用了進(jìn)樓方法, 執(zhí)行完成了,你出了樓, 你沒(méi)有變, 書包也沒(méi)有變. 但你書包里的東西變沒(méi)變就不好說(shuō)了.

查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
阿波羅的戰(zhàn)車

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊

這種也叫引用傳遞,傳遞的是對(duì)象的內(nèi)存地址。也就是說(shuō)這兩個(gè)方法里的變量指向的是同一塊內(nèi)存地址。

classes.add(cls);對(duì)內(nèi)存地址里的數(shù)據(jù)做了修改,也直接反應(yīng)到getClassSet里的變量,因?yàn)樗鼈兪峭粋€(gè)對(duì)象

查看完整回答
反對(duì) 回復(fù) 2019-03-01
?
慕桂英546537

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊

HashSet源碼是基于HashMap實(shí)現(xiàn)的

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;
 Set<Class<?>> classes = new HashSet<>();
調(diào)用private static void doAddClass(Set<Class<?>> classes, String className)方法 

兩個(gè)classes引用同時(shí)指向new HashSet<>()這個(gè)對(duì)象,在方法里面執(zhí)行 classes.add(cls);
也就是調(diào)用了map的put方法,修改了這個(gè)共同指向?qū)ο罄锩娴腍ashMap成員變量的內(nèi)容,返回的也是這個(gè)對(duì)象,所以getClassSet方法返回的set里能獲取到元素。

查看完整回答
反對(duì) 回復(fù) 2019-03-01
  • 5 回答
  • 0 關(guān)注
  • 573 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)