java執行參數
首先用vim 在linux下編寫一個名為Test.java的文件,代碼如下:
class Test{ public static void main(String []args){ System.out.println("test input main arguments"); System.out.println(args[0]+" "+args[1]); System.out.println("end of main"); } }
代碼很簡單,只有一個main函數用來輸出我輸入的前兩個參數,注意前兩個參數如果不輸入會拋數組越界 的異常。
vim編輯完後按esc進入命令模式,然後shift+ZZ保存並退出。然後通過javac Test.java 即可對該文件進行編譯,編譯會可以看到在該目錄下生成了一個Test.class文件。
編譯時沒有拋出異常說明代碼成功編譯,接下來看看怎麼運行吧,其實也很簡單,就通過如下命令即可:
java Test hello world
輸出結果是:
test input main arguments
hello world
end of main
是不是很簡單,趕快打開電腦實踐一下吧!
『貳』 Java在何處配置運行時的命令行參數
當你在Java命令行後面帶上參數,Java虛擬機就直接把他存放到了main方法中的參數String數組里了,你可以運行下下面這個小程序就明白!!
public class Test {
public static void main(String[] args)
{
System.out.println(args[0]);
System.out.println(args[1]);
System.out.println(args[2]);
}
}
用控制台編譯: javac Test.java
運行: java Test aaa bbb ccc
記得運行那一行代碼後面帶上三個參數~~~參數之間用空格隔開!
『叄』 java 中 如何通過命令行來傳遞參數
可以在命令行運行java程序時加上程序的參數。
例子如下:
public class HelloWorld{
public static void main(String args[]){
System.out.println("temp=" + args[0]);
}
}
源代碼截圖:
解釋一下: String[ ] args
該參數,是一個字元串數組,用來接收從命令行輸入的參數
1. 參數之間用空格隔開
2. java解釋器會自動處理,把用空格隔開的每一個參數通過args數組傳遞給買呢()方法。
3. 參數的下標從0開始,args[0]表示第一個參數,例如java HelloWorld 10 20 30
4.可以有多個空格,多個空格會被忽略。
(3)java執行參數擴展閱讀:
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程 。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平台獨立與可移植性、多線程、動態性等特點。Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等 。
『肆』 java調用參數是怎麼理解的
在方法調用時,需要根據方法聲明傳入適當的參數,通過每次調用方法時傳參,極大的增強
了方法的統一性,避免了方法內部功能代碼的重復。但是在實際傳遞參數時,如果在方法內部修改了
參數的值,則調用時使用的變數是否發生改變呢?
請看如下代碼:
public class TransferValueDemo
{
public static void main(String[] args)
{
int m = 10;
int[] a = {1,2,34};
test(m,a);
System.out.println(m);
System.out.println(a[0]);
}
public static void test(int n,int[] t)
{
n = 0;
t[0] = 123;
}
}
執行該程序以後,程序的輸出結果是:10 123。則在調用test方法時,同樣都是傳入參數,為
什麼變數m的值未改變,而a[0]的值發生了改變呢?下面就來說明該問題。
在參數傳遞時,一般存在兩種參數傳遞的規則,在Java語言中也是這樣,這兩種方式依次是:
按值傳遞(by value)
按值傳遞指每次傳遞參數時,把參數的原始數值拷貝一份新的,把新拷貝出來的數值傳遞到方法內部
,在方法內部修改時,則修改的時拷貝出來的值,而原始的值不發生改變。
說明:使用該方式傳遞的參數,參數原始的值不發生改變。
按址傳遞(by address)
按址傳遞指每次傳遞參數時,把參數在內存中的存儲地址傳遞到方法內部,在方法內部通過存儲地址
改變對應存儲區域的內容。由於在內存中固定地址的值只有一個,所以當方法內部修改了參數的值以
後,參數原始的值發生改變。
說明:使用該方式傳遞的參數,在方法內部修改參數的值時,參數原始的值也發生改變。
在Java語言中,對於那些數據類型是按值傳遞,那些數據類型是按址傳遞都作出了硬性規定,
如下所示:
按值傳遞的數據類型:八種基本數據類型和String(這樣理解可以,但是事實上String也是傳遞的地
址,只是string對象和其他對象是不同的,string對象是不能被改變的,內容改變就會產生新對象。
那麼StringBuffer就可以了,但只是改變其內容。不能改變外部變數所指向的內存地址。關於String
的特殊性見本博客的String類深入解析)。
按址傳遞的數據類型:除String以外的所有復合數據類型,包括數組、類和介面
按照這里的語法規則,則上面的代碼中變數m的類型是int,屬於按值傳遞,所以在方法內部修改參數
的值時m的值不發生改變,而a的類型是數組,屬於按址傳遞,所以在方法內部修改參數的值時,原始
的值發生了改變。
按值傳遞和按址傳遞在實際使用時,需要小心,特別是在方法內部需要修改參數的值時。有些時候,
對於按值傳遞的參數需要修改參數的值,或者按址傳遞時,不想修改參數的值,下面是實現這兩種方
式時的示例代碼。
按值傳遞時通過返回值修改參數的值:
public class TransferValueDemo1
{
public static void main(String[] args)
{
int m = 10;
m = test1(m); //手動賦值
System.out.println(m);
}
public static int test1(int n)
{
n = 15;
return n;
}
}
在該示例代碼中,通過把修改以後的參數n的值返回,來為變數m賦值,強制修改按值傳遞
參數的值,從而達到修正參數值的目的。
按址傳遞時通過重新生成變數避免修改參數的值:
public class TransferValueDemo2
{
public static void main(String[] args)
{
int[] a = {1,2,3};
test2(a);
System.out.println(a[0]);
}
public static void test2(int[] m)
{
int[] n = new int[m.length];
for(int i = 0;i < m.length;i++)
{
n[i] = m[i];
}
n[0] = 10;
}
}
在該示例代碼中,通過在方法內部創新創建一個數組,並且把傳入數組中每個參數的值都
賦值給新創建的數組,從而實現復制數組內容,然後再修改復制後數組中的值時,原來的參數內容就
不發生改變了。
這里系統介紹了Java語言中參數傳遞的規則,深刻理解這些規則將可以更加靈活的進行程
序設計。例如使用復合數據類型按址傳遞的特性可以很方便的實現多參數的返回,代碼示例如下:
public int test3(int[] m,int[] n){……}
則該方法中,實際上返回了三種值,一個int的返回值,數組m的值,數組n的值,這只是參
數傳遞的一種基本使用,在JDK提供的API文檔中也大量的存在該方法。
當是對象時,方法取得的是引用的。swap(obj a,obj b)
調用是swap(c,d),就是對象a,b的引用進行了復制。引用a和c都指向同一對象,引用b和d都指向同
一對象。如果Integer有setValue方法沒有問題,但可惜沒有,用int t=p.intValue能取得對象的
值,但還是不能交換。如果創建新對象,影響的只是c和d,不會影響a,b。
注意JAVA和VC的區別,JAVA沒有指針,因此在無論方法中的形參怎樣變化,方法外的實參不受影響。
(這句話也不完全對)
『伍』 java虛擬機的參數說明
一、運行class文件
執行帶main方法的class文件,Java虛擬機 命令參數行為:
java <CLASS文件名>
注意:CLASS文件名不要帶文件後綴.class
例如:
java Test
如果執行的class文件是帶包的,即在類文件中使用了:
package <;包名>
那應該在包的基路徑下執行,Java虛擬機命令行參數:
java <;包名>.CLASS文件名
例如:
PackageTest.java中,其包名為:com.ee2ee.test,對應的語句為:
package com.ee2ee.test;
PackageTest.java及編譯後的class文件PackageTest.class的存放目錄如下:
classes
|__com
|__ee2ee
|__test
|__PackageTest.java
|__PackageTest.class
要運行PackageTest.class,應在classes目錄下執行:
java com.ee2ee.test.PackageTest
二、運行jar文件中的class
原理和運行class文件一樣,只需加上參數-cp <jar文件名>;即可。
例如:執行test.jar中的類com.ee2ee.test.PackageTest,命令行如下:
java -cp test.jar com.ee2ee.test.PackageTest
三、顯示JDK版本信息
當一台機器上有多個jdk版本時,需要知道當前使用的是那個版本的jdk,使用參數-version即可知道其版本,命令行為:
java -version
四、增加虛擬機可以使用的最大內存
Java虛擬機可使用的最大內存是有限制的,預設值通常為64MB或128MB。
如果一個應用程序為了提高性能而把數據載入內存中而佔用較大的內存,比如超過了默認的最大值128MB,需要加大java虛擬機可使用的最大內存,否則會出現Out of Memory(系統內存不足)的異常。啟動java時,需要使用如下兩個參數:
-Xms java虛擬機初始化時使用的內存大小
-Xmx java虛擬機可以使用的最大內存
以上兩個命令行參數中設置的size,可以帶單位,例如:256m表示256MB
舉例說明:
java -Xms128m -Xmx256m ...
表示Java虛擬機初始化時使用的內存為128MB,可使用的最大內存為256MB。
對於tomcat,可以修改其腳本catalina. sh(Unix平台)或catalina.bat(Windows平台),設置變數JAVA_OPTS即可,例如:
JAVA_OPTS='-Xms128m -Xmx256m'
『陸』 求java命令行參數詳解
作用:
當你使用命令行的形式運行.class文件時,向你的類傳遞參數.
C:\>java YourClassName 參數1 [參數2 參數3 ....]
參數之間用一個空格作為間隔符.
String[] args 這個字元串數組是保存運行main函數時輸入的參數的,例如main函數所在的類名為test 那麼你在cmd運行 java test a b c 時,args[0] = a ,args[1]=b, args[2]=c 你就可以在你的程序中調用你輸入的這些變數了。
args[]不就是那個字元串This is a simple Java program嗎?
-------完全不是的,你理解不對。這樣好了,你在運行的時候加個參數,比如 java test XX。然後在你的main函數裡面加這段話:System.out.println("arg is"+args[0]),然後看看輸出是什麼?
是不是這個:
This is a simple Java program
arg is XX
在運行時輸入java test xx yy zz,並且在你的main函數裡面加這段話:System.out.println("arg is"+args[0]+" "+args[1]+" "+args[2]),然後看看輸出是什麼?
是不是:
This is a simple Java program
arg is xx yy zz
現在你理解了嗎。。。
如果沒關系,為什麼程序中去掉String args[]會出現錯誤?
--------之所以去掉會出錯在於,不帶String args[]的main函數和帶String args[]的main函數,本質上已經不是同一個函數了,java 本身不存在不帶String args[]的main函數,所以當然出錯了。
另外,虛機團上產品團購,超級便宜
『柒』 Java 的命令行 編譯和運行參數 如:-cp 怎麼理解
javac
用法:javac <選項> <源文件>
其中,可能的選項包括:
-g 生成所有調試信息
-g:none 不生成任何調試信息
-g:{lines,vars,source} 只生成某些調試信息
-nowarn 不生成任何警告
-verbose 輸出有關編譯器正在執行的操作的消息
-deprecation 輸出使用已過時的 API 的源位置
-classpath <路徑> 指定查找用戶類文件的位置
-cp <路徑> 指定查找用戶類文件的位置
-sourcepath <路徑> 指定查找輸入源文件的位置
-bootclasspath <路徑> 覆蓋引導類文件的位置
-extdirs <目錄> 覆蓋安裝的擴展目錄的位置
-endorseddirs <目錄> 覆蓋簽名的標准路徑的位置
-d <目錄> 指定存放生成的類文件的位置
使用-d參數,如類中定義了包,則編譯時會自動生成包, 如:javac -d . helloworld.java
表示在當前目錄下編譯Helloworld 類。.表示當前目錄,如helloword中定義有包,則在當前目錄下生成包:
-encoding <編碼> 指定源文件使用的字元編碼
-source <版本> 提供與指定版本的源兼容性
-target <版本> 生成特定 VM 版本的類文件
-version 版本信息
-help 輸出標准選項的提要
-X 輸出非標准選項的提要
-J<標志> 直接將 <標志> 傳遞給運行時系統
java
用法: java [-選項] 類 [參數...]
(執行一個類)
或者 java [-選項] -jar jar文件 [參數...]
(執行一個jar文件)
其中,可能的選項包括:
-client 選擇 "client" VM(ginger547:應該是指Virtual Machine)
-server 選擇 "server" VM
-hotspot 與 "client" VM同義 [不贊成]
默認情況的VM是client.
-cp <一個文件夾和zip/jar文件組成的類搜索路徑>
-classpath <一個文件夾和zip/jar文件組成的類搜索路徑>
一個由文件夾,JAR壓縮文件,或者ZIP壓縮文件組成的用來搜索類的列表
-D<名字>=<值>
設置一個系統屬性
-verbose[:class|gc|jni]
使詳細輸出變的可用
-version 列印產品版本然後退出
-version:<值>
只運行指定版本
-showversion 列印產品版本後繼續
-jre-restrict-search | -jre-no-restrict-search
在版本搜索的時候,包含/排除用戶私人的JRE
-? -help 列印幫助信息
-X 列印非標准選項幫助
-ea[:<包名>...|:<類名>]
-enableassertions[:<包名>...|:<類名>]
使斷言可用
-da[:<包名>...|:<類名>]
-disableassertions[:<包名>...|:<類名>]
是斷言不可用
-esa | -enablesystemassertions
使系統級斷言可用
-dsa | -disablesystemassertions
使系統級斷言不可用
-agentlib:<庫名>[=<選項>]
載入本地代理庫<庫名>,例如. -agentlib:hprof
同時可查看, -agentlib:jdwp=help和 -agentlib:hprof=help
-agentpath:<路徑名>[=<選項>]
通過全路徑名來載入本地代理庫
-javaagent:<jar路徑>[=<選項>]
載入Java編程語言代理,可查看 java.lang.instrument
『捌』 如何在Java程序運行時傳遞參數呢(1
代表運行是傳入的參數,
main(String[] args){
System.out.print("args[0] = " + args[0]);
}
如果運行的時候,假設程序名是testMain.java
然後輸入 java testMain hello;
輸出的就是args[0] = hello;
『玖』 怎樣在java類中調用帶參數的可執行文件(比如:.exe,.sh等等)
比如調用exe程序"java -version":
String[] cmd = new String[] {"java", "-version"};
Process process = Runtime.getRuntime().exec(cmd);
BufferedReader r = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String l = null;
while((l = r.readLine()) != null) {
System.out.println(l);
}
Process有兩個流可以讀取外部程序的標准輸出(就是運行結果啦),一個是getInputStream,一個是getErrorStream。
如果要調用C或C++動態鏈接庫中的函數的話,就要復雜一些,要用到JNI了。
『拾』 關於java命令行參數的問題
看起來好像是你對 命令行參數 的理解有錯誤。
命令行 Java Tail filename [10]
的意思是:java執行名叫Tail的.class文件,並傳入參數為filename和[10]
所以你在主函數main()方法里,if條件,只有判斷args[0]和args[1]。
==========================
你如果還不知道的話,你可以調試一下,列印出傳入的所有參數。
在main()方法的第一行寫:
if(args != null){
for(int i=0;i<args.length;i++){
system.out.printIn(args[i]);
}
}