stringbuffer常用方法_第八讲:常用类库API
一、字符串操作---String類
1、String可以表示一個字符串,不能被繼承(最終類)不可變
2、String類實際是使用字符數(shù)組存儲的
String類的兩種賦值方式:
(1)一種稱為直接賦值、Java推薦使用第一種方式
String name="小白"
(2)通過關(guān)鍵字new調(diào)用String的構(gòu)造方法賦值:new申請內(nèi)存空間
String?name =?new String("小白")
String類的兩種賦值分析:
1、字符串常量池
2、String name = new String("小白")在內(nèi)存中分析
3、String?name =?"小白",在內(nèi)存中分析
String 類編譯期與運行期分析:
1、編譯期和運行期
2、代碼示例:4種情況分析:直接賦值字符串連接時,考慮編譯期與運行期
如果在編譯期值可以被確定,那么就使用已有的對象,否則會創(chuàng)建新對象
String a="a";String a+1;String?a2="a1";System.out.println(a1==a2);String類字符與字符串操作方法:
String類字節(jié)與字符串操作方法:
String類判斷是否以指定內(nèi)容開頭或結(jié)尾:
String類替換操作:
String字符串截取操作:
String字符串拆分操作:
String字符串查找操作:
String類其它操作方法:
二、字符串操作-----StringBuffer類
在實際開發(fā)當(dāng)中,我們經(jīng)常會使用到字符串連接的操作,如果用String來操作,則使用“+”號來完成字符串的連接操作。
使用String連接字符串,代碼性能會非常低,因為String的內(nèi)容不可改變。解決這個問題的方法是使用StringBuffer.
package com.vince.ex;public class StringDemo { public static void main(String[] args) { String a = "a"; String b = "b"; String c = a+b+1; System.out.println(c); String d="a"+1+2+3+4+"b";//a1234b //常量相加沒有性能問題(編譯期進行優(yōu)化) //StringBuffer目的是為了解決字符串相加時帶來的性能問題(常量與變量) //StringBuffer的內(nèi)部實現(xiàn)采用字符數(shù)組、默認數(shù)組的長度為16,超過數(shù)組大小時,動態(tài)擴充的算法是原長度的*2+2 //所以當(dāng)我們要預(yù)知添加的數(shù)據(jù)長度時,建議使用帶初始化容量的構(gòu)造方法,來避免動態(tài)擴張的次數(shù),從而提高效率 //線程安全,會影響性能??????StringBuffer?sb?=?new?StringBuffer(32);//帶容量的構(gòu)造 sb.append(a).append(b).append(1); System.out.println(sb.toString());??}}StringBuffer常用操作方法:
StringBuffer的兄弟StringBuilder:
一個可變的字符序列,此類提供一個與StringBuffer兼容的API,但不保證同步該類被設(shè)計用作StringBuffer的一個簡易替換,用在字符串緩沖期被單個線程使用的時候(這種情況很普遍)如果可能,建議優(yōu)先采用該類,因為在大多數(shù)實現(xiàn)中,它比StringBuffer更快。
JDK1.5后、字符串相加原理分析:
package com.vince.ex;public class StringBufferDemo { public static void main(String[] args) { //面試題:StringBuffer與StringBuilder的區(qū)別? //StringBuilder是線程不安全的,性能高,適合在單線程中使用,這種情況占大多數(shù)在JDK1.5后添加 //StringBuffer是線程安全的,性能低,適合在多線程中使用,JDK1.0 StringBuilder sb = new StringBuilder(); /** * 字符串相加操作 * 1、多個常量相加沒有性能問題,在編譯期優(yōu)化 * 2、常量與常量相加、會產(chǎn)生多個垃圾對象 */ //String a = "a"+1; //String b = a+"b"; String c = null; for(int i=0;i<5;i++) { c+=i;//每個循環(huán)會產(chǎn)生一個StringBuilder對象實現(xiàn)拼接,性能低、最好是手動創(chuàng)建StringBuilder來拼接 } //1、字符串相加,在編譯后,會使用StringBuilder來優(yōu)化代碼,實現(xiàn)拼接 }}三、程序國際化
1、對國際化程序的理解:
lnternationalization:國際化程序可以這樣理解:
同一套程序代碼,可以在各個語言環(huán)境下進行使用。只是語言顯示不同,那么具體程序操作本身都是一樣的,那么國際化程序完成的就是這樣的一個功能。
2、Locale類:
Locale對象表示了特定的地理、政治和文化地區(qū)。需要Locale來執(zhí)行其任務(wù)的操作稱為語言環(huán)境敏感的操作,它使用Locale為用戶量身定制信息,例如:顯示一個數(shù)值就是語言環(huán)境敏感的操作,應(yīng)該根據(jù)用戶的國家、地區(qū)或文化風(fēng)俗/傳統(tǒng)來格式化數(shù)值。
使用此類中的構(gòu)造方法來創(chuàng)建Locale:
Locale(String language)
Locale(String langusge,String country)
通過靜態(tài)方法創(chuàng)建Locale:
getDefault()
package?com.vince.ex;public?class?I18NDemo?{ public static void main(String[] args) { //創(chuàng)建一個環(huán)境語言對象,該對象會根據(jù)參數(shù)設(shè)置來自動選擇與相關(guān)的語言環(huán)境 //參數(shù):語言、地區(qū) Locale locale_CN = new Locale("zh","CN"); Locale locale_US = new Locale("en","UD"); //獲取當(dāng)前系統(tǒng)默認的語言環(huán)境 Locale locale_default = Locale.getDefault(); }3、ResourceBundle類:
國際化的實現(xiàn)核心在于顯示的語言上,通常的做法是將其定義成若干個屬性文件(文件后綴是*。properties)屬性中的格式采用“key=value”的格式進行操作。
ResourceBundle類表示的是一個資源文件的讀取操作,所有的資源文件需要使用ResourceBundle進行讀取,讀取的時候不需要加上文件的后綴。
getBundle(String?baseName)
getBundle(String baseName,Locale locale)
getString?(String key)
properties文件:屬性文件(配置文件)內(nèi)容以鍵值對的形式存放(key-value)
ResourceBundle工具類:來綁定屬性文件,并指定Locale對象,來自動選擇使用哪個屬性文件,默認講使用與操作系統(tǒng)相同的語言環(huán)境
getString?()方法來從屬性文件中使用key來獲取value
注意:ResourceBundle工具類是只讀的
4、處理動態(tài)文本:
前面的讀取示例讀取的內(nèi)容都是固定的,如果現(xiàn)在假設(shè)要想打印這樣的消息“歡迎你,xxx!”,具體的名字不是固定的,那么就要使用動態(tài)文本進行程序的處理。
進行動態(tài)的文本處理,必須使用Java.text.MessageFormat類完成。這個類是Java.text,Format的子類
四、Math與Random類
1、Math類
Math類包含用于執(zhí)行基本數(shù)學(xué)運算的方法、如初等指數(shù)、對數(shù)、平方根和三角函數(shù)。
使用Math類可以有以下兩種方式:
(1)直接使用(Math所在的包Java.lang為默認引入的包)
(2)使用import.static java.lang.Math.abs;靜態(tài)導(dǎo)入
| ? static?double?Pl | 對任何值都更接近pi的double值 |
| ? ? abs(double a) | 返回double值的絕對值 |
| ? ? ? ? random() | 返回帶正號的double值,該值大于等于0.0且小于1.0 |
| ? ?round(double?a) | 返回最近參數(shù)并等一整數(shù)的double值 |
| ? ? ?sqrt(double a) | 返回正確舍入的double值的平方根 |
2、Random類
Random:此類在實例用于生成隨機數(shù)流
| ? ?nextLong() | 返回下一個偽隨機數(shù)的long值 |
| ? ?nextBoolean() | 返回下一個偽隨機數(shù)的boolean值 |
| ? ??nextDoble() | 返回下一個偽隨機數(shù),在0.0和1.0之間的double值 |
| ? ? nextFloat() | 返回下一個偽隨機數(shù),在0.0和1.0之間的float值 |
| ? ??nextInt() | 返回下一個偽隨機數(shù),int值 |
| ? ? nextInt(int n) | 返回一個偽隨機數(shù),在1(包括)和指定值分布的int值 |
五、日期操作類
1、Date類
類Date表示特定的瞬間,精確到毫秒,也就是程序運行時的當(dāng)前時間
Date date = new Date();//實例化Date類,表示當(dāng)前時間
2、Calender類
Calender、日歷類、使用此類可以將時間精確到毫秒顯示。兩種實例化方式:
Calender c =?Calender.getlnstance();
Calender c = new GregorianCalender();
3、DateFormat類及子類SimpleDateFormat
六、對象比較器
對兩個或多個數(shù)據(jù)進行比較,以確定它們是否相等,或確定它們之間的大小關(guān)系及排列順序稱為比較。
Arrays.sort方法可實現(xiàn)對象的排列順序操作:
(1)Comparable接口:
此接口強行對實現(xiàn)它的每個類的對象進行整體排序,這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。
(2)Comparator接口:
Comparable接口是要求自定義類去實現(xiàn),按照oo原則:對修改關(guān)閉,對擴展開發(fā),那么如果這個類已經(jīng)定義好了,不想再去修改它,那如何實現(xiàn)比較呢?Comparator接口:強行對一個對象collection進行整體排序的比較。
七、對象的克隆
將一個對象復(fù)制一份,稱為對象的克隆技術(shù)。
在Object類中存在一個clone()方法:
protected Object clone()throws CloneNotSupportdException(如果一個類的對象要想克隆,則對象所在的類必須實現(xiàn)Cloneable接口。此接口沒有定義任何方法,是一個標(biāo)記接口)
對象需要具有可能功能:
1、實現(xiàn)Cloneable接口(標(biāo)記接口)
2、重寫Object類中的clone方法
八、System與Runtime類
System類代表系統(tǒng),系統(tǒng)級的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包
1、成員變量
System類內(nèi)部包含in、out和err三個成員變量,分別代表標(biāo)準(zhǔn)輸入流(鍵盤輸入),標(biāo)準(zhǔn)輸入流(顯示器)和標(biāo)準(zhǔn)錯誤輸出流
2、成員方法
System類中提供了一些系統(tǒng)級的操作方法
參數(shù)(源數(shù)組、源數(shù)組的起始位置、目標(biāo)數(shù)組的起始位置?、長度)
(1)public?static void?arraycopy(Object src、int?srcPos、Object dest,int destPos,intlength)該方法的作用是數(shù)組拷貝,也就是將一個數(shù)組中的內(nèi)容復(fù)制到另一個數(shù)組中的指定位置,由于該方法是native方法,所以性能上比使用循環(huán)高效
(2)public static long currentTimeMillis()該方法的作用是返回當(dāng)前的計算機時間,時間的表達格式為當(dāng)前計算機時間和GMT時間(格林威治時間)1970年1月1號0時0分0秒所差的毫秒數(shù)
(3)public static?void exit(int?status)該方法的作用是退出程序。其中status的值為0代表正常退出,非零代表異常退出,使用該方法可以在圖形界面編程中實現(xiàn)程序的退出功能等。
(4)public?static void?gc()該方法的作用是請求系統(tǒng)進行垃圾回收,至于系統(tǒng)是否立即回收,則取決于系統(tǒng)中的垃圾回收算法實現(xiàn)以及系統(tǒng)執(zhí)行時的情況
(5)public?static?String?getProperty(String?key)該方法的作用是獲得系統(tǒng)中屬性名為key的屬性對應(yīng)的值
java.version?java? ? ? ?運行時環(huán)境版本
Java.home? ? ? ? ? ? ? ? ?Java安裝目錄
os.name? ? ? ? ? ? ? ? ? ? ?操作系統(tǒng)的名稱
os.version? ? ? ? ? ? ? ? ? 操作系統(tǒng)的版本
user.name?? ? ? ? ? ? ? ? ?操作系統(tǒng)賬號名稱
user.heme? ? ? ? ? ? ? ? ? 用戶的主目錄
user.dir? ? ? ? ? ? ? ? ? ? ???用戶的當(dāng)前工作目錄
Runtime類:每個Java應(yīng)用程序都有一個Runtime類實例、使應(yīng)用程序能夠與其運行的環(huán)境相連接。
Runtime?rt?=?Runtime.getRuntime();
System.out.println("處理器數(shù)量:"+rt.availableProcessors()+"個");
System.out.println("JVM總內(nèi)存數(shù):"+rt.totaIMemory()+"byte")
System.out.println("JVM空閑內(nèi)存數(shù):"rt.freeMemory()+"byte");
System.out.println("JVM可用最大內(nèi)存數(shù):"rt.maxMemory()+"byte);
在單獨的進程中執(zhí)行指定的字符串命令
rt.exec("notepad")
九、數(shù)字處理工具類
Biglnteger:可以讓超過lnteger范圍內(nèi)的數(shù)據(jù)進行運算
構(gòu)造方法:public Biglnteger(String val)
常用方法:
public?Biglnteger add(Biglnteger val)
public?Biglnteger subtact(Biglnteger val)
public?Biglnteger nultiply(Biglnteger val)
public?Biglnteger divide(Biglnteger val)
public?Biglnteger[] divideAndRemainder(Biglnteger val)
BigDecimal:由于在運算的時候,float類型和double很容易丟失精度,為了能精確的表示,計算浮點數(shù),Java提供了BigDecimal,不可變的,任意精度的有符號十進制。
構(gòu)造方法:public?BigDecimal?(String val)
常用方法:
public?BigDecimal?add(BigDecimal augend)
public?BigDecimal subtact(BigDecimal subtrahend)
public?BigDecimal multiply(BigDecimal multitlplicand)
public?BigDecimal divide(BigDecimal divisor)
DecimalFormat:java提供DecimalFormat類,幫你用最塊的速度將數(shù)字格式化為你需要的樣子.
十、MD5工具類
MD5的全稱是Message-Digest Algorithm5(信息摘要算法)
確定信息算法
MessageDigest?md5=MessageDigest.getlnstance("MD5");
JDK1.8新增Base64
String newstr =?Base64.getEncoder().encodeToString(md5.digestBytes("utf-8")));
1.8之前使用sun.misc.BASE64Encoder(此類沒有訪問權(quán)限,在rt.jar中添加訪問權(quán)限:sun/misc/*)
BASE64Encoder base64Encoder();
base64.encode(md5.digest(str.getBytes("uft-8)));
package com.common.tools;import java.security.MessageDigest;public abstract class MD5Tools{ public final static String MD5(String pwd) { //用于加密的字符 char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { //使用平臺的默認字符集將此 String 編碼為 byte序列,并將結(jié)果存儲到一個新的 byte數(shù)組中 byte[] btInput = pwd.getBytes(); //信息摘要是安全的單向哈希函數(shù),它接收任意大小的數(shù)據(jù),并輸出固定長度的哈希值。 MessageDigest mdInst = MessageDigest.getInstance("MD5"); //MessageDigest對象通過使用 update方法處理數(shù)據(jù), 使用指定的byte數(shù)組更新摘要 mdInst.update(btInput); // 摘要更新之后,通過調(diào)用digest()執(zhí)行哈希計算,獲得密文 byte[] md = mdInst.digest(); // 把密文轉(zhuǎn)換成十六進制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { // i = 0 byte byte0 = md[i]; //95 str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5 str[k++] = md5String[byte0 & 0xf]; // F } //返回經(jīng)過加密后的字符串 return new String(str); } catch (Exception e) { return null; } }}package com.common.tools;import java.security.MessageDigest;/** * MD5加密工具類 * */public abstract class MD5Tools{ public final static String MD5(String pwd) { //用于加密的字符 char md5String[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { //使用平臺的默認字符集將此 String 編碼為 byte序列,并將結(jié)果存儲到一個新的 byte數(shù)組中 byte[] btInput = pwd.getBytes(); //信息摘要是安全的單向哈希函數(shù),它接收任意大小的數(shù)據(jù),并輸出固定長度的哈希值。 MessageDigest mdInst = MessageDigest.getInstance("MD5"); //MessageDigest對象通過使用 update方法處理數(shù)據(jù), 使用指定的byte數(shù)組更新摘要 mdInst.update(btInput); // 摘要更新之后,通過調(diào)用digest()執(zhí)行哈希計算,獲得密文 byte[] md = mdInst.digest(); // 把密文轉(zhuǎn)換成十六進制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { // i = 0 byte byte0 = md[i]; //95 str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5 str[k++] = md5String[byte0 & 0xf]; // F } //返回經(jīng)過加密后的字符串 return new String(str); } catch (Exception e) { return null; } }}十一、數(shù)據(jù)結(jié)構(gòu)之二叉樹實現(xiàn)
樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為節(jié)點)按分支關(guān)系組織起來的結(jié)構(gòu)。二叉樹(Binary Tree)是每個節(jié)點最多有兩個子樹的有序樹。通常子樹被稱作“左子樹”和“右子樹”。
二叉樹的分類及特點:
(1)完全二叉樹
完全二叉樹是二叉樹的-一個分類,它的特點是每個節(jié)點的孩子節(jié)點的數(shù)量可以是0,1, 2個,除此之外它要求每層節(jié)點添加,必須是從左到右,不允許跳著添加。
(2)滿二叉樹(Full Binary tree)
滿二叉樹它的特點是每個節(jié)點的孩子節(jié)點要么沒有,要么就是兩個,不允許出現(xiàn)單個孩子的情況。
(3)二叉搜索樹(Ordered Binary Tree )
也稱二叉排序樹,這個是我們接觸的最多的一種結(jié)構(gòu), 它要求節(jié)點的左子樹小于該節(jié)點本身,右子樹大于該節(jié)點,每個節(jié)點都符合這樣的規(guī)則,對二叉搜索樹進行中序遍(左中右)歷就得到一個有序的序列
(4)均衡二叉樹( Balanced Binary Tree)
均衡二叉樹指的是-一個節(jié)點的左右子樹的高度差值不能大于1,均衡二叉樹一般都是在二叉搜索樹的基礎(chǔ)之上添加自動維持平衡的性質(zhì),這種樹的插入,搜索,刪除的綜合效率比較高。
(5)完美二叉樹(Perfect binary Tree)
完美二叉樹是理想中的一種二叉樹,這種樹的特點就是非常完美,每個節(jié)點都有兩個孩子節(jié)點,并且每層都被完全填充,完美二叉樹的葉子節(jié)點的高度都是一樣。
二叉搜索樹算法的排序規(guī)則:
1、選擇第一個元素作為根節(jié)點
2、之后如果元素大于根節(jié)點放在右子樹,如果元素小于根節(jié)點,則放在左子樹
3、最好按照中序遍歷的方式進行輸出,則可以得到排序的結(jié)果(左→根→右)
先序遍歷:根左右
后序遍歷:左右根
如:1、2、3、4、5、6、7、8、9、10
主類:
package com.booy1;public class BinaryTreeTest { public static void main(String[] args) { BinaryTree bt = new BinaryTree(); bt.add(6); bt.add(5); bt.add(9); bt.add(8); bt.add(1); bt.add(7); bt.add(2); bt.print(); }}BinaryTree 類:
package com.booy1;public class BinaryTree { private Node root; //添加節(jié)點 public void add(int data){ if(root==null) { root = new Node(data); }else { root.addNode(data); } } //遍歷節(jié)點 public void print(){ root.printNode(); } private class Node{ private int data; private Node left; private Node right; public Node(int data ){ this.data = data; } //添加節(jié)點 public void addNode(int data){ if(this.data>data) { if(this.left==null) { this.left = new Node(data); }else { this.left.addNode(data); } }else{ if(this.right==null) { this.right = new Node(data); }else { this.right.addNode(data); } } } //遍歷節(jié)點 public void printNode(){ if(this.left != null) { this.left.printNode(); } System.out.print(this.data+">"); if(this.right != null) { this.right.printNode(); } } } }/**運行結(jié)果:1>2>5>6>7>8>9>*/十二、JDK1.8新特性-Lambda表達式
1、Lambda表達式(也稱為閉包)是整個Java8發(fā)行版中最受期待的Java語言層面上的改變,Lambda允許把函數(shù)作為一個方法的參數(shù)(函數(shù)作為參數(shù)傳遞進方法中)或者把代碼看成數(shù)據(jù)。Lambda表達式用于簡化Java中接口式的匿名內(nèi)部類。被稱為函數(shù)式接口的概念。函數(shù)式接口就是一個具有一個方法的普通接口,像這樣的接口可以被隱式轉(zhuǎn)換為Lambda表達式。
語法:
(參數(shù)1,參數(shù)2....)->{......}
? (1)沒有參數(shù)時使用Lambda表達式
(2)帶參數(shù)時使用Lambda表達式
(3)代碼塊中只有一句代碼時使用Lambda表達式
(4)代碼塊中有多句代碼時使用Lambda表達式
(5)有返回值的代碼塊
(6)參數(shù)中使用final關(guān)鍵字
import java.sql.SQLOutput;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;?//讓代碼更加簡潔,不會單獨生成class文件public class LambdaTest { /** * lambda呈現(xiàn)入口 */ public void exeEntry(String message,HandlerArg handlerArg){ handlerArg.handleEntry(message); } /**??*?聲明一個接口(只能有一個抽象方法接口),以lambda的語法來表達該接口的方法調(diào)用 */ public interface HandlerArg{ public void handleEntry(String message); } /** * 聲明一個接口,以lambda的語法來表達該接口的方法調(diào)用 */ public interface HandlerArgs{ public int handleEntry(String message1,String message2); } /** * lambda呈現(xiàn)入口 * */ public int exeEntry(String message1,String message2,HandlerArgs handlerArgs){ return handlerArgs.handleEntry(message1, message2); } public static void main(String[] args) { LambdaTest lambdaTest = new LambdaTest(); //一、 //1."msg"為傳入HandlerArg接口的handleEntry方法所需參數(shù),在"->前面";而后面 直接執(zhí)行方法所要做的事; //2.參數(shù)可不聲明參數(shù)類型; //3.單個參數(shù)不需要被"()"包圍起來; //lambdaTest.exeEntry("the hardest thing is to feel good everyday",msg -> System.out.println(msg)); //二、 //也可以預(yù)先實現(xiàn)接口,再將接口作為參數(shù)傳遞 //HandlerArg handlerArg = msg -> System.out.println(msg); //lambdaTest.exeEntry("the hardest thing is to feel good everyday",handlerArg); //三、 //多條語句,則直接作為一個函數(shù)來使用,其實這里就類似于javaScript的方法傳遞了 //lambdaTest.exeEntry("the hardest thing is to feel good everyday",msg -> { // String strPrefix = "chengxp said:"; // System.out.println(strPrefix + msg); //}); //四、 //多個參數(shù),并處理后返回結(jié)果// int strsLength = lambdaTest.exeEntry("sdf5745","fgdg", (msg1,msg2) -> {return msg1.length() + msg2.length();});// System.out.println("兩個字符串長度之和為:" + strsLength); //五、 //例如集合框架中用的比較多的排序,可以這么寫 List strs = new ArrayList<>(); strs.add("bb"); strs.add("cc"); strs.add("dd"); strs.add("aa"); //以前是這么寫的 Collections.sort(strs, new Comparator() { public int compare(String o1, String o2) { return o1.compareTo(o2); } }); //這里也是1.8的遍歷語法。不過試了一下,效率沒有普通的for循環(huán)效率高。 strs.forEach(str -> System.out.println(str)); //用lambda寫 Collections.sort(strs,(s1,s2) -> s1.compareTo(s2)); strs.forEach(str -> System.out.println(str)); }}Java 8 新增了接口的靜態(tài)方法和默認方法。即接口可以有實現(xiàn)方法,而且不需要實現(xiàn)類去實現(xiàn)其方法,通過static和default關(guān)鍵字實現(xiàn)
? ? 靜態(tài)方法和默認方法的引進,解決了接口一旦發(fā)生修改將與現(xiàn)有的實現(xiàn)不兼容的問題
? ?默認方法與靜態(tài)方法并不影響函數(shù)接口的契約,可以任意使用
二、示例
1、接口
package com.xl.infc; public interface Employee { /** * 抽象方法 實現(xiàn)類必須重寫,必須通過實現(xiàn)類的實例來調(diào)用 */ public void say(); /** * 靜態(tài)方法 只能通過接口的接口名來調(diào)用,實現(xiàn)類可以互不沖突的定義相同的方法并通過實現(xiàn)類的類名來調(diào)用 */ public static void work() { System.out.println("干活"); } /** * 默認方法 必須通過實現(xiàn)類的實例來調(diào)用,可以重寫,但不能再加default關(guān)鍵字,且將覆蓋接口中的實現(xiàn) */ public default void role() { System.out.println("員工"); }}2、實現(xiàn)
package com.xl.infc; public class Programmer implements Employee { @Override public void say() { System.out.println("上班"); } /** * 實現(xiàn)類可以定義的和接口相同的靜態(tài)方法,通過類名來調(diào)用 */ public static void work() { System.out.println("擼代碼"); } /** * 重寫接口的默認方法,不能再用default關(guān)鍵字修飾,且將覆蓋接口中的實現(xiàn),且必須通過實例來調(diào)用 */ @Override public void role() { System.out.println("程序員"); } public static void main(String[] args) { Employee.work(); Programmer.work(); Programmer p = new Programmer(); p.say(); p.role(); } }總結(jié)
以上是生活随笔為你收集整理的stringbuffer常用方法_第八讲:常用类库API的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何下载php-5.5.38.tar.g
- 下一篇: c语言保存后怎么打开文件,保存打开文件之