### 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();
? ? ```
? ? ο?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í)際上就是如何合理的去抽象。
? ? ο?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ì)獲得父接口中的一切飞蹂。
? ο?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)
? ο?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();
? ? ? ? }
? ? }
? ? ```