當前位置:首頁 » 編程語言 » javac區別

javac區別

發布時間: 2022-04-22 03:55:36

① 關於java_home,classpath,path和javac的問題

1.classpath它是javac編譯器的一個環境變數。它的作用與import、package關鍵字有關。當你寫下improt java.util.*時,編譯器面對import關鍵字時,就知道你要引入java.util這個package中的類---就是類的路徑所在,你要的類到哪裡找
2.JAVA_HOME 指明JDK安裝路徑
3.我們用javac將源碼編譯成.class文件, 在調用java 命令讓程序執行.

建議網路一些博客來看,看一些通俗易懂的

② 請詳細寫出Javac和Java兩個命令的使用方式

javaac和java兩個命令的使用詳解:

一、javac命令
javac 用於編譯Java文件,格式為:
java [options] [sourcefiles] [@files]
其中:
options:命令行選項;
sourcefiles:一個或多個要編譯的源文件;
@files:一個或多個對源文件進行列表的文件,有時候要編譯的文件很多,一個個敲命令會顯得很長,也不方便修改,可以把要編譯的源文件列在文件中,在文件名前加@,這樣就可以對多個文件進行編譯,對編譯一個工程很有用,方便,省事。
有幾個比較重要的選項:
-d 用於指定編譯成的class文件的存放位置,預設情況下不指定class文件的存放目錄,編譯的class文件將和源文件在同一目錄下;
-classpath 可以簡寫成-cp,用於搜索編譯所需的class文件,指出編譯所用到的class文件的位置,如jar、zip或者其他包含class文件的目錄,指定該選項會覆蓋CLASSPATH的設定;
-sourcepath用於搜索編譯所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目錄;
需要注意windows下和linux下文件路徑分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的區別:
windows下文件路徑分隔符用 \ ,文件列表分隔符用分號 ;
linux下文件路徑分隔符用 / ,文件列表分隔符用冒號 :
二、java命令
java 用於執行程序,格式如下:
java [options] classfile
options:命令行選項,一般用於 -classpath 指定要執行的文件所在的位置以及需要用到的類路徑,包括jar、zip和class文件目錄,會覆蓋CLASSPATH的設定
三、腳本
如果要敲的命令很長,每次要編譯運行的時候都要重新敲一遍,這是一件很痛苦的事情,所以用腳本可以大大方便你的工作量。在linux下用shell腳本,windows下用bat批處理程序。因為是在linux下,我這里只是簡單介紹一下shell,關於bat批處理程序的語法自己網路一下,不難。
1. 開頭
linux有很多不同的shell,通常使用bash(bourne again shell),程序必須以下面的行開始:
#!/bin/sh
#!用來告訴系統用後面的參數來執行程序,這里使用的是/bin/sh
要使你的腳本能夠執行,還必須讓這個文件有可執行許可權,使用下面命令更改文件許可權:
chmod +x filename
2. 注釋
以#開始的句子表示注釋,一直到這行結束,多寫注釋有利於以後重新看的時候知道自己在做什麼

③ JAVA編譯器在不同平台編譯同一個類,編譯的結果是否相同

.java的源文件會被編譯得到.class的位元組碼文件,這個過程是jdk當中的javac程序也就是編譯器(java compiler)乾的。但是各個平台上的javac有所區別,而且各組織或者公司可以自行開發定製自己的jdk(例如HP、IBM等都有自己的JDK),定製的JDK可能會對java源代碼進行編譯期優化,所以編譯出來的結果很可能是不完全一樣的,可以有一些細微的差別。不過這不要緊,在絕大多數情況下,即使編譯結果不同,實際運行起來的結果是一樣的。
就像中文「我叫湯姆」,有的翻譯可能會譯成「My name is Tom」,有的翻譯可能會譯成「I'm Tom」,但是對於老外來說沒太大區別,老外都能理解,實際效果是差不多的。

④ c++和Java 堆棧比較 求高手分析。。。。。

NEW是C++的關鍵字,能進行類型的檢查之類的

malloc是C跟C++都可以用的
不能進行類型檢查之類

如果是在C++中,推薦使用new

inline函數區別與普通函數在於調用普通函數時程序有壓棧和出棧操作,而inline(內聯)函數編譯器在預處理的時候會把它的代碼加到調用它的函數中,而不用額外的跳轉操作,從而提高了程序的效率。
但是inline不允許有switch, 循環等復雜語句。

堆,可用NEW對它分配內存,DELETE銷毀內存空間。
棧,是由程序本身建立,分配,消除的內存空間!他服從先進後出(FILO)的原則,從而可以把各個變數按生存期分開!

static 聲明的變數在C語言中有兩方面的特徵:
1)、變數會被放在程序的全局存儲區中,這樣可以在下一次調用的時候還可以保持原來的賦值。這一點是它與堆棧變數和堆變數的區別。
2)、變數用static告知編譯器,自己僅僅在變數的作用范圍內可見。這一點是它與全局變數的區別。
Tips:
A.若全局變數僅在單個C文件中訪問,則可以將這個變數修改為靜態全局變數,以降低模塊間的耦合度;
B.若全局變數僅由單個函數訪問,則可以將這個變數改為該函數的靜態局部變數,以降低模塊間的耦合度;
C.設計和使用訪問動態全局變數、靜態全局變數、靜態局部變數的函數時,需要考慮重入問題;
D.如果我們需要一個可重入的函數,那麼,我們一定要避免函數中使用static變數(這樣的函數被稱為:帶「內部存儲器」功能的的函數)
E.函數中必須要使用static變數情況:比如當某函數的返回值為指針類型時,則必須是static的局部變數的地址作為返回值,若為auto類型,則返回為錯指針。

函數前加static使得函數成為靜態函數。但此處「static」的含義不是指存儲方式,而是指對函數的作用域僅局限於本文件(所以又稱內部函數)。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。

擴展分析:術語static有著不尋常的歷史.起初,在C中引入關鍵字static是為了表示退出一個塊後仍然存在的局部變數。隨後,static在C中有了第二種含義:用來表示不能被其它文件訪問的全局變數和函數。為了避免引入新的關鍵字,所以仍使用static關鍵字來表示這第二種含義。最後,C++重用了這個關鍵字,並賦予它與前面不同的第三種含義:表示屬於一個類而不是屬於此類的任何特定對象的變數和函數(與Java中此關鍵字的含義相同)。

全局變數、靜態全局變數、靜態局部變數和局部變數的區別變數可以分為:全局變數、靜態全局變數、靜態局部變數和局部變數。
按存儲區域分,全局變數、靜態全局變數和靜態局部變數都存放在內存的靜態存儲區域,局部變數存放在內存的棧區。
按作用域分,全局變數在整個工程文件內都有效;靜態全局變數只在定義它的文件內有效;靜態局部變數只在定義它的函數內有效,只是程序僅分配一次內存,函數返回後,該變數不會消失;局部變數在定義它的函數內有效,但是函數返回後失效。全局變數(外部變數)的說明之前再冠以static 就構成了靜態的全局變數。全局變數本身就是靜態存儲方式, 靜態全局變數當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。這兩者的區別雖在於非靜態全局變數的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變數在各個源文件中都是有效的。 而靜態全局變數則限制了其作用域, 即只在定義該變數的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變數的作用域局限於一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出, 把局部變數改變為靜態變數後是改變了它的存儲方式即改變了它的生存期。把全局變數改變為靜態變數後是改變了它的作用域, 限制了它的使用范圍。

static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件

static全局變數與普通的全局變數有什麼區別:static全局變數只初使化一次,防止在其他文件單元中被引用;
static局部變數和普通局部變數有什麼區別:static局部變數只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
全局變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。局部變數的值不可知。

C++中extern 「C」含義深層探索
1.引言
C++語言的創建初衷是「a better C」,但是這並不意味著C++中類似C 語言的全局變數
和函數所採用的編譯和鏈接方式與C 語言完全相同。作為一種欲與C 兼容的語言,C++保留了
一部分過程式語言的特點,因而它可以定義不屬於任何類的全局變數和函數。但是,C++畢竟
是一種面向對象的程序設計語言,為了支持函數的重載,C++對全局函數的處理方式與C 有明
顯的不同。
2.從標准頭文件說起
某企業曾經給出如下的一道面試題:
面試題
為什麼標准頭文件都有類似以下的結構?
#ifndef _TEST_H
#define _TEST_H
#ifdef __cplusplus
extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}
#endif
#endif /* _TEST_H */
分析
顯然,頭文件中的編譯宏「#ifndef _TEST_H、#define _TEST_H、#endif」 的作用是防止
該頭文件被重復引用。
那麼
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
的作用又是什麼呢?
3.深層揭密extern "C"
extern "C" 包含雙重含義,從字面上即可得到:首先,被它修飾的目標是「extern」的;
其次,被它修飾的目標是「C」的。讓我們來詳細解讀這兩重含義。
被extern "C"限定的函數或變數是extern 類型的;
extern 是C/C++語言中表明函數和全局變數作用范圍(可見性)的關鍵字,該關鍵字告
訴編譯器,其聲明的函數和變數可以在本模塊或其它模塊中使用。記住,下列語句:
extern int a;
僅僅是一個變數的聲明,其並不是在定義變數a,並未為a 分配內存空間(特別注意:實
際上現在一般的編譯器都會對上述語句作聲明處理,但鏈接器在鏈接過程中如果沒有發現該
變數的定義,一般會在第一次遇到該變數聲明的地方,自動定義)。變數a 在所有模塊中作為
一種全局變數只能被定義一次,否則會出現連接錯誤。
通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變數以關鍵字
extern 聲明。例如,如果模塊B 欲引用該模塊A 中定義的全局變數和函數時只需包含模塊A
的頭文件即可。這樣,模塊B 中調用模塊A 中的函數時,在編譯階段,模塊B 雖然找不到該
函數,但是並不會報錯;它會在連接階段中從模塊A 編譯生成的目標代碼中找到此函數。
與extern 對應的關鍵字是static,被它修飾的全局變數和函數只能在本模塊中使用。因
此,一個函數或變數只可能被本模塊使用時,其不可能被extern 「C」修飾。
被extern "C"修飾的變數和函數是按照C 語言方式編譯和連接的;
未加extern 「C」聲明時的編譯方式
首先看看C++中對類似C 的函數是怎樣編譯的。
作為一種面向對象的語言,C++支持函數重載,而過程式語言C 則不支持。函數被C++編
譯後在符號庫中的名字與C 語言的不同。例如,假設某個函數的原型為:
void foo( int x, int y );
該函數被C 編譯器編譯後在符號庫中的名字為_foo,而C++編譯器則會產生像
_foo_int_int 之類的名字(不同的編譯器可能生成的名字不同,但是都採用了相同的機制,
生成的新名字稱為「mangled name」)。
_foo_int_int 這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制
來實現函數重載的。例如,在C++中,函數void foo( int x, int y )與void foo( int x, float
y )編譯生成的符號是不相同的,後者為_foo_int_float。
同樣地,C++中的變數除支持局部變數外,還支持類成員變數和全局變數。用戶所編寫程序的
類成員變數可能與全局變數同名,我們以"."來區分。而本質上,編譯器在進行編譯時,與函
數的處理相似,也為類中的變數取了一個獨一無二的名字,這個名字與用戶程序中同名的全
局變數名字不同。
未加extern "C"聲明時的連接方式
假設在C++中,模塊A 的頭文件如下:
// 模塊A 頭文件 moleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模塊B 中引用該函數:
// 模塊B 實現文件 moleB.cpp
#i nclude "moleA.h"
foo(2,3);
實際上,在連接階段,連接器會從模塊A 生成的目標文件moleA.obj 中尋找
_foo_int_int 這樣的符號!
加extern "C"聲明後的編譯和連接方式
加extern "C"聲明後,模塊A 的頭文件變為:
// 模塊A 頭文件 moleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模塊B 的實現文件中仍然調用foo( 2,3 ),其結果是:
(1)模塊A 編譯生成foo 的目標代碼時,沒有對其名字進行特殊處理,採用了C 語言的
方式;
(2)連接器在為模塊B 的目標代碼尋找foo(2,3)調用時,尋找的是未經修改的符號名_foo。
如果在模塊A 中函數聲明了foo 為extern "C"類型,而模塊B 中包含的是extern int
foo( int x, int y ) ,則模塊B 找不到模塊A 中的函數;反之亦然。
所以,可以用一句話概括extern 「C」這個聲明的真實目的(任何語言中的任何語法特
性的誕生都不是隨意而為的,來源於真實世界的需求驅動。我們在思考問題時,不能只停留
在這個語言是怎麼做的,還要問一問它為什麼要這么做,動機是什麼,這樣我們可以更深入
地理解許多問題):
實現C++與C 及其它語言的混合編程
明白了C++中extern "C"的設立動機,我們下面來具體分析extern "C"通常的使用技巧。
4.extern "C"的慣用法
(1)在C++中引用C 語言中的函數和變數,在包含C 語言頭文件(假設為cExample.h)
時,需進行下列處理:
extern "C"
{
#i nclude "cExample.h"
}
而在C 語言的頭文件中,對其外部函數只能指定為extern 類型,C 語言中不支持extern
"C"聲明,在.c 文件中包含了extern "C"時會出現編譯語法錯誤。
筆者編寫的C++引用C 函數例子工程中包含的三個文件的源代碼如下:
/* c 語言頭文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c 語言實現文件:cExample.c */
#i nclude "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++實現文件,調用add:cppFile.cpp
extern "C"
{
#i nclude "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果C++調用一個C 語言編寫的.DLL 時,當包括.DLL 的頭文件或聲明介面函數時,應加
extern "C" 。
(2)在C 中引用C++語言中的函數和變數時,C++的頭文件需添加extern "C",但是在C
語言中不能直接引用聲明了extern "C"的該頭文件,應該僅將C 文件中將C++中定義的extern
"C"函數聲明為extern 類型。
筆者編寫的C 引用C++函數例子工程中包含的三個文件的源代碼如下:
//C++頭文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++實現文件 cppExample.cpp
#i nclude "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C 實現文件 cFile.c
/* 這樣會編譯出錯:#i nclude "cExample.h" */
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
如果深入理解了第3 節中所闡述的extern "C"在編譯和連接階段發揮的作用,就能真正
理解本節所闡述的從C++引用C 函數和C 引用C++函數的慣用法。對第4 節給出的示例代碼,
需要特別留意各個細節。

volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯優化,以免出錯,(VC++ 在產生release版可執行碼時會進行編譯優化,加volatile關鍵字的變數有關的運算,將不進行編譯優化。)。

例如:
volatile int i=10;
int j = i;
...
int k = i;

volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的地址中讀取,因而編譯器生成的可執行碼會重新從i的地址讀取數據放在k中。

而優化做法是,由於編譯器發現兩次從i讀數據的代碼之間的代碼沒有對i進行過操作,它會自動把上次讀的數據放在k中。而不是重新從i裡面讀。這樣以來,如果i是一個寄存器變數或者表示一個埠數據就容易出錯,所以說volatile可以保證對特殊地址的穩定訪問,不會出錯。

斷言(assert)是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為 true。如果表達式計算為 false,那麼系統會報告一個 Assertionerror。它用於調試目的:
assert(a > 0); // throws an Assertionerror if a <= 0
斷言可以有兩種形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 應該總是產生一個布爾值。
Expression2 可以是得出一個值的任意表達式。這個值用於生成顯示更多調試信息的 String 消息。
斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用 source 1.4 標記:
javac -source 1.4 Test.java
要在運行時啟用斷言,可使用 -enableassertions 或者 -ea 標記。
要在運行時選擇禁用斷言,可使用 -da 或者 -disableassertions 標記。
要系統類中啟用斷言,可使用 -esa 或者 -dsa 標記。還可以在包的基礎上啟用或者禁用斷言。
可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用於驗證傳遞給私有方法的參數。不過,斷言不應該用於驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試後置條件。另外,斷言不應該以任何方式改變程序的狀態。
9月

⑤ java 和javac的區別

在DOS界面,安裝完JAVA且PATH了安裝路徑就會有這兩個方法,其中JAVAC命令是把寫好的。txt文件編譯成。java文件。C是CREADT的意思。當想執行java文件的時候就要用java命令了。

⑥ JRE 和 JDK 的區別是什麼

是java程序的運行環境。既然是運行,當然要包含jvm,也就是大家熟悉的虛擬機啦,
development
kit,是java的開發工具包,裡麵包含了各種類庫和工具。當然也包括了另外一個Jre.
相信大家都知道jdk的bin下有各種java程序需要用到的命令,與jre的bin目錄最明顯的區別就是jdk下才有javac,這一點很好理解,因為
jre只是一個運行環境而已。與開發無關,正因為如此,具備開發功能的jdk自己的jre下才會同時有client性質的jvm和server性質的jvm,
而僅僅作為運行環境的jre下只需要client性質的jvm.dll就夠了。
記得在環境變數path中設置jdk/bin路徑麽?這應該是大家學習Java的第一步吧,
老師會告訴大家不設置的話javac和java是用不了的。確實jdk/bin目錄下包含了所有的命令。可是有沒有人想過我們用的java命令並不是
jdk/bin目錄下的而是jre/bin目錄下的呢?不信可以做一個實驗,大家可以把jdk/bin目錄下的java.exe剪切到別的地方再運行
試想一下如果java為了提供給大多數人使用,他們是不需要jdk做開發的,只需要jre能讓java程序跑起來就可以了,那麼每個客戶還需要手動去設置環境變數多麻煩啊?所以安裝jre的時候安裝程序自動幫你把jre的java.exe添加到了系統變數中,驗證的方法很簡單,大家看到了系統環境變數的
如果強行能夠把jdk/bin挪到system32變數前面,當然也可以迫使使用jdk/jre裡面的java,不過除非有必要,我不建議大家這么做。使用單獨的jre跑java程序也算是客戶環境下的一種測試。

⑦ javac 的路徑區別

第一種是帶了全路徑的編譯,第二種是默認在你指定的文件夾下編譯,兩種沒有區別,但是用java命令運行時第二種要想成功那麼你在設定clathpath時要指定".",還有是程序中有包時要注意在包外編譯.

⑧ 菜鳥問題: jdk, jar, javaw, javac, javah分別是什麼

jdk 是java 開發工具包。 簡單來說 ,是開發java 的一個必備工具。

jar 是 java 開發完成之後,打包的結果 類似 程序的 .dll 或者 .exe

javaw 是java 運行環境中的 一個工具, 用於啟動 java 或者 jar 程序。 其作用是隱藏控制台的方式, 運行java 程序。

javac 是java 開發工具包(jdk) 其中的一個工具, 用於編譯 java 文件, 產生可運行的 .class java 位元組碼文件。\

javah 是java語言 C 頭文件和 stub 文件生成器。 主要用於 java做本地調用的時候。 產生C語言的頭文件。

javaw 多數是用於運行 Swing 。 或者不需要控制台的可視化程序。 比如。運行 jar 文件。

javaw -jar jar文件名稱

如果運行java 文件。 只要編譯好產生.class 位元組碼文件
然後

javaw .class文件名
調用方式,和java 命令是一樣的。 區別只是不產生控制台。

⑨ JVM,JDK和JRE有什麼區別它們的聯系是什麼

引言:在選擇編程語言的時候,有一些人會選擇Java,Java在書寫和製作的過程中所包含的內容還是比較多的,java中有三個比較常見的名詞,分別是jvm、jdk、jre那麼這三者有什麼區別呢?之間的聯系是怎麼樣的呢?

總結

學習Java是一個非常不錯的選擇,不過學習的過程中應該注意自己的學習進度並且及時的督促自己,才能夠保證自己是能夠學習好的,所以在日常生活中還是要多做總結和分析,從而能夠保證自己是能夠有效的學習JAVA的。

⑩ 學習Java最重要的是哪些知識點

第一:對於Java面向對象概念的理解。學習Java的第一個難點就是如何理解Java的面向對象編程概念,涉及到類、介面、多態等概念。在理解這些Java開發概念的過程中,應該從Java面向對象編程過程入手,涉及到類的定義、對象的創建和方法的調用,在這個基礎上可以逐漸形成自身的Java編程思想。

第二:對於Java模塊化編程的理解。Java是抽象程度比較高的編程語言,所以對於初學者來說,可以先從模式編程入手,然後進一步提升自身對於模塊化編程的理解。對於Java程序員來說,模塊化編程能力對於自身的Java開發能力有非常直接的影響。另外,在理解Java模塊化編程的過程中,也會逐漸提升自身的抽象能力。

第三:Java的開發框架。Java開發與開發框架有非常緊密的聯系,初學者可以先從Spring開發框架開始學習,比如從SpringBoot開始學起就是不錯的選擇。Spring系列框架當前已經非常龐大了,基於Spring也能夠完成「一站式」解決方案。Spring框架的學習過程並不復雜,但是需要完成一系列實驗。

書籍的話,推薦看下我們出版的圖書《實戰Java程序設計》

這是一本既注重實戰,同時也注重底層「內功」(內存分析、JVM底層、數據結構)訓練的書。非常實用!

希望能幫到你,望採納!

熱點內容
如何讓電腦上擁有移動式伺服器 發布:2025-01-27 13:04:46 瀏覽:67
漫威超級戰爭如何配置核心組合 發布:2025-01-27 13:03:19 瀏覽:954
c語言五子棋程序 發布:2025-01-27 12:58:43 瀏覽:157
win10流媒體伺服器怎麼搭建 發布:2025-01-27 12:58:04 瀏覽:384
組合公式的演算法 發布:2025-01-27 12:45:50 瀏覽:277
落櫻小屋哪裡下載安卓 發布:2025-01-27 12:35:13 瀏覽:71
微信伺服器IP跳轉 發布:2025-01-27 12:26:54 瀏覽:74
oracle自動備份腳本linux 發布:2025-01-27 12:21:40 瀏覽:937
pop伺服器密碼怎麼填 發布:2025-01-27 12:20:02 瀏覽:969
oraclesqlnumber 發布:2025-01-27 12:04:22 瀏覽:850