Java笔记:与系统交互、系统相关的类,Object类
1.程序與用戶交互
(1)運行一個Java程序的時候要給它提供一個main方法入口,這邊分析一下這個main方法的簽名
public static void main(String[] args);
public修飾符:因為Java類給JVM調用的,所以要使用public修飾符暴露這個方法
static修飾符:JVM調用主方法的時候不會先創建該主類的對象,而是直接通過該類來調用主方法的,所以使用static修飾。
void返回值:因為主方法是JVM調用的,所以該方法的返回值返回給JVM沒有任何意義。
字符串數組形參:根據方法調用的規則,誰調用該方法,誰負責為形參賦值。所以是JVM賦值的,那到底是賦什么值呢,可以看下面一個例子
上面程序只是輸出一個0,這說明args數組是一個長度為0的空數組。
而如果改成用命令來運行該程序
java ArgsTest aa bb
將輸出
運行Java程序時在類名后緊跟一個或多個字符串,多個字符串之間用空格隔開,JVM就會把這些字符串依次賦值給args元素
如果一個參數本身包含空格,則這個參數應該用雙引號括起來
(2)使用Scanner獲取鍵盤輸入
使用Scanner類可以很方便地獲取用戶的鍵盤輸入
Scanner主要提供了兩個方法用來掃描輸入
1)hasNextXxx():是否還有下一個輸入項,其中Xxx可以是Int、Long等代表基本數據類型的字符串。如果需要判斷是否包含下一個字符串,則可以省略Xxx。
2)nextXxx():獲取下一個輸入項。Xxx的含義與前一個方法中的Xxx相同。
默認情況下,Scanner使用空白作為多個輸入項之間的分隔符。如果希望改變Scanner的分隔符(不適用空白作為分隔符),
例如程序需要每次讀取一行,不管這一行中是否包含空格,Scanner都把它當成一個輸入項。這是可以使用sc.useDelimiter("\n");把Scanner的分隔符設置成回車符。
獲取基本類型類型的輸入項
?
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("鍵盤輸入內容為:" + sc.nextLong());}} }?
Scanner提供兩個簡單的方法來逐行讀取
boolean hasNextLine():返回輸入源中是否還有下一行
String nextLine():返回輸入源中下一行的字符串
使用BufferedReader獲取鍵盤輸入
1)BufferedReader是Java IO流中一個字符、包裝流,它必須建立在另一個字符流的基礎之上。但標準輸入:System.in是字節流,程序需要使用轉換流InputStreamReader將其包裝成字符流。
2)獲取了BufferedReader對象之后,可以調用該對象的readLine()方法來逐行讀取鍵盤輸入,每次用戶的鍵盤輸入都被BufferedReader當成String對象。與Scanner不同的是,BufferedReader不能讀取基本類型輸入項,它總是讀取String對象。
?
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類代表當前Java程序的運行平臺,程序不能創建System類的對象。
一些方法:
getenv :
public static Map<String,String> getenv(),返回一個不能修改的當前系統環境的字符串映射視圖
public static String getenv(String name),獲取指定的環境變量值
public static Properties getProperties(),確定當前的系統屬性
public static String getProperty(String key),獲取指定鍵指示的系統屬性
?
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 {//獲取系統的所有環境變量Map<String, String> env = System.getenv();for(String name : env.keySet()){System.out.println(name + "----->" + env.get(name));}System.out.println("-------------------------");//獲取指定環境變量的值System.out.println(System.getenv("JAVA_HOME"));System.out.println("-------------------------");//獲取所有的系統屬性Properties props = System.getProperties();//將所有系統屬性保存到props.txt文件中props.store(new FileOutputStream("props.txt"), "System Properties");System.out.println(System.getProperty("os.name"));} }?
上面程序通過System類的getenv()、getProperties()、getProperty等方法來訪問程序所在平臺的環境變量和系統屬性。
public static int identityHashCode(Object x),該方法返回指定對象的精確hashCode值,也就是根據該對象的地址計算得到hashCode值。當某個類的hashCode()方法被重寫以后,該類實例的hashCode()方法就不能唯一標識該對象,但是通過identityHashCode(Object x)方法返回的hashCode值,依然是根據該對象的地址計算得到的hashCode值。所以,兩個對象的identityHashCode值相同,則兩個對象絕對是同一個對象。
?
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程序的運行環境,每個Java程序都有一個與之對應的Runtime實例,應用程序通過該對象與其運行時環境相連。應用程序不能創建自己的Runtime實例,但可以通過getRuntime()方法獲取與之關聯的Runtime對象。
Runtime類代表Java程序的運行時環境,可以訪問JVM的相關信息,如處理器數量,內存信息等
Runtime類還可以直接單獨啟動一個進程來運行操作系統的命令。
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允許把任何類型的對象賦值給Object類型的變量。定義一個類的時候沒有使用extends關鍵字顯示指定他的父類,則該類默認繼承Object父類。
(2)Java中提供一個protected修飾的clone()方法,該方法用于實現“克隆”,就是得到一個當前對象的副本,而且二者之間完全隔離。由于Object類提供的clone()方法使用了protected修飾,因此該方法只能被子類重寫或調用。
自定義類實現克隆的步驟:
1.自定義類實現Cloneable接口。這是一個標記性的接口,接口里面沒有定義任何方法。
2.自定義類實現自己clone()方法。
3.實現clone()方法時通過調用super.clone();調用Object實現clone()方法來得到該對象的副本,并返回該副本。
?
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);} }對象實現“克隆”的時候,克隆出來的對象是原對象的副本,所以System.out.println(u1 == u2);返回的是false;
Object類提供的Clone機制只對對象里各實例變量進行“簡單復制”,如果實例變量的類型是引用類型,Clone機制也只是簡單點的復制這個引用變量,這樣原有對象的引用類型的實例與克隆對象的引用類型的實例變量依然指向內存中同一個實例,即System.out.println(u1.address == u2.address);返回true
(Object類的clone()方法只克隆該對象的所有Field值,不會對引用類型的Field所引用的對象進行克隆)
5.Objects類(Java 7 新增的)
Java 7 新增的Objects工具類,它提供了一些工具方法來操作對象,這些工具方法大多是“空指針”安全的。
requireNonNull()方法,傳入參數不為null時,該方法返回參數本身;否則將引起空指針異常,該方法主要用來對方法形參進行輸出校驗,
例如:
?
?
?
轉載于:https://www.cnblogs.com/EvanLiu/p/3146989.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Java笔记:与系统交互、系统相关的类,Object类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django之URL路由系统
- 下一篇: 二年级的数学题,10个人有9个人做错,你