介绍
变量被命名为内存位置。它们的值保存在内存中,我们通常记不起来,因为它们对人类不友好,而且会四处移动。不过,如果我们命名内存位置,比如 a ,就更容易记住。
环境变量与通常的编程变量非常相似,只是它们被设置在程序之外的某个地方。它可以被操作系统、JVM、我们的程序正在使用的微服务等使用。
变量分类: 局部变量在使用前必须先声明、初始化(赋初值)再使用。 类变量:
使用static定义。从属于类,生命周期伴随类始终,从类加载到卸载。如果不自行初始化,与成员变量相同会自动初始化成该类型的默认初始值。
int String = 1;
常量
final关键字的作用
-
修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。 -
修饰方法:该方法 不可被子类重写。但是可以被重载 ! -
修饰类: 修饰的类 不能被继承 。比如:Math、String等。
成员变量不一定要赋初始值。可以再外面声明,在构造方法中赋值,也不会错。【领取资料】
面试题:
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 使用final关键字修饰一个变量时,是指引用变量不能变(作用在变量上),引用变量所指向的对象中的内容还是可以改变的 。
例如,对于如下语句:
c finalStringBuffer a=newStringBuffer("immutable");
执行如下语句将报告编译期错误:
c a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
c a.append("broken!");
final, finally, finalize 的区别?
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。内部类(这里的内部类指的是方法内部类或匿名内部类,不包含静态内部类和成员内部类 在Java8 中,被局部内部类引用的局部变量,默认添加final,所以不需要添加final关键词)要访问局部变量,局部变量必须定义成final类型。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。但是JVM不保证此方法总被调用。
查询环境变量
操作系统将其环境变量存储为键/值对。你可以用 System.getenv() 检索这些值。如果不带参数使用它,则会得到一个Map 对象作为返回值:
Map<String, String> env = System.getenv();
for(String envName : env.keySet()){
System.out.println(String.format("%s : %s", envName, env.get(envName)));
}
以下是结果的截断视图:
PROCESSOR_ARCHITECTURE : AMD64
MIC_LD_LIBRARY_PATH : C:\Program Files (x86)\Common Files\Intel\Shared Libraries\compiler\lib\mic
PSModulePath : C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\
SystemDrive : C:
AWE_DIR : D:\Awesomium\1.6.6\
FPS_BROWSER_USER_PROFILE_STRING : Default
PATHEXT : .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
DriverData : C:\Windows\System32\Drivers\DriverData
HerokuPath : E:\Heroku
ProgramData : C:\ProgramData
ProgramW6432 : C:\Program Files
还可以向它传递一个与变量名称(键)对应的字符串,它将以字符串形式返回相应变量的值:
System.out.println(System.getenv("NUMBER_OF_PROCESSORS"));
8
ProcessBuilder和环境
Java有一个处理操作系统进程的进程类。为了简化流程的创建,这里有一个ProcessBuilder 类,您可以简单地将命令“添加”到它的实例中运行。
每个进程都可以有自己的环境。程序的环境将由操作系统设置,但作为进程启动的程序可以有一个修改过的“手工”环境。
要编辑环境,必须使用environment() 的getter 从ProcessBuilder 对象获取其引用。就像从系统中读取环境变量一样,您将得到一个映射,然后可以使用通常的映射操作对其进行修改。
创建环境后,我们将创建一个命令。这取决于操作系统。在这里,我们有一个基本的检查,它充分地改变了命令:
ProcessBuilder processBuilder = new ProcessBuilder();
Map<String, String> env = processBuilder.environment();
env.put("PING_WEBSITE", "stackabuse.com");
if (System.getProperty("os.name").startsWith("Windows")) {
processBuilder.command("cmd.exe", "/c", "ping -n 3 %PING_WEBSITE%")
} else {
processBuilder.command("/bin/bash", "-c", "ping $PING_WEBSITE$");
}
try {
Process process = processBuilder.start();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
int ret = process.waitFor();
System.out.printf("Program exited with code: %d", ret);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
Pinging stackabuse.com [172.67.218.223] with 32 bytes of data:
Reply from 172.67.218.223: bytes=32 time=12ms TTL=57
Reply from 172.67.218.223: bytes=32 time=12ms TTL=57
Reply from 172.67.218.223: bytes=32 time=15ms TTL=57
Ping statistics for 172.67.218.223:
Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 12ms, Maximum = 15ms, Average = 13ms
Program exited with code: 0
Process finished with exit code 0
我们创建了一个新的环境变量,名为PING_WEBSITE ,具有固定值。您可以修改此程序,将 PING_WEBSITE 的值设置为用户输入、命令行参数或从文件中读取值。
最后,感谢大家的观看,谢谢大家的支持,能三连最好啦!希望大家都早日升职加薪,飞黄腾达!
|