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]);
}
}