2022-03-30

### Javaben get和set方法

#### 開(kāi)發(fā)中封裝的簡(jiǎn)單規(guī)則:

- 屬性一般使用private 訪問(wèn)權(quán)限。

? 屬性私有后恃鞋, 提供相應(yīng)的 get/set 方法來(lái)訪問(wèn)相關(guān)屬性崖媚,這些方法通常是public 修飾的亦歉,以提供對(duì)屬性的賦值與讀取操作(注意:boolean 變量的get方法是 is 開(kāi)頭!)

? 方法:一些只用于本類的輔助性方法可以用 private 修飾,希望其他類調(diào)用的方法用public修飾畅哑。

? ```java

? package com.company.encapsulation.b;


? //User實(shí)現(xiàn)類肴楷,Javaben 方法公開(kāi),屬性私有

? public class User {

? ? ? private int id;

? ? ? private String name;

? ? ? private boolean man;


? //? ? 創(chuàng)建帶參構(gòu)造器


? ? ? public User(int id, String name, boolean man) {

? ? ? ? ? this.id = id;

? ? ? ? ? this.name = name;

? ? ? ? ? this.man = man;

? ? ? }


? ? ? public void printUserInfo(){

? ? ? ? ? System.out.println(id);

? ? ? ? ? System.out.println(name);

? ? ? ? ? System.out.println(man);

? ? ? }


? ? ? public int getId() {

? ? ? ? ? return id;

? ? ? }


? ? ? public void setId(int id) {

? ? ? ? ? this.id = id;

? ? ? }


? ? ? public String getName() {

? ? ? ? ? return name;

? ? ? }


? ? ? public void setName(String name) {

? ? ? ? ? this.name = name;

? ? ? }


? ? ? public boolean isMan() {

? ? ? ? ? return man;

? ? ? }


? ? ? public void setMan(boolean man) {

? ? ? ? ? this.man = man;

? ? ? }

? }


? //TestUser測(cè)試類

? package com.company.encapsulation.b;


? public class TestUser {

? ? ? public static void main(String[] args) {

? ? ? ? ? User u = new User(100,"xiaoming",true);

? ? ? ? ? System.out.println(u.getName());

? ? ? ? ? System.out.println(u.isMan());

? ? ? }

? }


? ```

------

### 多態(tài)(polymorphism)詳解

- 多態(tài)定義:

? - 多態(tài)指的是同一個(gè)方法調(diào)用,由于對(duì)象不同可能會(huì)有不同的行為。現(xiàn)實(shí)生活中祭椰,同一個(gè)方法,具體實(shí)現(xiàn)會(huì)完全不同呵恢。 比如:同樣是調(diào)用人“吃飯”的方法,中國(guó)人用筷子吃飯媚创,英國(guó)人用刀叉吃飯渗钉,印度人用手吃飯。

- 多態(tài)的要點(diǎn):

? 1. 多態(tài)是方法的多態(tài)钞钙,不是屬性的多態(tài)(多態(tài)與屬性無(wú)關(guān))


? 2. 多態(tài)的存在要有 3 個(gè)必要條件:繼承鳄橘,方法重寫(xiě),父類引用指向子類對(duì)象歇竟。


? 3. 父類引用指向子類對(duì)象后挥唠,用該父類引用調(diào)用子類重寫(xiě)的方法抵恋,此時(shí)多態(tài)就出現(xiàn)了焕议。


? ? ```java

? ? //定義Animal類和繼承重寫(xiě)shout()方法


? ? package com.company.polymorphism;


? ? public class Animal {

? ? ? ? public void shout(){

? ? ? ? ? ? System.out.println("叫了一聲");

? ? ? ? }

? ? }


? ? class Dog extends Animal{

? ? ? ? @Override

? ? ? ? public void shout(){

? ? ? ? ? ? System.out.println("汪汪汪!");

? ? ? ? }


? ? ? ? public void seeDoor(){

? ? ? ? ? ? System.out.println("看門中...");

? ? ? ? }

? ? }


? ? class Cat extends Animal{

? ? ? ? @Override

? ? ? ? public void shout() {

? ? ? ? ? ? System.out.println("喵喵喵弧关!");

? ? ? ? }

? ? }

? ? ------------------------------------------------------------------------------


? ? //測(cè)試不同對(duì)象盅安,調(diào)用相同的方法,產(chǎn)生不同行為

? ? package com.company.polymorphism;


? ? public class TestAnimal {

? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? animalCry(new Dog());

? ? ? ? ? ? animalCry(new Cat());

? ? ? ? ? ? //編譯時(shí)類型? ? ? 運(yùn)行時(shí)類型

? ? ? ? ? ? Animal animal = new Dog();

? ? ? ? ? ? animal.shout();

? ? //? ? ? ? animal.seeDoor();

? ? ? ? }


? ? ? ? static void animalCry(Animal a) {? ? //Animal a = new Dog() 父類引用指向子類對(duì)象

? ? ? ? ? ? System.out.println("TestAnimal.animalCry");

? ? ? ? ? ? a.shout();? //可以出現(xiàn)多態(tài)

? ? ? ? }

? ? }

? ? ```

- 對(duì)象的轉(zhuǎn)型(casting)

? - 父類引用指向子類對(duì)象世囊,我們稱這個(gè)過(guò)程為**向上轉(zhuǎn)型**别瞭,屬于自動(dòng)類型轉(zhuǎn)換。

? - 向上轉(zhuǎn)型后的父類引用變量只能調(diào)用它編譯類型的方法株憾,不能調(diào)用它運(yùn)行時(shí)類型的方法蝙寨。

? ? 這時(shí),我們就需要進(jìn)行類型的強(qiáng)制轉(zhuǎn)換嗤瞎,我們稱之為**向下轉(zhuǎn)型**

? ? ```java

? ? ? ? ? ? //編譯時(shí)類型? ? ? 運(yùn)行時(shí)類型

? ? ? ? ? ? Animal animal = new Dog();? //向上轉(zhuǎn)型(自動(dòng))

? ? ? ? ? ? animal.shout();

? ? ? ? ? ? Dog d = (Dog) animal; //強(qiáng)制向下轉(zhuǎn)型

? ? ? ? ? ? d.seeDoor();

? ? ```

? - 父類引用變量被強(qiáng)制轉(zhuǎn)換成非對(duì)應(yīng)子類對(duì)象墙歪,編譯時(shí)不會(huì)報(bào)錯(cuò),運(yùn)行時(shí)會(huì)報(bào)錯(cuò)贝奇;

? ? ```java

? ? ? ? ? ? //編譯時(shí)不會(huì)報(bào)錯(cuò)虹菲,運(yùn)行時(shí)會(huì)報(bào)錯(cuò):java.lang.ClassCastException

? ? ? ? ? ? Animal animal = new Dog();

? ? ? ? ? ? Cat c =? (Cat) animal;

? ? ? ? ? ? c.catchMouse();

? ? ```

? ? ![image-20220329181206545](面向?qū)ο?assets/image-20220329181206545.png)

? - 解決方法:對(duì)父類引用變量做類型判斷

? ? ```java

? ? ? ? ? ? if(animal instanceof Cat){

? ? ? ? ? ? ? ? Cat c =? (Cat) animal;

? ? ? ? ? ? ? ? c.catchMouse();

? ? ? ? ? ? }

? ? ```


### 抽象類和接口

#### 抽象方法和抽象類

- 抽象方法

? 1. 使用 abstract 修飾的方法,沒(méi)有方法體掉瞳,只有聲明毕源。

? 1. 定義的是一種“規(guī)范”浪漠,就是告訴子類必須要給抽象方法提供具體的實(shí)現(xiàn)。

- 抽象類

? 1. 包含抽象方法的類就是抽象類霎褐。

? 2. 通過(guò)抽象類址愿,我們就可以做到嚴(yán)格限制子類的設(shè)計(jì),使子類之間更加通用瘩欺。

? ? ```java

? ? package com.company.abstractClass;


? ? /**

? ? ? * 測(cè)試抽象類

? ? ? */

? ? public abstract class Animal {

? ? ? ? int age;

? ? ? ? public abstract void rest();

? ? ? ? public abstract void run();

? ? ? ? public void shout(){

? ? ? ? ? ? System.out.println("Animal.shout");

? ? ? ? };

? ? }


? ? class Dog extends Animal{

? ? ? ? @Override

? ? ? ? public void rest() {

? ? ? ? ? ? System.out.println("Dog.rest");

? ? ? ? }


? ? ? ? @Override

? ? ? ? public void run() {

? ? ? ? ? ? System.out.println("Dog.run");

? ? ? ? }

? ? }

? ? class Cat extends Animal{

? ? ? ? @Override

? ? ? ? public void rest() {

? ? ? ? ? ? System.out.println("Cat.rest");

? ? ? ? }


? ? ? ? @Override

? ? ? ? public void run() {

? ? ? ? ? ? System.out.println("Cat.run");

? ? ? ? }

? ? }

? ? ```

- 抽象類的使用要點(diǎn):

? 1. 有抽象方法的類只能定義成抽象類必盖;

? 1. 抽象類不能實(shí)例化,即不能用 new 來(lái)實(shí)例化抽象類俱饿;

? 3. 抽象類可以包含屬性歌粥、方法、構(gòu)造方法拍埠。但是構(gòu)造方法不能用來(lái) new 實(shí)例,

? ? 只能用來(lái)被子類調(diào)用失驶。

? 1. 抽象類只能用來(lái)被繼承。

? 1. 抽象方法必須被子類實(shí)現(xiàn)枣购。

### 接口interface

- 定義定義:

? - 接口就是一組規(guī)范(就像我們?nèi)碎g的法律一樣)所有實(shí)現(xiàn)類都要遵守嬉探。

? - 面向?qū)ο蟮木瑁钅荏w現(xiàn)這一點(diǎn)的就是接口棉圈。為什么我們討論設(shè)計(jì)模式都只針對(duì)具備了抽象能力的語(yǔ)言(比如 C++涩堤、Java、C#等)分瘾,就是因?yàn)樵O(shè)計(jì)模式所研究的胎围,實(shí)際上就是如何合理的去抽象。

? ? ![image-20220329183639201](面向?qū)ο?assets/image-20220329183639201.png)

? 接口的作用

- 為什么需要接口德召?接口和抽象類的區(qū)別白魂?

? - 接口就是比“抽象類”還“抽象”的“抽象類”,可以更加規(guī)范的對(duì)子類進(jìn)行約束上岗。全面地專業(yè)地實(shí)現(xiàn)了:**規(guī)范和具體實(shí)現(xiàn)的分離**福荸。

? - 接口是兩個(gè)模塊之間通信的標(biāo)準(zhǔn),通信的規(guī)范肴掷。如果能把你要設(shè)計(jì)的模塊之間的接口定義好敬锐,就相當(dāng)于完成了系統(tǒng)的設(shè)計(jì)大綱,剩下的就是添磚加瓦的具體實(shí)現(xiàn)了呆瞻。做系統(tǒng)時(shí)往往就是使用“面向接口”的思想來(lái)設(shè)計(jì)系統(tǒng)台夺。

? - **接口和實(shí)現(xiàn)類不是父子關(guān)系,是實(shí)現(xiàn)規(guī)則的關(guān)系**栋烤。比如:定義一個(gè)接口 Runnable谒养,Car 實(shí)現(xiàn)它就能在地上跑,Train 實(shí)現(xiàn)它也能在地上跑,飛機(jī)實(shí)現(xiàn)它也能在地上跑买窟。就是說(shuō)丰泊,如果它是交通工具,就一定能跑始绍,但是一定要實(shí)現(xiàn) Runnable 接口瞳购。

如何定義和使用接口

- 聲明格式:

? - [訪問(wèn)修飾符] interface 接口名 [extends] 父接口 1,父接口 2{

? ? 常量定義;

? ? 方法定義;

? ? }

? - 定義接口的詳細(xì)說(shuō)明:

? ? ? **訪問(wèn)修飾符:**只能是 public 或默認(rèn)亏推。

? ? ? **接口名:**和類名采用相同命名機(jī)制学赛。

? ? ? **extends:**接口可以多繼承。

? ? ? **常量:**接口中的屬性只能是常量吞杭,總是:public static final 修飾盏浇。不寫(xiě)也是。

? ? ? **方法:**接口中的方法只能是:public abstract芽狗。省略的話绢掰,也是 public abstract。

? ? ```java

? ? //定義Volant接口

? ? package com.company.testInterface;


? ? //飛行接口

? ? public interface Volant {

? ? ? ? /*public static final*/ int FLY_HIGHT = 100;


? ? ? ? /*public abstract*/ void fly();

? ? }


? ? //善良接口

? ? interface Honest {

? ? ? ? void helpOther();

? ? }


? ? //GoodMan類實(shí)現(xiàn)Honest接口

? ? class GoodMan implements Honest {

? ? ? ? @Override

? ? ? ? public void helpOther() {

? ? ? ? ? ? System.out.println("樂(lè)于助人");

? ? ? ? }

? ? }


? ? //BirdMan類實(shí)現(xiàn)Volant接口

? ? class BirdMan implements Volant {

? ? ? ? @Override

? ? ? ? public void fly() {


? ? ? ? }

? ? }


? ? /**

? ? * 天使實(shí)現(xiàn)了多個(gè)接口

? ? */

? ? class Angel implements Honest, Volant {

? ? ? ? @Override

? ? ? ? public void fly() {

? ? ? ? ? ? System.out.println("Angel.fly");

? ? ? ? }


? ? ? ? @Override

? ? ? ? public void helpOther() {

? ? ? ? ? ? System.out.println("Angel.helpOther");

? ? ? ? }

? ? }

? ? ------------------------------------------------------------------------------


? ? //測(cè)試類創(chuàng)建實(shí)例童擎,實(shí)現(xiàn)實(shí)例的方法

? ? package com.company.testInterface;


? ? public class TestVolant {

? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? Angel angel = new Angel();

? ? ? ? ? ? angel.fly();

? ? ? ? ? ? angel.helpOther();

? ? ? ? ? ? System.out.println(Volant.FLY_HIGHT);


? ? ? ? ? ? Volant volant = new Angel();

? ? ? ? ? ? volant.fly();

? ? ? ? }

? ? }

? ? ```


- 要點(diǎn):

? - 類通過(guò) **implements** 來(lái)實(shí)現(xiàn)接口中的規(guī)范滴劲。

? -? 接口不能創(chuàng)建實(shí)例,但是可用于聲明引用變量類型顾复。

? - 一個(gè)類實(shí)現(xiàn)了接口班挖,必須實(shí)現(xiàn)接口中所有的方法,并且這些方法只能是 public 的芯砸。

? - JDK1.8(不含8)之前萧芙,接口中只能包含靜態(tài)常量、抽象方法乙嘀,不能有普通屬性末购、構(gòu)造方法破喻、普通方法虎谢。

? - **JDK1.8(含8)后,接口中包含普通的靜態(tài)方法曹质、默認(rèn)方法婴噩。**

- 接口中包含普通的靜態(tài)方法、默認(rèn)方法羽德。

? - 默認(rèn)方法

? ? - Java 8 及以上新版本几莽,允許給接口添加一個(gè)非抽象的方法實(shí)現(xiàn),只需要使用 default 關(guān)

? ? ? 鍵字即可宅静,這個(gè)特征又叫做默認(rèn)方法(也稱為擴(kuò)展方法)章蚣;

? ? - 默認(rèn)方法和抽象方法的區(qū)別是抽象方法必須要被實(shí)現(xiàn),默認(rèn)方法不是姨夹。作為替代方式,

? ? ? 接口可以提供默認(rèn)方法的實(shí)現(xiàn)纤垂,所有這個(gè)接口的實(shí)現(xiàn)類都可以得到默認(rèn)方法矾策。

? ? ? ```java

? ? ? package com.company.testInterface;


? ? ? /**

? ? ? * 測(cè)試接口中的新特性(默認(rèn)方法)

? ? ? */

? ? ? public interface TestDefault {

? ? ? ? ? public void printInfo();

? ? ? ? ? default void moren(){

? ? ? ? ? ? ? System.out.println("測(cè)試默認(rèn)方法");

? ? ? ? ? ? ? System.out.println("TestDefault.moren");

? ? ? ? ? }

? ? ? }


? ? ? class TestDefaultClass implements TestDefault{

? ? ? ? ? @Override

? ? ? ? ? public void printInfo() {

? ? ? ? ? ? ? System.out.println("TestDefaultClass.printInfo");

? ? ? ? ? }

? ? ? }

? ? ? ------------------------------------------------------------------------------

? ? ? //創(chuàng)建TestDefaultClass類對(duì)象,調(diào)用抽象方法printInfo()&默認(rèn)方法moren()峭沦;

? ? ? ? ? ? ? TestDefaultClass tfs = new TestDefaultClass();

? ? ? ? ? ? ? tfs.printInfo();

? ? ? ? ? ? ? tfs.moren();

? ? ? ```

? - 默認(rèn)方法

? ? - JAVA8 以后贾虽,我們也可以在接口中直接定義靜態(tài)方法的實(shí)現(xiàn)。 這個(gè)靜態(tài)方法直接從屬

? ? ? 于接口(接口也是類吼鱼,一種特殊的類)蓬豁,可以通過(guò)接口名調(diào)用。

? ? ? 如果子類中定義了相同名字的靜態(tài)方法菇肃,那就是完全不同的方法了地粪,直接從屬于子類,

? ? ? 可以通過(guò)子類名直接調(diào)用琐谤。

? ? ? ```java

? ? ? package com.company.testInterface;


? ? ? /**

? ? ? * 測(cè)試接口中的新特性(默認(rèn)方法)&靜態(tài)方法

? ? ? */

? ? ? public interface TestDefault {

? ? ? ? ? public void printInfo();


? ? ? ? ? //默認(rèn)方法

? ? ? ? ? default void moren() {

? ? ? ? ? ? ? System.out.println("測(cè)試默認(rèn)方法");

? ? ? ? ? ? ? System.out.println("TestDefault.moren");


? ? ? //? ? ? ? 普通默認(rèn)方法調(diào)用靜態(tài)方法驶忌,可行

? ? ? ? ? ? ? testStatic();

? ? ? ? ? }


? ? ? ? ? //靜態(tài)方法

? ? ? ? ? static void testStatic() {

? ? ? ? ? ? ? System.out.println("TestDefault.testStatic");

? ? ? //? ? ? ? 靜態(tài)方法不能調(diào)用默認(rèn)方法,不可行

? ? ? //? ? ? ? moren();

? ? ? ? ? }

? ? ? }


? ? ? class TestDefaultClass implements TestDefault {

? ? ? ? ? @Override

? ? ? ? ? public void printInfo() {

? ? ? ? ? ? ? System.out.println("TestDefaultClass.printInfo");

? ? ? ? ? }


? ? ? ? ? static void testStatic() {

? ? ? ? ? ? ? System.out.println("TestDefaultClass.testStatic");

? ? ? ? ? }

? ? ? }

? ? ? ------------------------------------------------------------------------------


? ? ? //接口靜態(tài)方法測(cè)試類

? ? ? package com.company.testInterface;


? ? ? public class Test {

? ? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? ? TestDefaultClass tdc = new TestDefaultClass();

? ? ? ? ? ? ? tdc.printInfo();

? ? ? ? ? ? ? //調(diào)用默認(rèn)方法

? ? ? ? ? ? ? tdc.moren();

? ? ? ? ? ? ? //調(diào)用從屬于接口的靜態(tài)方法

? ? ? ? ? ? ? TestDefault.testStatic();

? ? ? ? ? ? ? //調(diào)用子類的testStatic靜態(tài)方法

? ? ? ? ? ? ? TestDefaultClass.testStatic();

? ? ? ? ? }

? ? ? }

? ? ? ```

### 接口的多繼承

- 接口支持多繼承笑跛,和類的繼承類似付魔,子接口 extends 父接口,會(huì)獲得父接口中的一切飞蹂。

? ![image-20220330112115349](面向?qū)ο?assets/image-20220330112115349.png)

? ```java

? package com.company.testInterface;


? public class TestMultipleInheritance {

? ? ? public static void main(String[] args) {

? ? ? ? ? CImpl c = new CImpl();

? ? ? ? ? c.testA();

? ? ? ? ? c.testB();

? ? ? ? ? c.testC();

? ? ? }

? }


? interface A {

? ? ? void testA();

? };


? interface B {

? ? ? void testB();

? };


? interface C extends A, B {

? ? ? void testC();

? };


? class CImpl implements C {


? ? ? @Override

? ? ? public void testA() {

? ? ? ? ? System.out.println("CImpl.testA");

? ? ? }


? ? ? @Override

? ? ? public void testB() {

? ? ? ? ? System.out.println("CImpl.testB");

? ? ? }


? ? ? @Override

? ? ? public void testC() {

? ? ? ? ? System.out.println("CImpl.testC");

? ? ? }

? }

? ```

### 字符串String類詳解

- String是最常用的類几苍,要掌握String類常見(jiàn)的方法,它底層實(shí)現(xiàn)也需要掌握好陈哑,不然在工作開(kāi)發(fā)中很容易犯錯(cuò)妻坝。

- String:就是把一堆字符串起來(lái),統(tǒng)一使用惊窖。

? - String 類又稱作**不可變字符序列**刽宪。

? - String 位于 java.lang 包中,Java 程序默認(rèn)導(dǎo)入 java.lang 包下的所有類界酒。

? - Java 字符串就是**Unicode字符序列**圣拄,例如字符串“Java”就是4個(gè)Unicode字符'J'、' a'毁欣、' v'庇谆、' a'組成的。

? - Java 沒(méi)有內(nèi)置的字符串類型凭疮,而是在標(biāo)準(zhǔn) Java 類庫(kù)中提供了一個(gè)預(yù)定義的類String饭耳,每個(gè)用雙引號(hào)括起來(lái)的字符串都是 String 類的一個(gè)實(shí)例。

? ? ```java

? ? package com.company.oop;


? ? public class TestString {

? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? String s0 = null;

? ? ? ? ? ? String s1 = "";

? ? ? ? ? ? String s2 = "java";

? ? ? ? ? ? String s3 = new String("java");


? ? ? ? ? ? System.out.println(s1.length());

? ? ? ? ? ? System.out.println(s2.length());


? ? //? ? ? ? 調(diào)用空字符串方法执解,會(huì)報(bào)空指針異常

? ? //? ? ? ? System.out.println(s0.length());

? ? ? ? ? ? System.out.println("============字符串相等的問(wèn)題============");

? ? ? ? ? ? String g1 = "hello world";

? ? ? ? ? ? String g2 = "hello world";

? ? ? ? ? ? String g3 = new String("hello world");

? ? ? ? ? ? System.out.println(g1 == g2);

? ? ? ? ? ? System.out.println(g1 == g3);

? ? ? ? ? ? System.out.println(g1.equals(g3));

? ? ? ? }

? ? }

? ? ```

### String類常用的方法

String類是我們最常使用的類寞肖。列出常用的方法,請(qǐng)大家熟悉。

>String類的常用方法列表

>

>| 常用方法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 解釋說(shuō)明? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

>| :----------------------------------------------------------- | :----------------------------------------------------------- |

>| **[charAt](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#charAt-int-)**(int index) | 返回字符串中第index個(gè)字符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

>| **[equals](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#equals-java.lang.Object-)**([Object](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) anObject) | 如果字符串與 other 相等新蟆,返回true;否則返回false? ? ? ? ? ? ? |

>| **[equalsIgnoreCase](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#equalsIgnoreCase-java.lang.String-)**([String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) anotherString) | 如果字符串與 other 相等(忽略大小寫(xiě))耕姊,則返回true,否則返回 false栅葡。 |

>| **[indexOf](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#indexOf-java.lang.String-)**([String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) str) | 返回從頭開(kāi)始查找第一個(gè)子字符串 str 在字符串中的索引位置茉兰。如果未找到子字符串 str,則返回-1。 |

>| **[lastIndexOf](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#lastIndexOf-java.lang.String-)**([String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) str) | 返回從末尾開(kāi)始查找第一個(gè)子字符串 str 在字符串中的索引位置欣簇。如果未找到子字符串 str,則返回-1规脸。 |

>| **[length](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#length--)**() | 返回字符串的長(zhǎng)度? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |

>| **[replace](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#replace-char-char-)**(char oldChar, char newChar) | 返回一個(gè)新串,它是通過(guò)用newChar替換此字符串中出現(xiàn)的所有 oldChar 而生成的。 |

>| **[startsWith](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#startsWith-java.lang.String-)**([String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) prefix) | 如果字符串以prefix開(kāi)始熊咽,則返回true莫鸭。? ? ? ? ? ? ? ? ? ? ? ? |

>| **[endsWith](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#endsWith-java.lang.String-)**([String](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html) suffix) | 如果字符串以prefix結(jié)尾,則返回true,? ? ? ? ? ? ? ? ? ? ? ? ? |

>| **[substring](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#substring-int-)**(int beginIndex) | 返回一個(gè)新字符串横殴,該串包含從原始字符串beginlndex到串尾被因。? ? |

>| **[substring](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#substring-int-int-)**(int beginIndex, int endIndex) | 返回一個(gè)新字符串,該串包含從原始字符串beginlndex到串尾或endIndex-1的所有字符衫仑。 |

>| **[toLowerCase](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#toLowerCase--)**() | 返回一個(gè)新字符串梨与,該串將原始字符串中的所有大寫(xiě)改成小寫(xiě)字母。 |

>| **[toUpperCase](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#toUpperCase--)**() | 返回一個(gè)新字符串文狱,該串將原始字符串中的所有小寫(xiě)改成大寫(xiě)字母粥鞋。 |

>| **[trim](https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#trim--)**() | 返回一個(gè)新字符串,該串刪除了原始字符串頭部和尾部的空格瞄崇。? ? |

>

>

### 內(nèi)部類

- 我們把一個(gè)類放在另一個(gè)類的內(nèi)部定義呻粹,稱為內(nèi)部類(inner class)

? ![image-20220330164529828](面向?qū)ο?assets/image-20220330164529828.png)

> 內(nèi)部類的兩個(gè)要點(diǎn):

- 內(nèi)部類提供了更好的封裝。只能讓外部類直接訪問(wèn)苏研,不允許同一個(gè)包中的其他類直接訪問(wèn)等浊。

- 內(nèi)部類可以直接訪問(wèn)外部類的私有屬性,內(nèi)部類被當(dāng)成其外部類的成員摹蘑。但外部類不能訪問(wèn)內(nèi)部類的內(nèi)部屬性筹燕。

> 注意

- 內(nèi)部類只是一個(gè)編譯時(shí)概念,一旦我們編譯成功纹蝴,就會(huì)成為完全不同的兩個(gè)類庄萎。對(duì)于一個(gè)名為Outer的外部類和其內(nèi)部定義的名為Inner的內(nèi)部類.編譯完成后會(huì)出現(xiàn)Outer.class和Outer$Inner.class兩個(gè)類的字節(jié)碼文件踪少。所以內(nèi)部類是相對(duì)獨(dú)立的一種存在塘安,其成員變量/方法名可以和外部類的相同。

- 非靜態(tài)內(nèi)部類

? - **非靜態(tài)內(nèi)部類(外部類里使用非靜態(tài)內(nèi)部類和平時(shí)使用其他類沒(méi)什么不同)**

? ? - 非靜態(tài)內(nèi)部類對(duì)象必須寄存在一個(gè)外部類對(duì)象里援奢。因此兼犯,如果有一個(gè)非靜態(tài)內(nèi)部類

? ? ? 對(duì)象那么一定存在對(duì)應(yīng)的外部類對(duì)象。非靜態(tài)內(nèi)部類對(duì)象單獨(dú)屬于外部類的某個(gè)對(duì)

? ? ? 象。

? ? - 非靜態(tài)內(nèi)部類可以直接訪問(wèn)外部類的成員切黔,但是外部類不能直接訪問(wèn)非靜態(tài)內(nèi)部類

? ? ? 成員砸脊。

? ? - 非靜態(tài)內(nèi)部類不能有靜態(tài)方法、靜態(tài)屬性和靜態(tài)初始化塊纬霞。

? ? - 成員變量訪問(wèn)要點(diǎn):

? ? ? - 1.內(nèi)部類屬性:this.變量名凌埂。

? ? ? - 2.外部類屬性:外部類名.this.變量名。

? ? - 內(nèi)部類的訪問(wèn)

? ? ? - 1.外部類中定義內(nèi)部類:new Inner()诗芜。

? ? ? - 2.外部類以外的地方使用非靜態(tài)內(nèi)部類:Outer.Inner varname new Outer().new Inner()

? - ```java

? ? /**

? ? *測(cè)試非靜態(tài)內(nèi)部類

? ? */

? ? package com.company.innerClass;

? ? //測(cè)試內(nèi)部類的用法

? ? public class Outer {

? ? ? ? private int age = 10;

? ? ? ? public void show(){

? ? ? ? ? ? System.out.println("Outer.show");

? ? ? ? ? ? System.out.println(age);

? ? ? ? ? ? //外部類中定義內(nèi)部類:

? ? ? ? ? ? Inner i = new Inner();

? ? ? ? ? ? System.out.println(i.age);

? ? ? ? }


? ? ? ? public class Inner{

? ? ? ? ? ? int age = 20;

? ? ? ? ? ? public void show(){

? ? ? ? ? ? ? ? System.out.println("Innner.show");

? ? ? ? ? ? ? ? System.out.println(age);

? ? ? ? ? ? ? ? System.out.println(Outer.this.age);

? ? ? ? ? ? ? ? Outer.this.show();

? ? ? ? ? ? }

? ? ? ? }

? ? }



? ? //測(cè)試類

? ? package com.company.innerClass;


? ? public class TestOuter {

? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? Outer o = new Outer();

? ? ? ? ? ? //外部類以外的地方使用非靜態(tài)內(nèi)部類:Outer.Inner varname = new Outer().new Inner().

? ? ? ? ? ? Outer.Inner i = new Outer().new Inner();

? ? ? ? ? ? i.show();

? ? ? ? }

? ? }

? ? ```

- 靜態(tài)內(nèi)部類

? - 定義方式

? ? static class ClassName{

? ? //實(shí)體

? ? }

? - 使用要點(diǎn):

? ? - 靜態(tài)內(nèi)部類可以訪問(wèn)外部類的靜態(tài)成員瞳抓,不能訪問(wèn)外部類的普通成員。

? ? - 靜態(tài)內(nèi)部類看做外部類的一個(gè)靜態(tài)成員伏恐。

? ? ```java

? ? package com.company.innerClass;


? ? /**

? ? * 測(cè)試靜態(tài)內(nèi)部類

? ? */


? ? class Outer2 {

? ? ? ? private int a= 10;

? ? ? ? private static int b= 20;

? ? /**

? ? *相當(dāng)于外部類的一個(gè)靜態(tài)成員

? ? */

? ? ? ? static class Inner2{

? ? ? ? ? ? public void test(){

? ? //? ? ? ? ? ? System.out.println(a); 靜態(tài)內(nèi)部類不能訪問(wèn)外部類的普通成員孩哑。

? ? ? ? ? ? ? ? //靜態(tài)內(nèi)部類可以訪問(wèn)外部類的靜態(tài)成員

? ? ? ? ? ? ? ? System.out.println(b);

? ? ? ? ? ? }

? ? ? ? }

? ? }


? ? /**

? ? * @author lishuai

? ? */

? ? public class TestStaticInnerClass{

? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? //通過(guò)new 外部類名.內(nèi)部類名()來(lái)創(chuàng)建內(nèi)部類對(duì)象

? ? ? ? ? ? Outer2.Inner2 i2 = new Outer2.Inner2();

? ? ? ? ? ? i2.test();

? ? ? ? }

? ? }

? ? ```

- 匿名內(nèi)部類

? - 適合那種只需要使用一次的類。比如:鍵盤監(jiān)聽(tīng)操作等等翠桦。在安卓開(kāi)發(fā)横蜒、awt、swing開(kāi)發(fā)中常見(jiàn)销凑。

? - 語(yǔ)法

? ? new 父類構(gòu)造器(實(shí)參類表)\實(shí)現(xiàn)接口(){

? ? //匿名內(nèi)部類類體丛晌!

? ? }

? ? ```java

? ? package com.company.innerClass;


? ? /**

? ? * 測(cè)試匿名內(nèi)部類

? ? */

? ? public class TestAnonymousInnerClass {


? ? ? ? public void test1(A a) {

? ? ? ? ? ? a.run();

? ? ? ? }


? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? TestAnonymousInnerClass t = new TestAnonymousInnerClass();

? ? ? ? ? ? t.test1(new A() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? System.out.println("第一個(gè)匿名內(nèi)部類");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? ? ? t.test1(new A() {

? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? public void run() {

? ? ? ? ? ? ? ? ? ? System.out.println("第二個(gè)匿名內(nèi)部類");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? });

? ? ? ? }

? ? }


? ? interface A {

? ? ? ? void run();

? ? }

? ? ```


- 局部?jī)?nèi)部類

? - 定義在方法內(nèi)部的,作用域只限于本方法斗幼,稱為局部?jī)?nèi)部類茵乱。

? - 局部?jī)?nèi)部類在實(shí)際開(kāi)發(fā)中應(yīng)用很少。

? ? ```java

? ? package com.company.innerClass;


? ? /**

? ? * 測(cè)試局部?jī)?nèi)部類

? ? */

? ? class TestLocalInnerClass {

? ? ? ? public void show(){

? ? ? ? ? ? //作用域僅限于該方法

? ? ? ? ? ? class Inner{

? ? ? ? ? ? ? ? public void fun(){

? ? ? ? ? ? ? ? ? ? System.out.println("Inner.show");

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? new Inner().fun();

? ? ? ? }


? ? ? ? public static void main(String[] args) {

? ? ? ? ? ? TestLocalInnerClass tlic = new TestLocalInnerClass();

? ? ? ? ? ? tlic.show();

? ? ? ? }

? ? }

? ? ```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末孟岛,一起剝皮案震驚了整個(gè)濱河市瓶竭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渠羞,老刑警劉巖斤贰,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異次询,居然都是意外死亡荧恍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門屯吊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)送巡,“玉大人,你說(shuō)我怎么就攤上這事盒卸∑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵蔽介,是天一觀的道長(zhǎng)摘投。 經(jīng)常有香客問(wèn)我煮寡,道長(zhǎng),這世上最難降的妖魔是什么犀呼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任幸撕,我火速辦了婚禮,結(jié)果婚禮上外臂,老公的妹妹穿的比我還像新娘坐儿。我一直安慰自己,他們只是感情好宋光,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布挑童。 她就那樣靜靜地躺著,像睡著了一般跃须。 火紅的嫁衣襯著肌膚如雪站叼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天菇民,我揣著相機(jī)與錄音尽楔,去河邊找鬼。 笑死第练,一個(gè)胖子當(dāng)著我的面吹牛阔馋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娇掏,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呕寝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了婴梧?” 一聲冷哼從身側(cè)響起下梢,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塞蹭,沒(méi)想到半個(gè)月后孽江,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡番电,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年岗屏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漱办。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡这刷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娩井,到底是詐尸還是另有隱情暇屋,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布撞牢,位于F島的核電站率碾,受9級(jí)特大地震影響叔营,放射性物質(zhì)發(fā)生泄漏屋彪。R本人自食惡果不足惜所宰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畜挥。 院中可真熱鬧仔粥,春花似錦、人聲如沸蟹但。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)华糖。三九已至麦向,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間客叉,已是汗流浹背诵竭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兼搏,地道東北人卵慰。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像佛呻,于是被迫代替她去往敵國(guó)和親裳朋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容