Java笔记:与系统交互、系统相关的类,Object类
1.程序與用戶交互
(1)運(yùn)行一個(gè)Java程序的時(shí)候要給它提供一個(gè)main方法入口,這邊分析一下這個(gè)main方法的簽名
public static void main(String[] args);
public修飾符:因?yàn)镴ava類給JVM調(diào)用的,所以要使用public修飾符暴露這個(gè)方法
static修飾符:JVM調(diào)用主方法的時(shí)候不會(huì)先創(chuàng)建該主類的對(duì)象,而是直接通過該類來調(diào)用主方法的,所以使用static修飾。
void返回值:因?yàn)橹鞣椒ㄊ荍VM調(diào)用的,所以該方法的返回值返回給JVM沒有任何意義。
字符串?dāng)?shù)組形參:根據(jù)方法調(diào)用的規(guī)則,誰調(diào)用該方法,誰負(fù)責(zé)為形參賦值。所以是JVM賦值的,那到底是賦什么值呢,可以看下面一個(gè)例子
上面程序只是輸出一個(gè)0,這說明args數(shù)組是一個(gè)長度為0的空數(shù)組。
而如果改成用命令來運(yùn)行該程序
java ArgsTest aa bb
將輸出
運(yùn)行Java程序時(shí)在類名后緊跟一個(gè)或多個(gè)字符串,多個(gè)字符串之間用空格隔開,JVM就會(huì)把這些字符串依次賦值給args元素
如果一個(gè)參數(shù)本身包含空格,則這個(gè)參數(shù)應(yīng)該用雙引號(hào)括起來
(2)使用Scanner獲取鍵盤輸入
使用Scanner類可以很方便地獲取用戶的鍵盤輸入
Scanner主要提供了兩個(gè)方法用來掃描輸入
1)hasNextXxx():是否還有下一個(gè)輸入項(xiàng),其中Xxx可以是Int、Long等代表基本數(shù)據(jù)類型的字符串。如果需要判斷是否包含下一個(gè)字符串,則可以省略Xxx。
2)nextXxx():獲取下一個(gè)輸入項(xiàng)。Xxx的含義與前一個(gè)方法中的Xxx相同。
默認(rèn)情況下,Scanner使用空白作為多個(gè)輸入項(xiàng)之間的分隔符。如果希望改變Scanner的分隔符(不適用空白作為分隔符),
例如程序需要每次讀取一行,不管這一行中是否包含空格,Scanner都把它當(dāng)成一個(gè)輸入項(xiàng)。這是可以使用sc.useDelimiter("\n");把Scanner的分隔符設(shè)置成回車符。
獲取基本類型類型的輸入項(xiàng)
?
package cn.lsl;import java.util.Scanner;public class ScannerLongDemo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNextLong()){System.out.println("鍵盤輸入內(nèi)容為:" + sc.nextLong());}} }?
Scanner提供兩個(gè)簡單的方法來逐行讀取
boolean hasNextLine():返回輸入源中是否還有下一行
String nextLine():返回輸入源中下一行的字符串
使用BufferedReader獲取鍵盤輸入
1)BufferedReader是Java IO流中一個(gè)字符、包裝流,它必須建立在另一個(gè)字符流的基礎(chǔ)之上。但標(biāo)準(zhǔn)輸入:System.in是字節(jié)流,程序需要使用轉(zhuǎn)換流InputStreamReader將其包裝成字符流。
2)獲取了BufferedReader對(duì)象之后,可以調(diào)用該對(duì)象的readLine()方法來逐行讀取鍵盤輸入,每次用戶的鍵盤輸入都被BufferedReader當(dāng)成String對(duì)象。與Scanner不同的是,BufferedReader不能讀取基本類型輸入項(xiàng),它總是讀取String對(duì)象。
?
package cn.lsl;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class BufferReaderDemo {public static void main(String[] args) throws IOException {// TODO Auto-generated method stubBufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while((line = br.readLine())!=null){System.out.println("鍵盤輸入的是:" + line);}} }?
2.System類
System類代表當(dāng)前Java程序的運(yùn)行平臺(tái),程序不能創(chuàng)建System類的對(duì)象。
一些方法:
getenv :
public static Map<String,String> getenv(),返回一個(gè)不能修改的當(dāng)前系統(tǒng)環(huán)境的字符串映射視圖
public static String getenv(String name),獲取指定的環(huán)境變量值
public static Properties getProperties(),確定當(dāng)前的系統(tǒng)屬性
public static String getProperty(String key),獲取指定鍵指示的系統(tǒng)屬性
?
package cn.lsl;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import java.util.Properties;public class SystemTest {public static void main(String[] args) throws FileNotFoundException, IOException {//獲取系統(tǒng)的所有環(huán)境變量Map<String, String> env = System.getenv();for(String name : env.keySet()){System.out.println(name + "----->" + env.get(name));}System.out.println("-------------------------");//獲取指定環(huán)境變量的值System.out.println(System.getenv("JAVA_HOME"));System.out.println("-------------------------");//獲取所有的系統(tǒng)屬性Properties props = System.getProperties();//將所有系統(tǒng)屬性保存到props.txt文件中props.store(new FileOutputStream("props.txt"), "System Properties");System.out.println(System.getProperty("os.name"));} }?
上面程序通過System類的getenv()、getProperties()、getProperty等方法來訪問程序所在平臺(tái)的環(huán)境變量和系統(tǒng)屬性。
public static int identityHashCode(Object x),該方法返回指定對(duì)象的精確hashCode值,也就是根據(jù)該對(duì)象的地址計(jì)算得到hashCode值。當(dāng)某個(gè)類的hashCode()方法被重寫以后,該類實(shí)例的hashCode()方法就不能唯一標(biāo)識(shí)該對(duì)象,但是通過identityHashCode(Object x)方法返回的hashCode值,依然是根據(jù)該對(duì)象的地址計(jì)算得到的hashCode值。所以,兩個(gè)對(duì)象的identityHashCode值相同,則兩個(gè)對(duì)象絕對(duì)是同一個(gè)對(duì)象。
?
package cn.lsl;public class IdentityHashCodeTest {public static void main(String[] args) {String s1 = new String("Hello");String s2 = new String("Hello");System.out.println(s1.hashCode() + "----" + s2.hashCode());System.out.println(System.identityHashCode(s1) + "------" + System.identityHashCode(s2));String s3 = "java";String s4 = "java";System.out.println(System.identityHashCode(s3) + "------" + System.identityHashCode(s4));} }?
3.Runtime類
Runtime類代表Java程序的運(yùn)行環(huán)境,每個(gè)Java程序都有一個(gè)與之對(duì)應(yīng)的Runtime實(shí)例,應(yīng)用程序通過該對(duì)象與其運(yùn)行時(shí)環(huán)境相連。應(yīng)用程序不能創(chuàng)建自己的Runtime實(shí)例,但可以通過getRuntime()方法獲取與之關(guān)聯(lián)的Runtime對(duì)象。
Runtime類代表Java程序的運(yùn)行時(shí)環(huán)境,可以訪問JVM的相關(guān)信息,如處理器數(shù)量,內(nèi)存信息等
Runtime類還可以直接單獨(dú)啟動(dòng)一個(gè)進(jìn)程來運(yùn)行操作系統(tǒng)的命令。
package cn.lsl;import java.io.IOException;public class ExecTest {public static void main(String[] args) throws IOException {Runtime rt = Runtime.getRuntime();rt.exec("notepad.exe");} }4.Object類
(1)Object類是所有類的父類,Java允許把任何類型的對(duì)象賦值給Object類型的變量。定義一個(gè)類的時(shí)候沒有使用extends關(guān)鍵字顯示指定他的父類,則該類默認(rèn)繼承Object父類。
(2)Java中提供一個(gè)protected修飾的clone()方法,該方法用于實(shí)現(xiàn)“克隆”,就是得到一個(gè)當(dāng)前對(duì)象的副本,而且二者之間完全隔離。由于Object類提供的clone()方法使用了protected修飾,因此該方法只能被子類重寫或調(diào)用。
自定義類實(shí)現(xiàn)克隆的步驟:
1.自定義類實(shí)現(xiàn)Cloneable接口。這是一個(gè)標(biāo)記性的接口,接口里面沒有定義任何方法。
2.自定義類實(shí)現(xiàn)自己clone()方法。
3.實(shí)現(xiàn)clone()方法時(shí)通過調(diào)用super.clone();調(diào)用Object實(shí)現(xiàn)clone()方法來得到該對(duì)象的副本,并返回該副本。
?
package cn.lsl;class Address{String detail;public Address(String detail){this.detail = detail;} }class User implements Cloneable{int age;Address address;public User(int age){this.age = age;address = new Address("福建");}public User clone() throws CloneNotSupportedException{return (User) super.clone();} } public class CloneTest {public static void main(String[] args) throws CloneNotSupportedException {User u1 = new User(20);User u2 = u1.clone();System.out.println(u1 == u2);System.out.println(u1.address == u2.address);} }對(duì)象實(shí)現(xiàn)“克隆”的時(shí)候,克隆出來的對(duì)象是原對(duì)象的副本,所以System.out.println(u1 == u2);返回的是false;
Object類提供的Clone機(jī)制只對(duì)對(duì)象里各實(shí)例變量進(jìn)行“簡單復(fù)制”,如果實(shí)例變量的類型是引用類型,Clone機(jī)制也只是簡單點(diǎn)的復(fù)制這個(gè)引用變量,這樣原有對(duì)象的引用類型的實(shí)例與克隆對(duì)象的引用類型的實(shí)例變量依然指向內(nèi)存中同一個(gè)實(shí)例,即System.out.println(u1.address == u2.address);返回true
(Object類的clone()方法只克隆該對(duì)象的所有Field值,不會(huì)對(duì)引用類型的Field所引用的對(duì)象進(jìn)行克隆)
5.Objects類(Java 7 新增的)
Java 7 新增的Objects工具類,它提供了一些工具方法來操作對(duì)象,這些工具方法大多是“空指針”安全的。
requireNonNull()方法,傳入?yún)?shù)不為null時(shí),該方法返回參數(shù)本身;否則將引起空指針異常,該方法主要用來對(duì)方法形參進(jìn)行輸出校驗(yàn),
例如:
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/EvanLiu/p/3146989.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Java笔记:与系统交互、系统相关的类,Object类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django之URL路由系统
- 下一篇: 谋定重整衍生新360行-李玉庭:协同电商