1. 程式人生 > >java常用的類庫

java常用的類庫

主要內容:

1、StringBuffer的使用。
2、正則表示式、大數操作、日期格式化、Random類的使用。
3、System、Runtime、Process、Math、Calendar類的使用。
4、反射機制在程式中的應用。

一丶StringBuffer。

1、StringBuffer的簡介。

String表示一個字串的操作,但是String本身有如下特點:

  • 兩種宣告的方式,而且比較的時候靠equals()比較內容。

  • 一個字串的內容宣告之後則不可改變。

  • 當字串的內容需要被改變的時候就使用StringBuffer。

在String中如果要想完成兩個字串的連線,依靠"+"。

但是在StringBuffer類中要想完成連線則需要使用的是append()方法。

此方法被過載過多次,而且每個方法返回型別都是StringBuffer:

  • public StringBuffer append(char c)。

根據這種返回型別的特性,可以採用程式碼鏈的形式,例如:StringBuffer物件.append().append()。

範例:進行字串的連線。

package org.study.RebortChao;
public class StringBufferDemo01 {
    public static void main(String[] args) {
        StringBuffer buf = new
StringBuffer(); buf.append("hello"); //增加內容 buf.append("world").append("!!!"); System.out.println(buf); } }/*hello world !!!*/

如果現在需要將一個StringBuffer的型別變成String的話:

  • 必須依靠 toString()方法完成。

  • String和StringBuffer不能夠直接轉換的。

package org.study.RebortChao;
public class StringBufferDemo02{
    public
static void main(String[] args) { StringBuffer buf = new StringBuffer(); buf.append("hello"); //增加內容 buf.append(" world").append("!!!"); String str = buf.toString() ; //StringBuffer --> String System.out.println(str); } }

StringBuffer的內容是允許改變的:
所以在進行引用傳遞的時候,可以將方法中對StringBuffer操作的結果返回。

package org.study.RebortChao;
public class StringBufferDemo03{
    public static void main(String[] args) {
        StringBuffer buf=new StringBuffer();
        buf.append("hello"); //增加內容
        buf.append("world").append("!!!");
        fun(buf);
        System.out.println(buf);
    }
    public static void fun(StringBuffer temp){
        temp.append("\n").append(1).append(" + ").append(2).append(" = ").append(1 + 2);
    }
}
/*從程式中的最終結果來看,StringBuffer的內容是完全允許改變的。*/

2、StringBuffer的應用。

  • 需要經常【改變字串的內容】要使用StringBuffer。

  • 【內容不需要隨時改變】的話,使用String就夠了。

範例:以下情況下就必須使用StringBuffer

package org.study.RebortChao;
public class StringBufferDemo04 {
    public static void main(String[] args) {
        StringBuffer buf = new StringBuffer();
        for (int x = 0; x < 1000; x++) {
            buf.append(x);
        }
        System.out.println(buf);
    }
}

3、StringBuffer的方法。

StringBuffer本身也是一個類,有著許多的方法,大多同String一樣。
但是StringBuffer也有著屬於自己的方法。

①、字串的反轉。

  • public StringBuffer reverse()
package org.study.RebortChao;
public class ReverseDemo {
    public static void main(String[] args) {
        StringBuffer buf = new StringBuffer();
        buf.append("hello world!!!");
        System.out.println(buf.reverse());//呼叫reverse反轉函式
    }
}

②、字串的替換。

  • 在String類中依靠replaceAll()方法完成替換

  • public StringBuffer replace(int start,int end,String str)

    • 需要指定替換的開始和結束位置
package org.study.RebortChao;
public class ReplaceDemo{
    public static void main(String[] args){
        StringBuffer buf = new StringBuffer();
        buf.append("hello world!!!");
        System.out.println(buf.replace(0, buf.length(), "XXX"));//從0開始到最後都將被XXX所取代。
    }
}

③、插入內容

  • append()採用順序的方式依次連線到後面的位置。

  • 可以使用insert()方法完成在指定位置上的增加:

    • public StringBuffer insert(int offset,char c)

    • 此方法被過載過很多次,可以插入各種資料型別。

package org.study.RebortChao;
public class InsertDemo{
    public static void main(String[] args) {
        StringBuffer buf = new StringBuffer();
        buf.append("world!!!").insert(0, "hello");
        //從0的位置開始插入
            System.out.println(buf);
    }
}

二丶Runtime-表示的是執行時的狀態物件。

每當有一個JVM程序產生的時候都會自動生成一個被私有化的Runtime類的物件。
那麼一旦構造方法被私有化,則內部一定會存在一個方法,可以取得本類的例項化物件:

  • public static Runtime getRuntime()。

只要沒有發現構造方法,則構造方法一定被私有化了,屬於【單例設計】,則此時一定可以從類的內部找到一個static 方法,取得本類的例項。

  • Runtime run = Runtime.getRuntime() ;

Runtime類可以取得一些系統的資訊或者是建立一個新的程序。
1、取得系統的資訊。

  • 總共可以使用的記憶體:public long totalMemory();

  • 取得最大可用的記憶體:public long maxMemory();

  • 取得當前空餘的記憶體:public long freeMemory();

範例:觀察系統的記憶體的使用情況。

package org.study.RebortChao;
public class RuntimeDemo01{
    public static void main(String[] args){
        Runtime run = Runtime.getRuntime();
        System.out.println("** 1、maxMemory:" + run.maxMemory());
        System.out.println("** 1、totalMemory:" + run.totalMemory());
        System.out.println("** 1、freeMemory:" + run.freeMemory());
        String str = "";
        for (int x = 0; x < 10000; x++) { // 將產生大量的垃圾
            str += x;
        }
        System.out.println("========= 產生垃圾之後 ============");
        System.out.println("** 2、maxMemory:" + run.maxMemory());
        System.out.println("** 2、totalMemory:" + run.totalMemory());
        System.out.println("** 2、freeMemory:" + run.freeMemory());
    }
}
/*for迴圈產生大量的垃圾,freeMemory()的空間明顯減少。*/

垃圾的回收。

package org.study.RebortChao;
public class RuntimeDemo02 {
    public static void main(String[] args) {
        Runtime run = Runtime.getRuntime();
        System.out.println("========= 產生垃圾之前 ============");
        System.out.println("** 1、maxMemory:" + run.maxMemory());
        System.out.println("** 1、totalMemory:" + run.totalMemory());
        System.out.println("** 1、freeMemory:" + run.freeMemory());
        String str = "";
        for (int x = 0; x < 10000; x++) { //將產生大量的垃圾
            str += x;
        }
        System.out.println("========= 產生垃圾之後 ============");
        System.out.println("** 2、maxMemory:" + run.maxMemory());
        System.out.println("** 2、totalMemory:" + run.totalMemory());
        System.out.println("** 2、freeMemory:" + run.freeMemory());
        run.gc() ; //垃圾收集
        System.out.println("========= 垃圾收集之後 ============");
        System.out.println("** 2、maxMemory:" + run.maxMemory());
        System.out.println("** 2、totalMemory:" + run.totalMemory());
        System.out.println("** 2、freeMemory:" + run.freeMemory());
    }
}

2、執行本機程式。

  • public Process exec(String command) throws IOException

  • 此方法返回一個Process類的物件例項,那麼此類可以用於程序的控制。

    • 銷燬程序:public void destroy()

範例:執行程式notepad.exe。

package org.study.RebortChao;
public class RuntimeDemo03{
    public static void main(String[] args) throws Exception {
        Runtime run = Runtime.getRuntime();
        Process pro = run.exec("notepad.exe"); //執行程式
        Thread.sleep(2000); //延時2秒。
        pro.destroy();
    }
}

三丶System類

  • System.out.println();
    • System是一個類。
    • out是一個靜態屬性。
    • println()是out物件所提供的一個方法。

1、取得計算的時間
①、System類本身可以取得一個系統的當前時間,只是返回的時候按照long返回。

  • 取得當前時間的方法:public static long currentTimeMillis()
package org.study.RebortChao;
public class SystemDemo01{
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String str = "";
        for (int x = 0; x < 10000; x++) { // 將產生大量的垃圾
            str += x;
        }
        long end = System.currentTimeMillis();
        System.out.println("花費的時間:"+(end - start));
    }
}

2、垃圾回收與物件生命週期

  • public static void gc()。
    當呼叫此方法的時候實際上就等同於呼叫了Runtime類中提供的gc()方法,兩個是一樣的。

  • 方法:protected void finalize() throws Throwable
    當一個物件被回收之前都會預設呼叫此方法,但是此方法上丟擲的異常是 Throwable。Throwable 表示 Error 和Exception,證明此方法有可能產生錯誤或者是異常,但是此方法的好處即便是產生了問題也不會影響程式的執行。

  • 一般一個物件都要經歷以下的生命週期:

    • 載入-->【初始化】-->【使用】-->【回收】-->解除安裝

範例:觀察物件的回收。

package org.study.RebortChao;
class Person {
    public Person(){
        System.out.println("我出生了。。。");
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("我完了,我被回收了。。。");
    }
}
public class ObjectGCDemo {
    public static void main(String[] args) {
        Person per = new Person();
        per = null;
        System.gc(); //手工回收
    }
}

四丶math類-數學的操作類。

1、常用值與函式:
Math.PI 記錄的圓周率
Math.E 記錄e的常量

2、Math中還有一些類似的常量,都是一些工程數學常用量。
Math.abs求絕對值 .
Math.sin正弦函式Math.asin反正弦函式 .
Math.cos餘弦函式 Math.acos反餘弦函式 .
Math.tan正切函式 Math.atan反正切函式Math.atan2商的反正切函式 .
Math.toDegrees弧度轉化為角度Math.toRadians角度轉化為弧度 .
Math.ceil得到不小於某數的最大整數 .
Math.floor得到不大於某數的最大整數 .
Math.IEEEremainder求餘 .
Math.max求兩數中最大 .
Math.min求兩數中最小 .
Math.sqrt求開方 .
Math.pow求某數的任意次方, 丟擲ArithmeticException處理溢位異常 .
Math.exp求e的任意次方 .
Math.log10以10為底的對數 .
Math.log自然對數 .
Math.rint求距離某數最近的整數(可能比某數大,也可能比它小).
Math.round同上,返回int型或者long型(上一個函式返回double型) .
Math.random返回0,1之間的一個隨機數.

五丶大數操作類。

1、大整數操作類BigInteger

package org.study.RebortChao;
import java.math.BigInteger;
public class BigIntegerDemo{
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger(Long.MAX_VALUE + "");
        BigInteger bi2 = new BigInteger(Long.MAX_VALUE + "");
        System.out.println("加法:"+bi1.add(bi2));
        System.out.println("減法:"+bi1.subtract(bi2));
        System.out.println("乘法:"+bi1.multiply(bi2));
        System.out.println("除法:");
        BigInteger res[]=bi1.divideAndRemainder(new BigInteger("333"));
        System.out.println("整數部分:" + res[0]);
        System.out.println("小數部分:" + res[1]);
    }
}

2、大小數操作類:BigDecimal

package org.study.RebortChao;
import java.math.BigDecimal;
public class BigDecimalDemo {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);
        BigDecimal bd2 = new BigDecimal(Double.MAX_VALUE);
        System.out.println("加法:"+bd1.add(bd2));
        System.out.println("減法:"+bd1.subtract(bd2));
        System.out.println("乘法:"+bd1.multiply(bd2));
        System.out.println("除法:"+bd1.divide(bd2));
    }
}

在BigDecimal類中除法操作可以指定小數的保留位數:

  • public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)

範例:四捨五入操作

package org.study.RebortChao;
import java.math.BigDecimal;
class MyMathRound{
    public static double round(double num, int scale){
        BigDecimal bd = new BigDecimal(num);
        return bd.divide(new BigDecimal(1),scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    public static BigDecimal round(String num, int scale){
        BigDecimal bd = new BigDecimal(num);
        return bd.divide(new BigDecimal(1), scale, BigDecimal.ROUND_HALF_UP);
    }
}
public class RoundDemo{
    public static void main(String[] args){
        System.out.println("四捨五入:" + MyMathRound.round(98.56137, 2));
        System.out.println("四捨五入:" + MyMathRound.round(98.56637, 2));
        System.out.println("四捨五入:" + MyMathRound.round("98.56637", 2));
    }
}

六丶隨機數

  • 在java.util.Random類中主要的功能是用於產生隨機數的。

範例:產生10個數字,都不大於100

package org.study.RebortChao;
import java.util.Random;
public class RandomDemo {
    public static void main(String[] args) {
        Random rand = new Random();
        for (int x = 0; x < 10; x++) {
            System.out.println(rand.nextInt(100));
        }
    }
}

七丶日期操作。

1、Date類

java.util.Date類是一個專門取得日期的操作類,直接例項化物件輸出即可。

package org.study.RebortChao;

import java.util.Date;

public class DateDemo{
    public static void main(String[] args) {
        System.out.println(new Date());
        }
}

輸出的時間資訊是:

Sat Dec 02 15:03:17 CST 2017
/*確實是取得了一個日期,但是日期的格式並不符合日常習慣。*/

2、Calendar類

Calendar類是採用手工的方式取得日期,可以通過此類精確到毫秒。

此類的定義如下:

  • public abstract class Calendar extends Object
    implements Serializable, Cloneable, Comparable<Calendar>

這個類本身是一個抽象類,抽象類要想例項化肯定使用子類:GregorianCalendar

package org.study.RebortChao;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarDemo{
public static void main(String[] args) {
Calendar calendar = new GregorianCalendar();
System.out.println("YEAR:"+calendar.get(Calendar.YEAR));
System.out.println("MONTH:"+(calendar.get(Calendar.MONTH) + 1));
System.out.println("DATE:"+calendar.get(Calendar.DATE));
System.out.println("HOUR_OF_DAY:"+calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE:"+calendar.get(Calendar.MINUTE));
System.out.println("SECOND:"+calendar.get(Calendar.SECOND));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
    }
}

設計如下的一個介面:

package org.study.RebortChao;
public interface DateTime{
/**
* 取得日期
* @return 日期的字串,例如:2009-12-22
*/
public String getDate() ;
/**
* 取得日期時間
* @return 日期時間的字串,例如:2009-12-22 11:06:23.345
*/
public String getDateTime() ;
/**
* 取得時間戳
* @return 返回時間戳的字串,例如:20091222110623345
*/
public String getTimeStamp() ;
}

前面需要補0的問題需要注意,例如:01。

package org.study.RebortChao;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class DateTimeImpl implements DateTime {
private Calendar calendar;
public DateTimeImpl() {
this.calendar = new GregorianCalendar();
}
@Override
public String getDate() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR)).append("-");
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append("-");
buf.append(this.addZero(calendar.get(Calendar.DATE), 2));
return buf.toString();
}
@Override
public String getDateTime() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR)).append("-");
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2)).append("-");
buf.append(this.addZero(calendar.get(Calendar.DATE), 2)).append(" ");
buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2)).append(":") ;
buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)).append(":") ;
buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)).append(".") ;
buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3)) ;
return buf.toString();
}
@Override
public String getTimeStamp() {
StringBuffer buf = new StringBuffer();
buf.append(calendar.get(Calendar.YEAR));
buf.append(this.addZero((calendar.get(Calendar.MONTH) + 1), 2));
buf.append(this.addZero(calendar.get(Calendar.DATE), 2));
buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY), 2));
buf.append(this.addZero(calendar.get(Calendar.MINUTE), 2)) ;
buf.append(this.addZero(calendar.get(Calendar.SECOND), 2)) ;
buf.append(this.addZero(calendar.get(Calendar.MILLISECOND), 3)) ;
return buf.toString();
}
private String addZero(int num, int len) {
StringBuffer buf = new StringBuffer();
buf.append(num);
while (buf.length() < len) {
buf.insert(0, 0);
}
return buf.toString();
}
}

3、SimpleDateFormat類

依靠SimpleDateFormat可以成完成String和Date型資料的轉換。

日期的格式化: java.text.SimpleDateFormat 類

格式化日期的模板:

  • 年yyyy、月MM、日dd、時HH、分mm、秒ss、毫秒SSS

範例: 格式化日期。

package org.study.RebortChao;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo{
    public static void main(String[] args){
        //準備好了一個要格式化的模板
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Date date = new Date();
        String str = sdf.format(date);
        System.out.println("格式化後的日期:"+str);
    }
}

通過SimpleDateFormat類可以將一個Date型的資料變為String型的資料。

範例:將String變回Date型

package org.study.RebortChao;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo02{
    public static void main(String[] args) throws Exception {
    String str = "2009-12-24 11:51:57.500" ;
    // 準備好了一個要格式化的模板
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    Date date = sdf.parse(str) ;  // 將String --> Date
    System.out.println("格式化後的日期:" + date);
    }
}

SimpleDateFormat類還可以完成日期格式的轉換。

package org.study.RebortChao;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo03{
    public static void main(String[] args) throws Exception{
        String oldDate = "2009-12-24 11:51:57.500";
        String newDate = null;
        // 準備好了一個要格式化的模板
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        SimpleDateFormat sdf2 = new SimpleDateFormat(
"yyyy年MM月dd日HH時mm分ss秒SSS毫秒");
        Date date = sdf1.parse(oldDate); 
        //從原日期字串中取出日期數字
        newDate = sdf2.format(date); 
        //新的日期格式
        System.out.println("格式化後的日期:" + newDate);
    }
}

DateTime介面的實現類通過SimpleDateFormat類完成應該是最方便的。

package org.study.RebortChao;
import java.text.SimpleDateFormat;
public class DateTimeImpl implements DateTime {
    private SimpleDateFormat sdf;
    @Override
    public String getDate() {
        String str = null;
        this.sdf = new SimpleDateFormat("yyyy-MM-dd");
        str = this.sdf.format(new java.util.Date());
        return str;
    }
    @Override
    public String getDateTime() {
        String str = null;
        this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        str = this.sdf.format(new java.util.Date());
        return str;
    }
    @Override
    public String getTimeStamp() {
        String str = null;
        this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        str = this.sdf.format(new java.util.Date());
        return str;
    }
}

八丶Arrays類-陣列的操作類。

  • import java.util.Arrays;

①、實現對陣列的從小到大的排序:Arrays.sort(a);

②、陣列元素的定位查詢find=Arrays.binarySearch(a,8);
· //括號中前面的a為你將要查詢的陣列名稱,8為想要查詢的數字。
· //find的值為查詢的數字在陣列中的下標。

③、String aString =Arrays.toString(a);
// String前的a和括號中的a均表示陣列名稱。
System.out.println(aString);//String前的a表示陣列名稱。

④、boolean b=Arrays.asList(a).contains(1);
System.out.println(b);//注意:b的值只可能是true或false

九丶比較器。

兩種比較介面的區別:

  • Comparable屬於定義類的時候使用,而Comparator屬於挽救的比較器,所在的包不同。

    • Comparable只有一個方法,而Comparator有兩個方法。

1、Comparable介面

Comparable介面主要是用於執行比較器操作的介面,定義如下:

public interface Comparable<T>{
    public int compareTo(T o);
}

Comparable介面中僅有一個compareTo()方法,此方法返回一個int型的資料,此值會返回三種結果:

  • ①、0:兩個物件相等。②、1:大於。③、-1:小於

如果物件陣列要排序,則物件所在的類必須現實現Comparable介面。

/*如果要使用Arrays.sort()進行排序的話,則肯定要在物件所在的類中進行編寫比較器的操作。*/
package org.study.RebortChao;
import java.util.Arrays;
class Person implements Comparable<Person> {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "姓名:" + this.name + ",年齡:" + this.age;
    }
    @Override
    public int compareTo(Person o) {
        if(this.age > o.age) {
            return 1;
        }else if(this.age < o.age) {
            return -1;
        }else{
            return 0;
        }
    }
}
public class SortObjectArray{
    public static void main(String[] args) {
        Person per[] = {new Person("張三", 20), new Person("李四", 19),new Person("王五", 23)};
        Arrays.sort(per);
        for (int x = 0; x < per.length; x++) {
            System.out.println(per[x]);
        }
    }
}

Comparable排序的原理實際上就屬於BinaryTree(二叉樹)排序的形式。
範例:

package org.study.RebortChao;
class BinaryTree{
    class Node {
        private Comparable data;
        private Node left; //儲存左子樹
        private Node right; //儲存右子樹
        public Node(Comparable data){
            this.data = data;
        }
        public void addNode(Node newNode){
            if(this.data.compareTo(newNode.data)>= 0){ //放在左子樹
                if(this.left == null){
                    this.left = newNode;
                }else{
                    this.left.addNode(newNode);
                }
            }
            if(this.data.compareTo(newNode.data) < 0) { //放在右子樹
                if(this.right == null) {
                    this.right = newNode;
                }else{
                    this.right.addNode(newNode);
                }
            }
        }
        public void printNode(){ //左-根-右
            if(this.left != null){
                this.left.printNode();
            }
            System.out.println(this.data);
            if(this.right != null){
                this.right.printNode();
            }
        }
    }
private Node root; //根節點
public void add(Comparable data){
    Node newNode = new Node(data);
    if(this.root == null){
        this.root = newNode;
    }else{
        this.root.addNode(newNode);
    }
}
    public void print(){
        if(this.root != null){
            this.root.printNode();
        }
    }
}
public class BinaryTreeDemo{
    public static void main(String[] args){
        BinaryTree bt = new BinaryTree();
        bt.add("B");
        bt.add("A");
        bt.add("C");
        bt.print();
    }
}

2、Comparator

一個封裝好的類可以通過Comparator挽救一個排序的規則。

package org.study.RebortChao;
import java.util.Comparator;
    public class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        if(o1.getAge() > o2.getAge()) {
            return -1;
        }else if(o1.getAge() < o2.getAge()) {
            return 1;
        }else{
            return 0;
        }
    }
}

之後就可以繼續使用Arrays類提供的sort()方法進行排序。

package org.study.RebortChao;
import java.util.Arrays;
public class Demo{
    public static void main(String[] args){
        Person per[] = { new Person("張三", 20), new Person("李四", 19),
        new Person("王五", 23) };
        Arrays.sort(per, new PersonComparator());
        for(int x = 0; x < per.length; x++) {
            System.out.println(per[x]);
        }
    }
}

十丶正則表示式。

詳見正則表示式的詳細內容

十一丶反射機制。

反射機制的詳細內容

十二丶物件克隆

克隆就是將一個物件直接複製。

一個類的物件要完成物件的克隆操作的話,則必須實現一個介面:Cloneable。

且必須依靠Object類中的clone()方法:

  • protected Object clone() throws CloneNotSupportedException

此方法屬於受保護的訪問許可權,所以如果一個非本包的非子類,要訪問肯定不能訪問。

package org.study.RebortChao;
class Person implements Cloneable{
    private String name ;
    public Person(String name){
        this.name = name ;
    }
    public void setName(String name){
        this.name = name ;
    }
    public String getName(){
        return this.name ;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class CloneDemo{
    public static void main(String[] args) throws Exception {
        Person per = new Person("張三");
        Person cp = (Person) per.clone(); //克隆
        System.out.println(per + "," + per.getName());
        System.out.println(cp + "," + cp.getName());
    }
}
/*Cloneable是一個標識介面,用於表示一種能力。*/