目標:

  1. 掌握包裝類別的作用
  2. 掌握包裝類別的自動裝箱及自動拆箱的操作
  3. 掌握包裝類別的轉換操作

一切皆對象,8種基本數據類型不是對象。

把int包裝成一個類別,這樣就可以以對象的形式操作基本數據類型。

包裝類別
序號 基底資料型別(非物件) 包裝類別(物件)
1 int Integer
2 char Character
3 short Short
4 long Long
5 float Float
6 double Double
7 boolean Boolean
8 byte Byte

 

 

 

 

 

 

 

 

這8種包裝類別,所繼承的父類不全相同。

可以從JDK檔案中發現包裝類別中的繼承關係:

  1. Integer、Byte、Float、Double、Short、Long屬於Number類別的子類別。
  2. Character屬於Object的直接子類別。
  3. Boolean屬於Object的直接子類別。

Number是一個抽象類別,將數字包裝類別中的內容變為基底資料型別。

Number類別定義
方法 類型 描述
public byte byte Value() 普通 以byte形式傳回指定的數值
public abstract double doubleValue() 普通 以double形式傳回指定的數值
public abstract float floatValue() 普通 以float形式傳回指定的數值
public abstract int intValue() 普通 以int形式傳回指定的數值
public abstract long longValue() 普通 以long形式傳回指定的數值
public short short Value() 普通 以short形式傳回指定的數值

 

裝箱與拆箱

  • 將基底資料型別變為包裝類別稱為裝箱。
  • 將包裝類別變為基底資料型別稱為拆箱。

裝箱及拆箱操作:

public class WrapperDemo{
    public static void main(String args[]){
        int x = 30 ;        // 宣告一個基底資料型別
        Integer i = new Integer(x) ;    // 裝箱:將基底資料型別變為包裝類別
        int temp = i.intValue()    ;// 拆箱:將包裝類別變為基底資料型別
    }
};

浮點數裝箱及拆箱

public class WrapperDemo{
    public static void main(String args[]){
        float f = 30.3f ;        // 宣告一個基底資料型別
        Float x = new Float(f) ;    // 裝箱:將基底資料型別變為包裝類別
        float y = x.intValue()    ;// 拆箱:將包裝類別變為基底資料型別
    }
};

自動裝箱及拆箱操作

public class WrapperDemo{
    public static void main(String args[]){
        Integer i = 30 ;    // 自動裝箱成Integer
        Float f = 30.3f ;    // 自動裝箱成Float
        int x = i ;        // 自動拆箱為int
        float y = f ;        // 自動拆箱為float
    }
};


包裝類別應用(Integer、Float為例)

在包裝類中還存在一個最大的特點就是可以將字符串變為指定的數據類型。

Integer類別(字串轉int型)

    public static int parseInt(String s) throws NumberFormaException

Float類別(字串轉float型)

    public static float parseInt(String s) throws NumberFormaException

字串變為基底資料型別

public class WrapperDemo{
    public static void main(String args[]){
        String str1 = "30" ;    // 由數字組成的字串
        String str2 = "30.3" ;    // 由數字組成的字串
        int x = Integer.parseInt(str1) ;    // 將字串變為int型
        float f = Float.parseFloat(str2) ;    // 將字串變為float型
        System.out.println("整數次方:" + x + " * " + x + " = " + (x * x)) ;
        System.out.println("小數次方:" + f + " * " + f + " = " + (f * f)) ;
    }
};

執行結果:

整數次方:30 * 30 = 900
小數次方:30.3 * 30.3 = 918.08997


以上的操作,字串中的資料必須由數字組成,否則轉換時將會出現程式錯誤。

  1. Java中有8種基本數據類型的包裝類別,可以將基本數據類型以類別的形式進行操作。
  2. 將基底資料型別變為包裝類別稱為裝箱,將包裝類別變為基底資料型別稱為拆箱。
  3. 在JDK1.5之後提供了自動裝箱和自動拆箱的操作。
  4. 實際上這8種數據類型是Java中提供的類別庫,可以發現裡面的定義也是使用所學過的全部基本概念
  5. 使用包裝類別可以將字符串進行基本數據類型的轉換。

 

 

 

 

文章標籤

mingyilai 發表在 痞客邦 留言(0) 人氣()

在Java中一切的關係都是以繼承的關係存在,如果一個類在定義時沒有明確指名繼承那個類,則默認繼承Object類,實際上定義格式如下:

class Person extends Object{}

class Person

Object文件位置可在 api\index.html裡的java.lan:Object看到說明

Object類中的主要方法
序號 方法名稱 類型 描述
1 public Object() 建構 建構方法
2 public boolean equals(Object obj) 普通 物件比較
3 public int hashCode() 普通 取得Hash碼
4 public String toString 普通 物件列印時呼叫

class Demo{    // 定義Demo類別,實際上繼承Object類別
};
public class ObjectDemo{
    public static void main(String args[]){
        Demo d = new Demo() ;    // 產生實體Demo物件
        System.out.println("不加toString()輸出:"+d) ;
        System.out.println("加上toString()輸出:"+d.toString()) ;
    }
};

執行結果:

不加toString()輸出:objectdemo.Demo@6d06d69c
加上toString()輸出:objectdemo.Demo@6d06d69c

從結果可以發現加與不加toString()的輸出結果都是一樣的,也就是說物件輸出時一定會呼叫Object類別中的toString()方法列印內容。

應用stString()方法取得物件內容

class Person{                                                   //定義Person類別
    private String name ;                      // 定義name屬
    private int age ;        // 定義age屬性
    public Person(String name,int age){
        this.name = name ;
        this.age = age ;
    }
    public String toString(){                   //覆寫toString()方法
        return "姓名:" + this.name + ";年齡:" + this.age ;
    }
};
public class ObjectDemo{
    public static void main(String args[]){
        Person per = new Person("賴小明",30) ;     // 產生實體Person物件
        System.out.println("物件資訊" + per) ;            //列印物件呼叫toString()方法 
    }
};

★Object類別提供的equals()方法預設是比較地址★

物件的比較操作

class Person{
    private String name ;                   // 定義name屬性 
    private int age ;        // 定義age屬性
    public Person(String name,int age){  //透過建構設定屬性內容
        this.name = name ;          //為name屬性設定值
        this.age = age ;                //為age屬性設定值
    }
    public boolean equals(Object obj){              //覆寫Object類別中的equals()方法
        if(this==obj){          // 如果兩個物件的位址相等,則肯定是同一個物件
            return true ;    //肯定為同一對象
        }
        if(!(obj instanceof Person)){    // 判斷傳進來的物件是否是Person的實例

            return false ;                // 如果不是,則直接傳回false
        }
        Person per = (Person) obj ;    // 將傳進來的物件向下轉型
        if(per.name.equals(this.name)&&per.age == this.age){ //一個一個屬性比較,看是否相等
            return true ;    // 依次比較內容 
        }else{
            return false ;
        }
    }
    public String toString(){                           //覆寫toString()方法
        return "姓名:" + this.name + ";年齡:" + this.age ;
    }
};
public class ObjectDemo{
    public static void main(String args[]){
        Person per1 = new Person("賴小明",30) ;     //實例化Person
        Person per2 = new Person("賴小明",30) ;     // 實例化Person
        System.out.println(per1.equals(per2)?"是同一人" : "不是同一個人") ;
        System.out.println(per1.equals("hello")?"是同一人" : "不是同一人") ;
        
    }
};

Object類別是所有的父類別,所有的物件都可以向Object進行轉換,其中包含陣列和介面類別型,一切的參考資料型態都可以使用Object進行接收。

Object接收介面實例

interface A{
    public String getInfo();                //定義抽象方法
}
class B implements A{                                   //子類別實現介面
    public String getInfo(){                 // 覆寫介面中的抽象方法 
        return "Hello World!!!" ;
    }
};
public class ObjectDemo04{
    public static void main(String args[]){
        A a = new B() ;    // 物件向上轉型,為介面產生實體
        Object obj = a ;    // 使用Object接收,物件向上轉型
        A x = (A)obj ;    // 物件向下轉型
        System.out.println(x.getInfo()) ;
    }
};

執行結果:

Hello World!!!

Object接收陣列

public class ObjectDemo{
    public static void main(String args[]){
        int temp[] = {1,3,5,7,9} ;    //定義陣列
        Object obj = temp ;                     // 使用Object接收陣列
        print(obj) ;                                    //傳遞陣列參考 
    }
    public static void print(Object o){                 //接收一個物件
        if(o instanceof int[]){        // 判斷物件的型態
            int x[] = (int[])o ;            //向下轉型
            for(int i=0;i<x.length;i++){    //迴圈輸出
                System.out.print(x[i] + "\t") ;
            }
        }
    }
};

執行結果:

1    3    5    7    9    

結論:

  1. Object類別是所有類別的父類別,只要引用數據類型都可以使用Object進行接收。
  2. 對象在進行向下轉型之前一定要先發生向上轉型,要使用instanceof關鍵字判斷。
  3. toString():對象輸出時調用。
  4. equals():對象比較時調用。
  5. String類別也是Object類別的子類別。

 

 

文章標籤

mingyilai 發表在 痞客邦 留言(0) 人氣()

分析:

  1. 寵物資訊自行設計,簡單設計出名字、顏色、年齡3個屬性。
  2. 寵物類別很多,如貓、狗都屬於寵物,所以寵物是一個標準。
  3. 只要符合此寵物標準都能放進寵物商店。
  4. 要儲存多種寵物就是一個物件陣列,如果寵物個數由使用者決定,則在建立時就要分配好能儲存的寵物個數。

螢幕快照 2016-02-16 上午9.34.27

interface Pet{    // 定義寵物接口

    public String getName() ;

    public String getColor() ;

    public int getAge() ;

}

class Cat implements Pet{    // 貓是寵物,實現介面

    private String name ;    // 寵物名字

    private String color ;    // 寵物顏色

    private int age ;        // 寵物年齡

    public Cat(String name,String color,int age){

        this.setName(name) ;

        this.setColor(color) ;

        this.setAge(age) ;

    }

    public void setName(String name){

        this.name = name ;

    }

    public void setColor(String color){

        this.color = color;

    }

    public void setAge(int age){

        this.age = age ;

    }

    public String getName(){

        return this.name ;

    }

    public String getColor(){

        return this.color ;

    }

    public int getAge(){

        return this.age ;

    }

};

class Dog implements Pet{    // 狗是寵物,實現介面

    private String name ;    // 寵物名字

    private String color ;    // 寵物顏色

    private int age ;        // 寵物年齡

    public Dog(String name,String color,int age){

        this.setName(name) ;

        this.setColor(color) ;

        this.setAge(age) ;

    }

    public void setName(String name){

        this.name = name ;

    }

    public void setColor(String color){

        this.color = color;

    }

    public void setAge(int age){

        this.age = age ;

    }

    public String getName(){

        return this.name ;

    }

    public String getColor(){

        return this.color ;

    }

    public int getAge(){

        return this.age ;

    }

};

class PetShop{    // 寵物商店

    private Pet[] pets ;    // 保存一組寵物

    private int foot ;

    public PetShop(int len){

        if(len>0){

            this.pets = new Pet[len] ;    // 開闢陣列空間

        }else{

            this.pets = new Pet[1] ;    // 至少開闢一個空間

        }

    }

    public boolean add(Pet pet){                //增加寵物

        if(this.foot<this.pets.length){     //判斷寵物商店的寵物是否滿了

            this.pets[this.foot] = pet ;    // 增加寵物

            this.foot ++ ;

            return true ;

        }else{

            return false ;

        }

    }

    public Pet[] search(String keyWord){  //關鍵字尋找

        // 應該確定有多少個寵物符合要求

        Pet p[] = null ;

        int count = 0 ;    // 記錄下有多少個寵物符合查詢結果

        for(int i=0;i<this.pets.length;i++){

            if(this.pets[i]!=null){        // 判斷物件陣列中的內容是否為空

                if(this.pets[i].getName().indexOf(keyWord)!=-1

                    ||this.pets[i].getColor().indexOf(keyWord)!=-1){

                    count++ ;    // 統計符合條件的物個數

                }

            }

        }

        p = new Pet[count] ;    // 根據已經確定的記錄數開闢物件陣列

        int f = 0 ;    // 設定增加的位置標記

        for(int i=0;i<this.pets.length;i++){

            if(this.pets[i]!=null){        // 

                if(this.pets[i].getName().indexOf(keyWord)!=-1

                    ||this.pets[i].getColor().indexOf(keyWord)!=-1){

                    p[f] = this.pets[i] ;  //將符合查詢條件的寵物資訊儲存

                    f++ ;

                }

            }

        }

        return p ;

 

    }

};

public class PetShopDemo{

    public static void main(String args[]){

        PetShop ps = new PetShop(5) ;    // 5個寵物

        ps.add(new Cat(“白貓”,”白色的”,2)) ;    // 增加寵物,成功

        ps.add(new Cat(“黑貓”,”黑色的”,3)) ;    // 增加寵物,成功

        ps.add(new Cat(“花貓”,”花色的”,3)) ;    // 增加寵物,成功

        ps.add(new Dog(“拉布拉多”,”黃色的”,3)) ;    // 增加寵物,成功

        ps.add(new Dog(“金毛”,”金色的”,2)) ;    // 增加寵物,成功

        ps.add(new Dog(“黃狗”,”黑色的”,2)) ;    // 增加寵物,成功

        print(ps.search(“”)) ;     //失敗

    }

    public static void print(Pet p[]){       //輸出操作

        for(int i=0;i<p.length;i++){      //迴圈輸出

            if(p[i]!=null){

                System.out.println(p[i].getName() + “,” + p[i].getColor()

                    +”,” + p[i].getAge()) ;

            }

        }

    }

};

文章標籤

mingyilai 發表在 痞客邦 留言(0) 人氣()

//在排序好的陣列中增加一個數字,增加後的數字插入到陣列合適的位置
        int score[] = {23,54,83,24,56,99,11};  //宣告陣列,不用排列大小
        for (int x = 1; x < score.length; x++) //判斷迴圈
        {
            for (int y = 0 ; y < score.length; y++)
            {
                if (score[x] < score[y])      //數字從小到大排列
                {
                    int temp = score[x];
                    score[x] = score[y];
                    score[y] = temp;
                }
            }
        }
        for (int i = 0; i < score.length; i++)
        {
            System.out.print(score[i] + "\t");
        }
    }

 

文章標籤

mingyilai 發表在 痞客邦 留言(0) 人氣()

    //直角在右上
        int i,j,k;
        int n = 5;//輸入要的層
        for(i = 1 ; i<=n ; i++)//層數的for迴圈
        {
            for( j = 1 ; j <=i ; j++)//根據外層行號,輸出星號左邊空格
                System.out.print(" ");
            for(k = 1 ; k <=n-i+1 ; k++)//根據外層行號,輸出星號個數
                System.out.print("*");
            System.out.println();
        }

    //直角在右下
        int i,j,k;
        int n = 5;//輸入要的層
        for(i = 1 ; i<=n ; i++)//層數的for迴圈
        {
            for( j = 1 ; j <=n-i ; j++)//根據外層行號,輸出星號左邊空格
                System.out.print(" ");
            for(k = 1 ; k <=i ; k++)//根據外層行號,輸出星號個數
                System.out.print("*");
            System.out.println();
        }

    //直角左下及左上
        int c = 5 ; //設定要的層數
        for(int a =1 ; a <= c ; a++)
        {
            for(int b = 1 ; b <=c ; b++ )
             if(a>=b) //if迴圈裡a<=b直角在左上,a>=b直角在左下
                    System.out.print("*");
                System.out.println();
        }

    //等腰三角形

    int i,j,k;
        int n = 5;//輸入要的層
        for(i = 1 ; i<=n ; i++)//層數的for迴圈
        {
            for( j = 1 ; j <=n-i ; j++)//根據外層行號,輸出星號左邊空格
                System.out.print(" ");
            for(k = 1 ; k <=2*i-1 ; k++)//根據外層行號,輸出星號個數
                System.out.print("*");
            System.out.println();
        }

文章標籤

mingyilai 發表在 痞客邦 留言(0) 人氣()


package testdegree;

public class TestDegree {

    public static void main(String[] args) {
        char select;  //宣告字元型別變數
        float fa,ce;    //宣告二個浮點型別變數
        java.util.Scanner sc = new java.util.Scanner(System.in);
        
        System.out.print("A.華氏轉攝氏\nB.攝氏轉華氏\n請選擇 A,B\n");
        //select = (char)System.in.read();  //輸入一個字元的方法
        select = sc.next().charAt(0);  //另一種輸入字元的方法
        switch(select)   //switch 選擇結構,測試變數只可以是字元,整數型別
        {
                  case 'A':
                  case 'a':
                           System.out.print("輸入->華氏溫度:");
                           fa = sc.nextFloat(); //輸入float型別資料
                           ce = (fa-32)*5.0F/9.0F;
                           System.out.println("華氏->攝氏:"+ce);
                           System.out.printf("華氏->攝氏:%.2f\n",ce);  //格式化小數2位 
                           break;
                  case'B':
                  case'b':
                           System.out.print("輸入->攝氏溫度:");
                           ce = sc.nextFloat();
                           fa = ce/5.0F * 9.0F + 32;
                           System.out.println("攝氏->華氏:" +fa);
                           System.out.printf("華氏->攝氏:%5d\n",(int)ce);  //強制轉型為int整數
                           break;
                  default:
                      System.out.println("選擇錯誤");
        }//switch
        System.out.println("程式結束。");
    }
    
}

文章標籤

mingyilai 發表在 痞客邦 留言(0) 人氣()

package testbmi;

 public class TestBMI {
    public static void main(String[] args) {
        java.util.Scanner scan = new java.util.Scanner(System.in);
        //重複迴圈結構
        do{
            //取得輸入資料
            System.out.print("輸入你的體重(公斤):");
            double weight = scan.nextDouble();  //公斤  
            System.out.print("輸入你的身高(公分):");
            double height = scan.nextDouble();  //
            //公分 換算為公尺
            height = height / 100;
            //計算BMI= (體重KG/(身高m*身高m)
            double bmi = weight / (height*height);
            System.out.printf("體重:%2f 公斤 身高:%2f 公尺\n ", weight,height);
            System.out.printf("YourBMI:%.1f", bmi);
            //多條件選擇結構
            if(bmi<18.5){
                System.out.println("體重輕盈,可多吃點!");
            }else if(bmi>18.5 && bmi<=23){
                System.out.println("好身材,保持下去喔!");
            }else if(bmi>23 && bmi<=27){
                System.out.println("有稍微胖,多運動喔!");
            }else if(bmi>27){
                System.out.println("心寬體胖,少吃點吧!");
                javax.swing.JOptionPane.showMessageDialog(null,"Hi\nwhich sport do you like?");
            }else{
                System.out.println("資料錯誤,重新輸入?");
            }
            double perfect = height*height*22;
            System.out.println("你的理想體重:" + (int)perfect + "公斤");
            System.out.println("---------------");
        }while(true);
    }
    
}

文章標籤

mingyilai 發表在 痞客邦 留言(0) 人氣()