Linux驅動之GPIO子系統和pinctrl子系統
Java常用類
內部類
內部類大體分為四種:
- 成員內部類
- 靜態內部類
- 區域性內部類
- 匿名內部類
成員內部類
//外部類 public class Outer{ private String name = "張三"; //... public class Inner{ //成員內部類 private String name = "李四"; //private static int age = 18;//不被允許 private static final int age = 18;//靜態常量,允許 public void show(){ System.out.println(Outer.this.name); } //... } }
- 成員內部類可以訪問外部類的私有屬性
- 如果成員內部類的屬性和外部類的屬性重名,但是想要使用外部類的屬性的時候可以使用“外部類類名.this.屬性名”。eg:Outer.this.name
- 成員內部類不能定義靜態成員
- 可以包含靜態常量
關於如何建立內部類物件:
Outer out = new Outer();
Inner in = out.new Inner();
- 內部類物件的建立必須依賴外部類物件
靜態內部類
public class Outer{ private String name = "張三"; private int age = 20; //靜態內部類,和外部類相同 public static class Inner{ private String address = "地球"; private static int age = 18;//靜態成員是允許的 public void show(){ //呼叫外部類屬性 Outer outer = new Outer(); System.out,println(outer.name); System.out,println(outer.age); //呼叫內部類屬性 System.out,println(address); //呼叫靜態屬性 System.out,println(Inner.age); } } }
關於靜態內部類呼叫外部類屬性:
- 先建立外部類物件
- 呼叫內部類物件的屬性
直接建立靜態內部類物件
Outer.Inner in = new Outer.Inner();
區域性內部類
定義在外部類的方法中,作用範圍和建立物件僅限於當前方法。
public class Outer { private String name = "張三"; private int age = 18; public void show(){ String address = "上海"; //區域性內部類:不能加任何訪問修飾符 class Inner{ private String phone = "121321-123"; private String email = "[email protected]"; public void show1(){ //訪問外部類屬性 System.out.println(Outer.this.name); System.out.println(age); //訪問內部類屬性 System.out.println(this.phone); System.out.println(email); //訪問區域性變數,jdk1.7,變數必須加final,jdk1.8自動新增fianl System.out.println(address); } } //建立區域性內部類物件 Inner in = new Inner(); in.show1(); } }
-
建立區域性內部類物件需要在方法體內建立,進而使用。
-
訪問區域性變數的時候,jdk1.7中變數必須加final,jdk1.8自動新增fianl
匿名內部類
- 類似於沒有類名的區域性內部類
- 必須繼承一個父類或實現一個介面
//介面Usb
public interface Usb{
void service();
}
//Test類
public class Application {
public static void main(String[] args) {
//匿名內部類
Usb usb = new Usb(){
@Override
public void service(){
System.out.println("風扇開始工作...");
}
}
usb.service();
}
}
Object類
- 超類、基類,所有類的直接或者間接父類,繼承樹的最頂層
- 任何類如果沒有extends某個類,都是直接繼承Object類,否則就是間接繼承Object類
- Object類中所定義的方法,是所有物件都具備的方法
- Object型別可以儲存任何物件
getClass()方法
示例程式碼:
package com.huaji.demo3;
public class Person {
public int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
package com.huaji;
import com.huaji.demo3.Person;
public class Application {
public static void main(String[] args) {
Person p = new Person(1,"huaji");
System.out.println(p.getClass());
System.out.println(p.getClass().getName());
System.out.println(p.getClass().getSimpleName());
System.out.println(p.id);
}
}
執行結果:
class com.huaji.demo3.Person
com.huaji.demo3.Person
Person
1
- getClass()方法是獲得呼叫該方法的物件的類;getClass().getName()可以得到該類的路徑;
- 通過getClass()方法得到該物件類Class後,可以通過Class獲取這個類中的相關屬性和方法;
hashCode()方法
- public int hashCode(){}
- 返回該物件的雜湊碼值
- 雜湊值是根據物件的地址或字串或字串使用hash演算法計算出來的int型別的數值
- 一般情況下相同的物件返回相同雜湊碼
public class Application {
public static void main(String[] args) {
Person p = new Person(1,"huaji");
System.out.println(p.hashCode());
}
}
356573597
toString()方法
- public String toString(){}
- 返回該物件的字串表示
- 可以根據需求覆蓋此方法
equals()方法
-
public boolean equals(Object obj){}
-
預設實現為(this==obj),比較兩個物件地址是否相同
-
可進行覆蓋,比較兩物件內容是否相同
關於重寫equals為比較倆物件內容是否相同:
public class Student{
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
@Override
public boolean equals(Object obj) {
//1.判斷兩物件是否是同一個引用
if (this==obj){
return true;
}
//2.判斷obj是否null
if (obj==null){
return false;
}
//3.判斷是否是同一型別
if (obj instanceof Student){
//4.強制型別轉換
Student s = (Student)obj;
//5.判斷屬性是否相等
if (this.name.equals(s.getName()))
return true;
}
return false;
}
}
finalize()方法
-
protected void finalize() throws Throwable { }
-
當物件被判定為垃圾物件時,由JVM自動呼叫此方法,用以標記垃圾物件,進入回收佇列
-
垃圾物件:沒有有效引用指向此物件時,為垃圾物件
-
垃圾回收:由GC銷燬垃圾物件,釋放資料儲存空間(Garbage Collection,垃圾收集,垃圾回收)
-
自動回收機制:JVM的記憶體耗盡,一次性回收所有垃圾物件
-
手動回收機制:使用System.gc();通知JVM執行垃圾回收
使用情況:
finalize()方法中一般用於釋放非Java 資源(如開啟的檔案資源、資料庫連線等),或是呼叫非Java方法(native方法)時分配的記憶體(比如C語言的malloc()系列函式)。
為什麼避免使用:
首先,由於finalize()方法的呼叫時機具有不確定性,從一個物件變得不可到達開始,到finalize()方法被執行,所花費的時間這段時間是任意長的。我們並不能依賴finalize()方法能及時的回收佔用的資源,可能出現的情況是在我們耗盡資源之前,gc卻仍未觸發,因而通常的做法是提供顯示的close()方法供客戶端手動呼叫。
另外,重寫finalize()方法意味著延長了回收物件時需要進行更多的操作,從而延長了物件回收的時間。
包裝類
- 基本資料型別所對應的引用資料型別。eg:int->Integer,byte->Byte,float->Float.....
- Object可統一所有資料,包裝類的預設值是null
型別轉換
裝箱
基本型別轉換成引用型別的過程
int num=10;
//使用Integer類建立物件
Integer integer=new Integer(num);//方法一
Integer integer1=Integer.valueOf(num);//方法二
拆箱
引用型別換成基本型別轉的過程
Integer integer=new Integer(100);
int num=Integer.intValue();//jdk1.5之前的方式
jkd1.5以後,Java提供自動裝箱拆箱
int age=10;
//自動裝箱
Integer integer=age;
//自動拆箱
int age1=integer;
基本型別和字串之間轉換
基礎型別轉換成字串的過程
int n=100;
//1.使用+
String s1=n+"";
//2.使用Integer的toString()方法
String s2=Integer.toString(n);
字串轉換成基礎型別的過程
String str="150";
//使用Integer。parseXXX()
int n=Integer.parseInt(str);
String 類
- String物件的值儲存在字串常量池中,常量池位於堆記憶體中
- 字串的比較中,“==“表示的是對地址的比較,equals的話,先比較引用,如果引用相等,返回值為true,如果引用不相等,再比較值,如果值相等,返回值也是true,只有當引用和值都不相等的情況下,返回的才是false。
- new的話會在堆中建立一個物件,一個new對應一個物件
String s1=new String("張三");
String s2=new String("張三");
System.out.println(s1==s2);//false,由於==比較的是地址,儘管內容都是“張三”,但是s1和s2在棧中對應不同的地址
String s3="張三";
String s4="張三";
System.out.println(s3==s4);//true,s1指向字串常量池中的“張三”,s4也指向字串常量池中的“張三”,所以它兩地址相同
String 常用方法
- int length(); 語法:字串變數名.length(); 返回值為 int 型別。得到一個字串的字元個數(中、英、空格、轉義字元皆為字元,計入長度)
- char charAt(值); 語法 :字串名.charAt(值); 返回值為 char 型別。從字串中取出指定位置的字元
- char toCharArray(); 語法 :字串名.toCharArray(); 返回值為 char 陣列型別。將字串變成一個字元陣列
- int indexOf("字元") 語法 :字串名.indexOf("字元");字串名.indexOf("字元",值);查詢一個指定的字串是否存在,返回的是字串的位置,如果不存在,則返回-1 。 in lastIndexOf("字元") 得到指定內容最後一次出現的下標
- toUpperCase(); toLowerCase();字串大小寫的轉換
- String[] split("字元") 根據給定的正則表示式的匹配來拆分此字串。形成一個新的String陣列。
- boolean equals(Object anObject) 語法 :字串變數名.wquals(字串變數名); 返回值為布林型別。所以這裡用 if 演示。比較兩個字串是否相等,返回布林值
- trim(); 去掉字串左右空格 replace(char oldChar,char newChar);新字元替換舊字元,也可以達到去空格的效果一種。
- String substring(int beginIndex,int endIndex) 擷取字串,beginIndex表示索引開始的位置,endIndex表示索引結束的位置
- boolean equalsIgnoreCase(String) 忽略大小寫的比較兩個字串的值是否一模一樣,返回一個布林值
- boolean contains(String) 判斷一個字串裡面是否包含指定的內容,返回一個布林值
- boolean startsWith(String) 測試此字串是否以指定的字首開始。返回一個布林值
- boolean endsWith(String) 測試此字串是否以指定的字尾結束。返回一個布林值
- String replaceAll(String,String) 將某個內容全部替換成指定內容,String repalceFirst(String,String) 將第一次出現的某個內容替換成指定的內容
StringBuffer類和StringBuilder類
- StringBuffer:可變長字串,jkd1.0提供,執行效率慢、執行緒安全
- StringBuilder:可變長字串,jkd1.5提供,執行效率快、執行緒不安全
- 都比String效率高、節省記憶體
StringBuffer sb=new StringBuffer();
//StringBuild sb=new StringBuild();
//1.append();追加
sb.append("java世界第一");
System.out.println(sb.toString());
sb.append("java真香");
System.out.println(sb.toString());
sb.append("java太香啦");
System.out.println(sb.toString());
//2.insert();新增
sb.insert(0,"我在最前面");
System.out.println(sb.toString());
//3.replace();替換
sb.replace(0,5,"hello");
System.out.println(sb.toString());
//4.delete();刪除
sb.delete(0,5);
System.out.println(sb.toString());
執行結果:
java世界第一
java世界第一java真香
java世界第一java真香java太香啦
我在最前面java世界第一java真香java太香啦
hellojava世界第一java真香java太香啦
java世界第一java真香java太香啦
BigDecimal類
由於float、double都是近似值儲存,所有此類資料進行運算的話會產生誤差,儘管誤差不大,但在某些需求高精度的領域就會產生影響,所以引進使用BigDecimal類
- java.math包內
- 一般想要精確計算的話,傳進的值儘量使用字串形式
BigDecimal bd1=new BigDecimal("1.0");
BigDecimal bd2=new BigDecimal("0.9");
//減法
BigDecimal r1=bd1.subtract(bd2);
System.out.println(r1);
//加法
BigDecimal r2=bd1.add(bd2);
System.out.println(r2);
//乘法
BigDecimal r3=bd1.multiply(bd2);
System.out.println(r3);
//除法
BigDecimal r4=new BigDecimal("1.4")
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(r4);
執行結果:
0.1
1.9
0.90
1
- 除法:divide(BigDecimal bd,int scal,RoundingMode mode) 引數scal:制定精確到小數點後幾位 引數mode:指定小數部分的取捨模式,通常使用四捨五入(BigDecimal.ROUND_HALF_UP)
Date類
Date表示特定的瞬間,精確到毫秒。Date中大部分方法都已經被Calendar類中的方法所取代
Calendar類
Calendar為抽象類,無法直接建立物件使用,裡面有一個靜態方法叫getInstance(),該方法返回了Calendar類的子類物件。static Calendar getInstance() 使用預設時區和語言環境獲取一個日曆
// 多型
Calendar c = Calendar.getInstance();
Syste.out.println(c);
-
get方法
public int get(int field):返回給定日曆欄位的值
引數:傳遞指定的日曆欄位(YEAR,MONTH...)
返回值:日曆欄位代表的具體的值Copypublic static void main(String[] args) { demo01(); } public static void demo01(){ // 使用getInstance方法獲取Calendar物件 Calendar c = Calendar.getInstance(); System.out.println(c); int year = c.get(Calendar.YEAR); System.out.println(year); int mouth = c.get(Calendar.MONTH); // 西方月份0-11 東方月份1-12 System.out.println(mouth); int date = c.get(Calendar.DAY_OF_MONTH); System.out.println(date); int date2 = c.get(Calendar.DATE); System.out.println(date2); }
-
set方法
public void set(int field,int value):將給定的日曆欄位設定為給定值
引數:
int field:傳遞指定的日曆欄位(YEAR,MONTH...)
int value:給指定的欄位設定值
Copypublic static void main(String[] args) {
demo02();
}
public static void demo02(){
// 使用getInstance方法獲取calendar物件
Calendar c = Calendar.getInstance();
System.out.println(c);
c.set(999,6,6);
// 獲取年
c.set(Calendar.YEAR,666);
int year = c.get(Calendar.YEAR);
System.out.println("系統時間:"+year);
System.out.println("重新設定年::"+year);
// 重新設定月
c.set(Calendar.MONTH,6);
int month = c.get(Calendar.MONTH);
System.out.println("月份:"+month);
// 重新設定日
c.set(Calendar.DATE,11);
// 獲取日
int date = c.get(Calendar.DATE);
System.out.println(date);
c.set(999,6,6);
System.out.println(year+"年"+month+"月"+date+"日");
}
-
add方法
public abstract void add(int field,int amount):根據日曆的規則,得指定的日曆欄位新增或者減去指定的時間量把指定的欄位量增加/減少指定的值
引數:
int field:傳遞指定的日曆欄位(YEAR,MONTH...)
int amount:增加/減少指定的值
正數:增加
負數:減少
public static void main(String[] args) {
demo03();
}
public static void demo03(){
Calendar c = Calendar.getInstance();
// 增加兩年
c.add(Calendar.YEAR,2);
int year = c.get(Calendar.YEAR);
System.out.println(year);
// 減少兩個月
c.add(Calendar.MONTH,-1);
int month = c.get(Calendar.MONTH);
System.out.println(month);
}
-
getTime方法
Calendar中的getTime方法並不是獲取毫秒時刻,而是拿到對應的Date物件。
格式:
public Date getTime():返回一個表示此calendar時間值(從曆元到現在的毫秒值偏移量)的Date物件
把日曆物件,轉換為日期物件
public static void main(String[] args) {
demo04();
}
public static void demo04(){
// 使用getInstance方法獲取calendar物件
Calendar c = Calendar.getInstance();
Date date = c.getTime();
System.out.println(date);
// Thu Mar 12 23:20:35 CST 2020
}
SimpleDateFormat類
SimpleDateFormat是一個以與語言環境有關的方式來格式化和解析日期的具體類
- 進行格式化(日期->文字)
- 解析(文字->日期)
public static void main(String[] args) throws ParseException {
//1.建立SimpleDateFormat物件y年M月
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
//2.建立Date
Date date=new Date();
//格式化date
String str=sdf.format(date);
System.out.println(str);
//解析
Date date1=sdf.parse("2008年08月08日08:08:08");
System.out.println(date1);
}
執行結果:
2020年09月15日21:49:28
Fri Aug 08 08:08:08 CST 2008
System類
主要用於獲取系統的屬性資料和其他操作,構造方法私有
- static void arraycopy(...) 複製陣列
- static long currentTimeMillis() 獲取當前系統時間,返回的是毫秒值
- static void gc() 建議JVM趕快啟動垃圾回收器回收垃圾
- static void exit(int status) 退出JVM,如果引數是0表示正常退出JVM,非0表示異常退出JVM