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

Java入門學(xué)習(xí)之環(huán)境變量與程序運行原理詳解

 更新時間:2025年07月29日 10:22:57   作者:夕陽UPdz  
Java是一種廣泛使用的面向?qū)ο缶幊陶Z言,具有跨平臺、可移植性和安全性等特點,這篇文章主要介紹了Java入門學(xué)習(xí)之環(huán)境變量與程序運行原理的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

我在剛剛學(xué)習(xí)JAVA時只是抱著高中時期的:”跟著老師走,我就能理解一切“的心態(tài),按部就班按著老師所講的去學(xué)習(xí),并非沒用,但也不能算很有用,學(xué)校的老師講課會顧及難度,不會向我們?nèi)ソ虒?dǎo)一些更深層次的東西,當(dāng)我去問老師時,老師給的回答往往是讓我去網(wǎng)絡(luò)里尋求答案,對啊,現(xiàn)在是互聯(lián)網(wǎng)的時代,AI遍布我們的生活各處,技術(shù)文檔由眾多大佬分享,于是我對于一些當(dāng)時不是很理解的地方做了我自認(rèn)為的“淺層深挖”,目的是為了幫助我更加去理解原理,而不是只是迷迷糊糊的做一個打代碼工具。

一.為什么我們要去配置環(huán)境變量?

在我剛剛接觸JAVA的時候,老師課上交給我們的第一個任務(wù),便是"配置環(huán)境變量",這對于還是萌新的我而言十分的困難,反復(fù)的配置失敗以及一次次嘗試讓我不由得想:“為什么我們要配置JAVA的環(huán)境變量呢?”

如圖中,我在沒有配置環(huán)境變量之前嘗試在我的E:\train_code下去執(zhí)行命令:

 javac  HelloWord.java ,結(jié)果彈出提示:“javac不是內(nèi)部或外部命令,也不是可執(zhí)行程序”。

為什么呢?為什么會出現(xiàn)“javac不是內(nèi)部或外部命令”這個錯誤呢?我明明已經(jīng)安裝了JAVA!

原來在未配置環(huán)境變量時,系統(tǒng)無法在任意路徑下找到javac.exe,因為系統(tǒng)默認(rèn)只在當(dāng)前目錄和PATH環(huán)境變量指定的路徑中搜索可執(zhí)行文件。在環(huán)境變量沒被配置時,系統(tǒng)根本不知道javac.exe到底在哪里。

javac.exe通常藏在 C:\Program Files\Java\你的jdk版本名稱\bin 里面

而我如果需要運行我的.java程序,我需要JDK(Java Development Kit - JAVA開發(fā)工具包)中bin目錄下的javac.exe來對.java程序進行“編譯”,那么我想你應(yīng)該有一些理解了,之所以要配置環(huán)境變量,是為了使得我們的這個.java程序無論位于我們電腦的哪個盤符(C: / D: / E:........)下的哪個文件下,都可以通過javac.exe來進行對.java程序的“編譯”。

環(huán)境變量PATH的配置,配置PATH后,無論當(dāng)前目錄在哪里,系統(tǒng)都會在C:\Program Files\Java\jdk-xx\bin中搜索javac.exe,可以理解為就是將我所配置的這個路徑當(dāng)作一個環(huán)境,我執(zhí)行哪個文件都相當(dāng)于是我在這個環(huán)境下去執(zhí)行的,當(dāng)然也就能使用這個環(huán)境內(nèi)的工具了,所以我們并不是不配置環(huán)境變量就無法運行JAVA項目,配置環(huán)境變量后,我們就可以在任意目錄下編譯和運行Java程序,無需每次切換到JDK的bin目錄。

二.“編譯”是什么過程?JAVA程序又是怎么樣去執(zhí)行的呢?

在“一”里面我們提到了一個詞,叫做“編譯”,這個詞本身我們是沒少聽的,我們常說編譯器,編譯器,難道編譯的作用就是把程序在我們的計算機運行嗎?事實上,編譯只是我們程序運行這個大過程中的一個小過程,舉個例子,比如運行C語言程序,我們并不是只依靠編譯去運行這個程序,而是先通過編譯將開發(fā)者寫出的這些由英文字母組成的代碼,轉(zhuǎn)換為機器所能看懂的二進制的機器碼,然后再由機器去執(zhí)行這個二進制的機器碼,但是JAVA呢?JAVA也是這樣嗎?

實則不然,JAVA程序的運行過程要更多一點,因為Java擁有一個優(yōu)勢:那就是JAVA可以實現(xiàn)跨平臺,通常稱之為“一次編寫,到處運行”(Write Once, Run Anywhere, WORA)。

1.為什么JAVA可以實現(xiàn)跨平臺而C/C++不行呢?

C/C++都是直接由對應(yīng)操作系統(tǒng)的編譯器來編譯為.exe的可執(zhí)行文件,之后直接運行的,他們所生成的這個.exe里面都是針對特定平臺的機器碼,所以C/C++并不能夠?qū)崿F(xiàn)跨平臺運行,Windows的.exe就是Windows的,Linux的就是Linux的。

2.JAVA的運行過程較為特殊,JAVA的運行過程為:

首先,開發(fā)者寫出一份.JAVA程序,拿給環(huán)境變量里的JDK說:“我這里有個JAVA程序,請你幫我運行他。”,然后JDK中的javac.exe就會把你給他的JAVA程序編譯為一份.CLASS的字節(jié)碼文件(.class文件就是JAVA實現(xiàn)跨平臺的關(guān)鍵),并且對你說:“這個你得等我會兒,我這里呢得先處理下你的程序,然后交給統(tǒng)一部門對你這個程序做更細(xì)化的處理。”

然后,這個.CLASS文件會被交給JVM,JVM類似每個手機廠商分布在各個城市的手機專賣店,雖然門店服務(wù)的地區(qū)不同,但是門店都是這個手機廠商旗下的,也就是說雖然不同操作系統(tǒng)下的JVM是不同的,但他們都有一個相同的“接口”來使得他們能以不同的JVM實現(xiàn)來達成同一個功能:那個功能就是他們都能夠?qū)⑦@個.CLASS文件進行動態(tài)解釋或者編譯執(zhí)行

關(guān)于JAVA與C/C++的運行過程(更清晰的展示):

  • C/C++:源碼 → 編譯為平臺特定的機器碼 → 直接運行。

  • Java:源碼 → 編譯為平臺無關(guān)的字節(jié)碼 → JVM解釋/編譯執(zhí)行。

字節(jié)碼文件的核心作用:

        跨平臺(平臺無關(guān)性):一次編譯,JVM運行(Windows/Linux/Mac通用)。
        安全可控:JVM檢查代碼,防止崩潰或病毒。
        統(tǒng)一生態(tài):Java/Kotlin等語言最終都變成字節(jié)碼,互相兼容。
        高效執(zhí)行:JIT編譯熱點代碼,速度接近C++。

一句話總結(jié):字節(jié)碼是Java跨平臺的“通用語言”,由JVM翻譯執(zhí)行,兼顧安全性和性能。

三.JAVA最基礎(chǔ)的程序代碼

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

我所打的第一個JAVA程序,便是這個“Hellow,World!”,我一開始就對這個神奇的東西很不理解,這個String[] args是個什么玩意?main前面這一大串又是啥啊?   

關(guān)于main

main方法是一個特殊的方法,它定義了JAVA程序的起始位置。如果沒有這個方法,JVM就無法啟動程序。如圖,可以看到,如果一個程序中沒有main方法,那么這個程序甚至無法運行。

注意,這里說無法運行并發(fā)完全無法運行:

  • Java 9+支持模塊化啟動,可通過jlink定制啟動類

  • 初學(xué)者場景下,main仍是標(biāo)準(zhǔn)入口。

關(guān)于String[] args

main方法不只是一個簡單的入口,他里面?zhèn)魅氲膮?shù),也就是:String[] args參數(shù)(事實上,String[] args作為一個參數(shù),參數(shù)名并不強行要求為args,你甚至可以把它改成aaas),但要注意:

  • 雖然args可以改名,但約定俗成用args,提高代碼可讀性。

  • 其他常見命名如argv(來自C傳統(tǒng))。

程序可以通過這個參數(shù)來處理用戶輸入的動態(tài)數(shù)據(jù),String[] args中存儲了當(dāng)該程序在終端或者命令提示符中運行JAVA程序時,人為通過命令添加的額外參數(shù),比如我在終端中執(zhí)行:

java 類名 參數(shù)1 參數(shù)2 ...

那么這個時候,arg[0] = "參數(shù)一",而arg[1] = "參數(shù)二",讓我們來驗證一下吧:

public class MyProgram {
    public static void main(String[] args) {
        // 獲取參數(shù)數(shù)組的長度
        int numArgs = args.length;
        System.out.println("命令行參數(shù)數(shù)量: " + numArgs);

        // 遍歷并打印每個參數(shù)
        for (int i = 0; i < numArgs; i++) {
            System.out.println("args[" + i + "] = " + args[i]);
        }
    }
}

我們在終端執(zhí)行 java MyProgram "hellow world" 123 ,我們運行程序會輸出:

命令行參數(shù)數(shù)量: 2
args[0] = hello world
args[1] = 123

關(guān)于System.out.println()

當(dāng)我寫出代碼時,我看著我打印出來的Hellow,World!陷入了一個思考,為什么這個名為System.out.println的東西能夠?qū)⑺竺胬ㄌ杻?nèi)的內(nèi)容打印出來呢?

這里面,System是JDK提供的工具類,out是其靜態(tài)字段(類型為PrintStream),printlnPrintStream的方法。這些代碼是Java標(biāo)準(zhǔn)庫的一部分,初期只需知道它是輸出語句,后期可深入研究IO流和標(biāo)準(zhǔn)輸出的設(shè)計.

當(dāng)我們的鼠標(biāo)按住“Ctrl”鍵的同時將鼠標(biāo)指針移到這三個單詞的任意一個上面時,他會被高亮,這個時候我們點進去,你就會發(fā)現(xiàn):

它跳轉(zhuǎn)到了一個我們不知道的地方,這里就是JDK的源代碼,我們的這個語句就是在這里被定義的,所以本質(zhì)上我們只是將大佬們定義好的方法拿過來去使用。

個人想說的話:

到此這篇關(guān)于Java入門學(xué)習(xí)之環(huán)境變量與程序運行原理的文章就介紹到這了,更多相關(guān)Java環(huán)境變量與程序運行原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Aspectj與Spring AOP的對比分析

    Aspectj與Spring AOP的對比分析

    這篇文章主要介紹了Aspectj與Spring AOP的對比分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 詳解java中的互斥鎖信號量和多線程等待機制

    詳解java中的互斥鎖信號量和多線程等待機制

    這篇文章主要介紹了Java編程中的互斥鎖,信號量和多線程等待機制實例詳解,簡單介紹了互斥鎖和信號量的區(qū)別,需要的朋友可以了解下。
    2017-09-09
  • Java實現(xiàn)學(xué)生管理系統(tǒng)

    Java實現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java使用字節(jié)流實現(xiàn)圖片音頻的復(fù)制

    Java使用字節(jié)流實現(xiàn)圖片音頻的復(fù)制

    今天帶大家學(xué)習(xí)Java的相關(guān)知識,文章圍繞著Java如何使用字節(jié)流實現(xiàn)圖片音頻的復(fù)制展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • java中線程安全的list詳細(xì)特性和用法

    java中線程安全的list詳細(xì)特性和用法

    這篇文章主要給大家介紹了關(guān)于java中線程安全的list詳細(xì)特性和用法的相關(guān)資料,Java中有多種線程安全的List,其中比較常用的有Vector、Collections.synchronizedList()和CopyOnWriteArrayList三種方式,需要的朋友可以參考下
    2024-03-03
  • 詳解JDBC的概念及獲取數(shù)據(jù)庫連接的5種方式

    詳解JDBC的概念及獲取數(shù)據(jù)庫連接的5種方式

    Java?DataBase?Connectivity是將Java與SQL結(jié)合且獨立于特定的數(shù)據(jù)庫系統(tǒng)的應(yīng)用程序編程接口,一種可用于執(zhí)行SQL語句的JavaAPI。本文主要介紹了JDBC的概念及獲取數(shù)據(jù)庫連接的5種方式,需要的可以參考一下
    2022-09-09
  • Spring Boot利用@Async異步調(diào)用:ThreadPoolTaskScheduler線程池的優(yōu)雅關(guān)閉詳解

    Spring Boot利用@Async異步調(diào)用:ThreadPoolTaskScheduler線程池的優(yōu)雅關(guān)閉詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot利用@Async異步調(diào)用:ThreadPoolTaskScheduler線程池的優(yōu)雅關(guān)閉的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • spring/springboot整合curator遇到的坑及解決

    spring/springboot整合curator遇到的坑及解決

    這篇文章主要介紹了spring/springboot整合curator遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • java swing中實現(xiàn)拖拽功能示例

    java swing中實現(xiàn)拖拽功能示例

    這篇文章主要介紹了java swing中實現(xiàn)拖拽功能示例,需要的朋友可以參考下
    2014-04-04
  • JavaWeb倉庫管理系統(tǒng)詳解

    JavaWeb倉庫管理系統(tǒng)詳解

    這篇文章主要為大家詳細(xì)介紹了JavaWeb倉庫管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論

霍山县| 洛浦县| 霸州市| 溆浦县| 清水县| 彝良县| 景洪市| 金昌市| 朝阳市| 泸州市| 皋兰县| 新和县| 吉木萨尔县| 庄河市| 宜章县| 获嘉县| 怀集县| 青州市| 龙泉市| 苍山县| 泗阳县| 芦溪县| 黎平县| 高密市| 平陆县| 西乌珠穆沁旗| 扬州市| 商河县| 博爱县| 岳普湖县| 陆良县| 牡丹江市| 博野县| 清水县| 长白| 平阴县| 池州市| 金坛市| 汉阴县| 长治县| 武义县|