第6章 面向?qū)ο螅ㄏ拢?/h2>
  • 基本類型的包裝類
    final修飾
    • 變量 不允許重新賦值
    • 方法 子類不能覆蓋
    • 類 不能派生子類
      abstract 抽象類:多個(gè)類的模板
      interface 接口:多類應(yīng)該遵守的規(guī)范
      lambda表達(dá)式
      enum枚舉類:不能自由創(chuàng)建對(duì)象的類,對(duì)象在定義類時(shí)已固定(class季節(jié),能創(chuàng)建的實(shí)例有限且確定)

  • 包裝類可實(shí)現(xiàn)基本類型變量和字符串之間的轉(zhuǎn)換
    字符串 -> 基本類型
    使用包裝類的方法
  1. 靜態(tài)方法 parseXxx(String s) 除了Character
  2. 構(gòu)造器 Xxx(String s)
    基本類型 -> 字符串
    String.valueOf(x);
    基本類型+"";
String intStr = "123";
int it1 = Integer.parseInt(intStr);
int it2 = new Integer(intStr);
String s = String.valueof(true);
String str = 基本類型 + "";

系統(tǒng)把-128~127存在cache數(shù)組,所以不用新建對(duì)象。

//ina == inb
Integer ina = 2;
Integer inb = 2;
//biga != bigb
Integer biga = 128;
Integer bigb = 128;

所以包裝類都有一個(gè)compare方法
Boolean.compare(true, false); true> false輸出1

6.2處理對(duì)象

打印對(duì)象和toString方法
object類提供的toString方法返回“類名+@+hashCode”

string不能用==判斷,要用equals
new String("hello");一用產(chǎn)生兩個(gè)字符串對(duì)象(“hello”在常量池)
在編譯時(shí)就能確定下來(lái)的,在常量池,不產(chǎn)生多個(gè)副本

6.3類成員

static修飾的成員:類變量,類方法,初始化塊,不能修飾構(gòu)造器

java類中只包含5種成員

  1. 成員變量
  2. 方法
  3. 構(gòu)造器 ×
  4. 初始化塊
  5. 內(nèi)部類(接口,枚舉)
    除了3都可以用static修飾
    類成員不能訪問(wèn)實(shí)例成員
6.3.2單例類

只允許創(chuàng)建一個(gè)實(shí)例的類,構(gòu)造器private

6.4final

final修飾的成員變量必須由程序員顯式的指定初始值,系統(tǒng)不會(huì)隱式初始。
6.4.4可執(zhí)行“宏替換”的final變量
final變量相當(dāng)于一個(gè)常量:
使用final && 定義final變量時(shí)指定了初始值 && 該初始值在編譯時(shí)就被確定下來(lái)了。

  • fina方法不能被重寫(xiě): Object getClass()
  • final類不能有子類(不能被繼承)
6.4.7不可變類

類中只有setter沒(méi)有g(shù)etter
但是類的組合的時(shí)候 a由b組成,需要new b 傳入a,此時(shí)b改變了,會(huì)改變a的值(圖
在a中
private final Name name;
構(gòu)造函數(shù) this.name = new Name(name.getName()) //new一個(gè)新的
getter中返回一個(gè) return new Name(name.getName());防止把成員變量返回出去被修改。

6.4.8緩存實(shí)例的不可變類
codes\06\6.4\CacheImmututaleTest.java
codes\06\6.4\IntegerCacheTest.java
6.5抽象類 一種模板模式的設(shè)計(jì)

抽象類和抽象方法:抽象類里可以沒(méi)有抽象方法,抽象方法必須在抽象類里。

  • 抽象方法不能有方法體
  • 抽象類不能被實(shí)例化
    得 抽象方法,失 創(chuàng)建實(shí)例
package six;

public abstract class Shape {
    {
        System.out.println("執(zhí)行shape的初始化塊");
    }
    public abstract double calPerimeter();
    public abstract String getTYpe();
    private String color;
    public Shape(){}
    public Shape(String color) {
        System.out.println("執(zhí)行shape的構(gòu)造器");
        this.color = color;
    }
}
-------------------------------------
package six;

public class Triangle extends Shape {
    private double a;
    private double b;
    private double c;
    public Triangle(String color, double a, double b, double c) {
        super(color);
        this.setSides(a, b, c);
    }
    public void setSides(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }
    public  double calPerimeter() {
        return a + b + c;
    }
    public  String getTYpe() {
        return "三角形";
    }
    public static void main(String[] args) {
        Shape s1 = new Triangle("red", 3, 4, 5);
        System.out.println(s1.getTYpe());
        System.out.println(s1.calPerimeter());
    }
}

使用abstract修飾類時(shí),表明這個(gè)類只能被繼承,使用abstract修飾方法時(shí),表明這個(gè)方法必須由子類提供實(shí)現(xiàn)(重寫(xiě))
final永遠(yuǎn)不能和abstract同時(shí)使用。
static 和 abstract 不能同時(shí)修飾某方法。沒(méi)有類抽象方法,但可以同時(shí)修飾內(nèi)部類。
private和abstract不能同時(shí)修飾方法。

接口:修飾符 省略/public

不包含構(gòu)造器,初始化塊

  • 成員變量(only靜態(tài)常量)自動(dòng)增加public static final修飾
    public static final int MAX_SIZE = 50;
  • 方法 (only抽象實(shí)例方法,類方法,默認(rèn)方法default修飾)public abstract
  • 內(nèi)部類(內(nèi)部接口,枚舉)public static
    接口可被當(dāng)做一個(gè)特殊的類,java 源文件中最多只能有一個(gè)public接口。
    默認(rèn)方法必須使用default修飾,不能用static修飾,不能直接使用借口來(lái)調(diào)用,使用接口的實(shí)現(xiàn)類的實(shí)例來(lái)調(diào)用。
package six.lee;

public interface Output {
    //接口里的成員變量默認(rèn)public static final ?。。?    int MAX_CACHE_LINE = 50;
    //接口里的普通方法默認(rèn)public abstract
    void out();
    void getData(String msg);
    //在接口中定義默認(rèn)方法,需要使用default修飾
    default void print(String... msgs) { //神奇的用法...
        for (String msg : msgs) {
            System.out.println(msg);
        }
    }
    //在接口中定義默認(rèn)方法,需要使用default修飾
    default void test() {
        System.out.println("默認(rèn)的test()方法");
    }
    //接口里定義的類方法,需要static修飾
    static String staticTest() {
        return "接口里的類方法";
    }
}
-----------------
package six.yeeku;

public class OutputFieldTest {
    public static void main(String[] args) {
        System.out.println(six.lee.Output.MAX_CACHE_LINE);
        //Output.MAX_CACHE_LINE = 20;   不能為final變量賦值
        System.out.println(six.lee.Output.staticTest());

    }
}
輸出:
50
接口里的類方法
接口的繼承

相當(dāng)于繼承了一個(gè)徹底的抽象類(除了默認(rèn)方法,所有方法都是抽象abstract方法)

使用接口:

不能創(chuàng)建實(shí)例,但可以用于聲明引用類型變量,指向其實(shí)現(xiàn)類的對(duì)象
接口用途:

  1. 定義變量,進(jìn)行強(qiáng)制類型轉(zhuǎn)換
  2. 調(diào)用接口中定義的常量
  3. 被其他類實(shí)現(xiàn)
  • 實(shí)現(xiàn)接口方法時(shí),必須用public
package six.lee;

public interface Output {
    //接口里的成員變量默認(rèn)public static final
    int MAX_CACHE_LINE = 50;
    //接口里的普通方法默認(rèn)public abstract
    void out();
    void getData(String msg);
    //在接口中定義默認(rèn)方法,需要使用default修飾,不能用static修飾,不能直接用接口調(diào)用,要用實(shí)現(xiàn)類的對(duì)象調(diào)用
    default void print(String... msgs) {
        for (String msg : msgs) {
            System.out.println(msg);
        }
    }
    //在接口中定義默認(rèn)方法,需要使用default修飾
    default void test() {
        System.out.println("默認(rèn)的test()方法");
    }
    //接口里定義的類方法,需要static修飾
    static String staticTest() {
        return "接口里的類方法";
    }
}
-------------------------------
package six.lee;

interface Product {
    int getProduceTime();
}
public class Printer implements Output, Product{

    private String[] printData = new String[MAX_CACHE_LINE];
    private int dataNum = 0;

    //實(shí)現(xiàn)接口的方法必須加上public,不能省略
    public void out() {
        while (dataNum > 0) {
            System.out.println("打印機(jī)打?。? + printData[0]);
            System.arraycopy(printData, 1, printData, 0, --dataNum);
        }
    }
    public void getData(String msg) {
        if (dataNum >= MAX_CACHE_LINE) {
            System.out.println("輸出隊(duì)列已經(jīng)滿了,添加失敗");
        } else {
            printData[dataNum++] = msg;
        }
    }
    public int getProduceTime() {
        return 45;
    }
    public static void main(String[] args) {
        Output o = new Printer();
        o.getData("豬豬俠");
        o.getData("中二少年");
        o.out();
        o.getData("我的");
        o.getData("什么是AJAX");
        o.out();
        o.print("白敬亭", "小白", "陸之昂");
        o.test();
        Product p = new Printer();
        System.out.println(p.getProduceTime());
        Object obj = p;


    }
}
輸出:
打印機(jī)打?。贺i豬俠
打印機(jī)打印:中二少年
打印機(jī)打?。何业?打印機(jī)打?。菏裁词茿JAX
白敬亭
小白
陸之昂
默認(rèn)的test()方法
45
6.6.5接口和抽象類

接口總綱,抽象類中間產(chǎn)品

6.6.6面向接口編程

設(shè)計(jì)模式:對(duì)經(jīng)常出現(xiàn)的軟件設(shè)計(jì)問(wèn)題的成熟解決方案,實(shí)際上是對(duì)特定問(wèn)題的一種慣性思維。理解好必須要有代碼積累量。

1. 簡(jiǎn)單工廠模式
2. 命令模式 interesting

某方法 完成 某行為,該行為的具體實(shí)現(xiàn)必須等執(zhí)行時(shí)才確定。

  • java8中通過(guò)Lambda表達(dá)式可以傳入代碼塊作為參數(shù)。
public interface Command {
    //普通方法 public abstract
    void process(int[] target);
}
----------------------
public class ProcessArray {
    void process(int[] target, Command c) {
        c.process(target);
    }
}
------------------------
public class PrintCommand implements Command{
    public void process(int[] target) {
        for (int i : target) {
            System.out.println("迭代打印數(shù)組元素" + i);
        }
    }
}
-------------------------
public class AddCommand implements Command{
    public void process(int[] target) {
        int sum = 0;
        for (int i : target) {
            sum += i;
        }
        System.out.println("數(shù)組總和" + sum);
    }
}
-----------------------------
public class CommandTest {
    public static void main(String[] args) {
        ProcessArray p = new ProcessArray();
        int[] arr = {1, 2, 3, 4, 5};
        p.process(arr, new AddCommand());
        p.process(arr, new PrintCommand());
    }
}
輸出:
數(shù)組總和15
迭代打印數(shù)組元素1
迭代打印數(shù)組元素2
迭代打印數(shù)組元素3
迭代打印數(shù)組元素4
迭代打印數(shù)組元素5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容