- 基本類型的包裝類
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)換
字符串 -> 基本類型
使用包裝類的方法
- 靜態(tài)方法 parseXxx(String s) 除了Character
- 構(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種成員
- 成員變量
- 方法
- 構(gòu)造器 ×
- 初始化塊
- 內(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ì)象
接口用途:
- 定義變量,進(jìn)行強(qiáng)制類型轉(zhuǎn)換
- 調(diào)用接口中定義的常量
- 被其他類實(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