日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java --- 基础学习Ⅱ

發(fā)布時(shí)間:2023/12/10 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java --- 基础学习Ⅱ 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

繼承

繼承概述

下面有一個(gè)學(xué)生類(lèi)

public class Student{private String name;private int age;public void study(){System.out.println("努力學(xué)習(xí)了");}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age = age;} }

還有一個(gè)老師類(lèi)

public class Teacher {private String name;private int age;public void teach(){System.out.println("教書(shū)育人");}public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age =age;} }

其中有許多相同的特征,可以提取出來(lái)變?yōu)橐粋€(gè)單獨(dú)的類(lèi)

public class Person{private String name;private int age;public String getName(){return name;}public void setName(String name){this.name = name;}public int getAge(){return age;}public void setAge(int age){this.age =age;} }

【繼承】: 是面向?qū)ο笕筇卣髦弧?梢允沟米宇?lèi)具有父類(lèi)的屬性和方法,還可以在子類(lèi)中重新定義,追加屬性和方法。

使用繼承實(shí)現(xiàn)上面的類(lèi)

public class Teacher extends Person{public void teach(){System.out.println("教書(shū)育人");} }

【繼承的好處和弊端】

繼承好處:

  • 提高了代碼的復(fù)用性(多個(gè)類(lèi)相同的成員可以放到同一個(gè)類(lèi)中)
  • 提高了代碼的維護(hù)性(如果方法的代碼需要修改,修改一處即可)

繼承弊端:

  • 繼承讓類(lèi)與類(lèi)之間產(chǎn)生了關(guān)系,類(lèi)的耦合性增強(qiáng)了,當(dāng)父類(lèi)發(fā)生變化時(shí)子類(lèi)實(shí)現(xiàn)也不得不跟著變化,削弱了子類(lèi)的獨(dú)立性

繼承中變量的訪問(wèn)特點(diǎn)

在子類(lèi)方法中訪問(wèn)一個(gè)變量

  • 子類(lèi)局部范圍找
  • 子類(lèi)成員范圍找
  • 父類(lèi)成員范圍找
  • 如果都沒(méi)有就報(bào)錯(cuò)(不考慮父親的父親…)

Super

public class Zi extends Fu {public int age = 20;public void show() {int age = 30;System.out.println(age + ",局部變量");// 我要訪問(wèn)本壘的成員變量age,怎么辦呢?System.out.println(this.age + ",子類(lèi)的成員變量");// 我要訪問(wèn)父類(lèi)的成員變量age, 怎么辦呢?System.out.println(super.age + ",父類(lèi)的成員變量");} }

super關(guān)鍵字的用法和this關(guān)鍵字的用法相似

  • this: 代表本類(lèi)對(duì)象的引用
  • super: 代表父類(lèi)存儲(chǔ)空間的標(biāo)識(shí)(可以理解為父類(lèi)對(duì)象引用)
關(guān)鍵字訪問(wèn)成員變量訪問(wèn)構(gòu)造方法訪問(wèn)成員方法
thisthis.成員變量,訪問(wèn)本類(lèi)成員變量this(…)訪問(wèn)本類(lèi)構(gòu)造方法this.成員方法()訪問(wèn)本類(lèi)成員方法
supersuper.成員變量: 訪問(wèn)父類(lèi)成員變量super(…)訪問(wèn)父類(lèi)構(gòu)造方法super.成員方法(…): 訪問(wèn)父類(lèi)成員方法

繼承中構(gòu)造方法的訪問(wèn)特點(diǎn)

子類(lèi)中所有的構(gòu)造方法默認(rèn)都會(huì)訪問(wèn)父類(lèi)中無(wú)參的構(gòu)造方法.

  • 因?yàn)樽宇?lèi)會(huì)繼承父類(lèi)中的數(shù)據(jù),可能還會(huì)使用父類(lèi)的數(shù)據(jù)。所以,子類(lèi)初始化之前,一定要先完成父類(lèi)數(shù)據(jù)的初始化。

  • 每一個(gè)子類(lèi)的構(gòu)造方法的第一條語(yǔ)句,默認(rèn)都是: super()

如果父類(lèi)中沒(méi)有無(wú)參構(gòu)造方法,只有帶參構(gòu)造方法,該怎么辦呢?

  • 通過(guò)使用super關(guān)鍵字去顯示的調(diào)用父類(lèi)的帶參構(gòu)造方法
  • 在父類(lèi)中自己提供一個(gè)無(wú)參構(gòu)造方法(推薦)

繼承中成員方法的訪問(wèn)特點(diǎn)

通過(guò)子類(lèi)對(duì)象訪問(wèn)一個(gè)方法

  • 子類(lèi)成員范圍找
  • 父類(lèi)成員范圍找
  • 如果沒(méi)有就報(bào)錯(cuò)(不考慮父親的父親)

方法重寫(xiě)

方法重寫(xiě): 子類(lèi)中出現(xiàn)了和父類(lèi)中一模一樣的方法聲明的現(xiàn)象

方法重寫(xiě)的應(yīng)用: 當(dāng)子類(lèi)需要父類(lèi)的功能,而功能主體子類(lèi)有自己的特有內(nèi)容時(shí),可以重寫(xiě)父類(lèi)中的方法,這樣,即沿襲了父類(lèi)的功能,又定義了子類(lèi)特有的內(nèi)容

public class Phone {public void call(String name) {System.out.println("給" + name + "打電話");} } public class NewPhone extends Phone {// 在子類(lèi)中重寫(xiě)call功能@Overridepublic void call(String name) {System.out.println("開(kāi)啟視頻功能");super.call(name);} }

方法重寫(xiě)注意事項(xiàng)

  • 父類(lèi)中的私有內(nèi)容,子類(lèi)中是繼承不到的

  • 子類(lèi)方法訪問(wèn)權(quán)限不能更低 (public > 默認(rèn) > 私有)

Java中繼承的注意事項(xiàng)

  • Java中類(lèi)只支持單繼承,不支持多繼承
  • Java中類(lèi)支持多層繼承
public class GrandDad{public void drink(){System.out.println("爺爺愛(ài)喝酒");} } public class Father extends GrandDad{public void smoke(){System.out.println("爸爸愛(ài)抽煙");} } public class Son extends Father{}

栗子 - 包含關(guān)系

需求: 定義老師類(lèi)和學(xué)生類(lèi),然后些代碼測(cè)試;最后找到老師類(lèi)和學(xué)生類(lèi)當(dāng)中的共性內(nèi)容,抽取出一個(gè)父類(lèi),用繼承的方式改寫(xiě)代碼,并進(jìn)行測(cè)試.

// Person.java public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} } // Teacher.java public class Teacher extends Person {public Teacher() {}public Teacher(String name, int age) {super(name, age);}public void teach() {System.out.println("老師愛(ài)教書(shū)喲~");} } // Demo.java public class Demo {public static void main(String[] args) {Teacher t1 = new Teacher();t1.setAge(18);t1.setName("Marron");System.out.println(t1.getName() + "," + t1.getAge());t1.teach();Teacher t2 = new Teacher("Mar", 17);System.out.println(t2.getName() + "," + t2.getAge());t2.teach();} }

栗子 - 并列關(guān)系

需求: 請(qǐng)采用繼承的思想實(shí)現(xiàn)貓和狗的案例,并在測(cè)試類(lèi)中進(jìn)行測(cè)試

// Animal.java public class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;} } // Dog.java public class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}public void lookDoor() {System.out.println("狗看門(mén)");} } // Cat.java public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}public void catchMouse() {System.out.println("貓抓老鼠");} }

修飾符

: 其實(shí)就是文件夾,對(duì)類(lèi)進(jìn)行分類(lèi)管理

包的定義格式:

  • 格式: package 包名; (多級(jí)包名.分開(kāi))
  • 范例: package com.marron;

帶包的Java類(lèi)編譯和執(zhí)行:

  • 手動(dòng)建包:

    • 按照以前的格式編譯java文件: javac HelloWorld.java
    • 手動(dòng)創(chuàng)建包: 在磁盤(pán)中建立文件夾com, 然后在com下建立文件家 marron
    • 把class文件放到包的最里面: 把HelloWorld.class文件放到com下的marron這個(gè)文件夾下
  • 自動(dòng)建包:

    • 在使用javac命令編譯的時(shí)候: javac -d . HelloWorld.java
    • 執(zhí)行的時(shí)候: java com.marron.HelloWorld
  • 附上HelloWorld.java的代碼

// HelloWorld.java package com.marron;public class HelloWorld{public static void main(String[] args){System.out.println("HelloWorld");} }

導(dǎo)包

使用不同包下的類(lèi)時(shí),使用的時(shí)候要寫(xiě)類(lèi)的全路徑,寫(xiě)起來(lái)太麻煩了

為了簡(jiǎn)化帶包的操作,Java提供了導(dǎo)包的功能

導(dǎo)包的格式:

  • 格式: import 包名;
  • 范例: import cn.marz.Teacher

修飾符

權(quán)限修飾符

修飾符同一個(gè)類(lèi)中同一個(gè)包中子類(lèi)無(wú)關(guān)類(lèi)不同包的子類(lèi)不同包的無(wú)關(guān)類(lèi)
private
默認(rèn)
protected
public

狀態(tài)修飾符 - final

final關(guān)鍵字是最終的意思,可以修飾成員方法,成員變量、類(lèi)

final修飾的特點(diǎn)

  • 修飾方法: 表示該方法是最終方法,不能被重寫(xiě)
  • 修飾變量: 表示該變量是常量,不能被再次賦值
  • 修飾類(lèi): 表示該類(lèi)是最終類(lèi),不能被繼承

final修飾局部變量

  • 變量是基本類(lèi)型: final修飾指的是基本類(lèi)型的數(shù)據(jù)值不能發(fā)生改變
  • 變量是引用類(lèi)型: final修飾指的是引用類(lèi)型的地址值不能發(fā)生改變,但是地址值里面的內(nèi)容是可以發(fā)生改變的

狀態(tài)修飾符 - static

static關(guān)鍵字是靜態(tài)的意思,可以修飾成員方法、成員變量

public class Student {public String name;public int age;public static String university; // 表示學(xué)校類(lèi)是共享屬性,只能被賦值一次public void show() {System.out.println(name + "," + age + "," + university);} }/* 測(cè)試類(lèi) */ public class StaticDemo{public static void main(String[] args){Student.university = "華中科技大學(xué)";Student s1 = new Student();s1.name = "Marron";s1.age = 18;s1.show();Student s2 = new Student();s2.name = "Mar";s2.age = 17;s2.show();} }

static修飾的特點(diǎn)

  • 被類(lèi)的所有對(duì)象共享
    • 這也是我們判斷是否使用靜態(tài)關(guān)鍵字的條件
  • 可以通過(guò)類(lèi)名調(diào)用
    • 當(dāng)然,也可以通過(guò)對(duì)象名調(diào)用

static訪問(wèn)特點(diǎn)

  • 非靜態(tài)成員方法可以訪問(wèn)所有的靜態(tài)成員(方法)、非靜態(tài)成員(方法)
  • 靜態(tài)成員方法中,只能訪問(wèn)靜態(tài)成員(方法)
public class Student {private String name = "Marron";private static String university = "華中科技大學(xué)";// 非靜態(tài)成員方法public void show1() {}// 非青苔成員方法public void show2() {System.out.println(name);System.out.println(university);show1();show3();}// 靜態(tài)成員方法public static void show3() {}// 靜態(tài)成員方法public static void show4() { // System.out.println(name); // 報(bào)錯(cuò)System.out.println(university); // show1(); // 報(bào)錯(cuò)show3();} }

小結(jié): 靜態(tài)成員方法只能訪問(wèn)靜態(tài)成員

多態(tài)

同一個(gè)對(duì)象,在不同時(shí)刻表現(xiàn)出來(lái)的不同形態(tài)

// Animal.java public class Animal {public void eat() {System.out.println("動(dòng)物吃東西");} }// Cat.java public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚(yú)");} }// AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {// 有父類(lèi)引用指向子類(lèi)實(shí)例Animal a = new Cat();} }

多態(tài)的前提:

  • 有繼承/實(shí)現(xiàn)關(guān)系
  • 有方法重寫(xiě)
  • 有父類(lèi)引用指向子類(lèi)對(duì)象

多態(tài)中成員訪問(wèn)的特點(diǎn)

// Animal.java public class Animal {public int age = 40;public void eat() {System.out.println("動(dòng)物吃東西");} }// Cat.java public class Cat extends Animal {public int age = 20;public int weight = 10;@Overridepublic void eat() {System.out.println("貓吃魚(yú)");}public void playGame() {System.out.println("貓捉迷藏");} }// AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {// 有父類(lèi)引用指向子類(lèi)對(duì)象Animal a = new Cat();System.out.println(a.age); // System.out.println(a.weight); // 報(bào)錯(cuò)a.eat(); // a.playGame(); // 報(bào)錯(cuò)} }
  • 成員變量: 編譯看左邊, 執(zhí)行看左邊 a.age全是Animal中的數(shù)據(jù)
  • 成員方法: 編譯看左邊,執(zhí)行看右邊eat()方法可以使用,但是playGame()不能

為什么成員變量和成員方法的訪問(wèn)不一樣呢?

  • 因?yàn)槌蓡T方法有重寫(xiě),而成員變量沒(méi)有

多態(tài)的好處和弊端

// Animal.java public class Animal {public void eat() {System.out.println("動(dòng)物吃東西");} }// Dog.java public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃骨頭");} }// Cat.java public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚(yú)");} }// AnimalOperator.java public class AnimalOperator {/* 這里就用到了多態(tài)Animal a = new Cat();Animal a = new Dog();// 編譯看Animal中有無(wú)eat方法, 執(zhí)行分別看Cat和Dog中eat方法是否重寫(xiě)*/public void useAnimal(Animal a) {a.eat();} }// 測(cè)試類(lèi): AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {// 創(chuàng)建動(dòng)物操作類(lèi)的對(duì)象,調(diào)用方法AnimalOperator ao = new AnimalOperator();Cat c = new Cat();ao.useAnimal(c);Dog d = new Dog();ao.useAnimal(d);} }
  • 多態(tài)的好處: 提高了程序的擴(kuò)展性
    • 具體體現(xiàn): 定義方法的時(shí)候,使用父類(lèi)型作為參數(shù),將來(lái)在使用的時(shí)候,使用具體的子類(lèi)型參與操作
  • 多態(tài)的弊端: 不能使用子類(lèi)的特有功能

多態(tài)中的轉(zhuǎn)型

public class Animal {public void eat() {System.out.println("動(dòng)物吃東西");} }public class Cat extends Animal {@Overridepublic void eat() {System.out.println("貓吃魚(yú)");}public void playGame() {System.out.println("貓捉迷藏");} }public class AnimalDemo {public static void main(String[] args) {// 多態(tài)Animal a = new Cat(); // 向上轉(zhuǎn)型:子類(lèi)對(duì)象轉(zhuǎn)為父類(lèi)a.eat();// 向下轉(zhuǎn)型Cat c = (Cat) a;c.eat();c.playGame();} }

栗子

需求: 用多態(tài)的思想實(shí)現(xiàn)貓和狗的案例,并在測(cè)試類(lèi)中進(jìn)行測(cè)試

// Animal.java public class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat() {System.out.println("動(dòng)物吃東西");} }// Cat.java public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("貓吃魚(yú)");} }// AnimalDemo.java public class AnimalDemo {public static void main(String[] args) {Animal a = new Cat();a.setName("加菲");a.setAge(5);System.out.println(a.getName() + "," + a.getAge());a.eat();a = new Cat("加菲", 5);System.out.println(a.getName() + "," + a.getAge());a.eat();} }

抽象類(lèi)

在Java中,一個(gè)沒(méi)有方法體得方法應(yīng)該定義為抽象方法,而類(lèi)如果有抽象方法,改類(lèi)必須定義為抽象類(lèi)

抽象類(lèi)的特點(diǎn)

  • 抽象類(lèi)和抽象方法必須使用abstract關(guān)鍵字修飾

    • public abstract class 類(lèi)名 {}
    • public abstract void eat()
  • 抽象類(lèi)中不一定有抽象方法,有抽象方法的類(lèi)一定是抽象類(lèi)

  • 抽象類(lèi)不能實(shí)例化

    • 抽象類(lèi)如何實(shí)例化? 參照多態(tài)的方式,通過(guò)子類(lèi)對(duì)象實(shí)例化,這叫抽象類(lèi)多態(tài)
  • 抽象類(lèi)的子類(lèi)

    • 要么重寫(xiě)抽象類(lèi)中的所有抽象方法
    • 要么是抽象類(lèi)

抽象類(lèi)的成員特點(diǎn)

  • 成員變量:

    • 可以是變量: private int age = 20
    • 也可以是常量: private final String city = "武漢"
  • 構(gòu)造方法:

    • 有構(gòu)造方法,但是不能實(shí)例化
    • 構(gòu)造方法用于子類(lèi)訪問(wèn)父類(lèi)數(shù)據(jù)的初始化
  • 成員方法:

    • 可以是抽象方法: 限定子類(lèi)必須完成某些動(dòng)作
    • 也可以是非抽象方法: 提高代碼的復(fù)用性

接口

接口: 就是一種公共的規(guī)范標(biāo)準(zhǔn),只要符合規(guī)范,大家都可以通用

Java中的接口更多的體現(xiàn)在對(duì)行為的抽象

接口的特點(diǎn)

  • 接口用關(guān)鍵字interface修飾

    • public interface Jumpping {public abstract void jump(); }
  • 類(lèi)實(shí)現(xiàn)接口用implements表示

    • public class Cat implements Jumpping{@overridepublic void jump(){System.out.print("貓可以跳高了");} }
  • 接口不能實(shí)例化

    • 如何實(shí)現(xiàn)接口實(shí)例化? 參照多態(tài)的實(shí)現(xiàn)方式,通過(guò)實(shí)現(xiàn)類(lèi)對(duì)象實(shí)例化,這叫接口多態(tài)

多態(tài)的形式: 具體類(lèi)多態(tài)、抽象類(lèi)多態(tài)、接口多態(tài)

多態(tài)的前提: 有繼承或者實(shí)現(xiàn)關(guān)系; 有方法重寫(xiě); 有父(類(lèi)/接口)引用指向(子/實(shí)現(xiàn))類(lèi)對(duì)象

  • 接口的實(shí)現(xiàn)類(lèi):
    • 要么重寫(xiě)接口中的所有抽象方法
    • 要么是抽象類(lèi)

接口的成員特點(diǎn)

  • 成員變量:

    • 只能是常量
    • 默認(rèn)修飾符: public static final
  • 構(gòu)造方法

    • 接口沒(méi)有構(gòu)造方法,因?yàn)榻涌谥饕菍?duì)行為進(jìn)行抽象的,是沒(méi)有具體存在
    • 一個(gè)類(lèi)如果沒(méi)有父類(lèi),默認(rèn)繼承自O(shè)bject類(lèi)
  • 成員方法

    • 只能是抽象方法
    • 默認(rèn)修飾符: public abstract

類(lèi)和接口的關(guān)系

  • 類(lèi)和類(lèi)的關(guān)系

    • 繼承關(guān)系, 只能單繼承,但是可以多層繼承
  • 類(lèi)和接口的關(guān)系

    • 實(shí)現(xiàn)關(guān)系,可以單實(shí)現(xiàn),也可以多實(shí)現(xiàn),還可以在繼承一個(gè)類(lèi)的同時(shí)實(shí)現(xiàn)多個(gè)接口
    • public class InterImpl extends Object implements Inter1, Inter2, Inter3
  • 接口和接口的關(guān)系

    • 繼承關(guān)系, 可以單繼承,也可以多繼承
    • public interface Inter2 extends Inter1, Inter3

抽象類(lèi)和接口的區(qū)別

-抽象類(lèi)接口
成員區(qū)別既有變量也有常量; 既有抽象方法,也有非抽象方法只要常量(final)和抽象方法
設(shè)計(jì)理念區(qū)別對(duì)類(lèi)抽象,包括屬性和行為對(duì)行為抽象,主要是行為

【小栗子】: 門(mén)和警報(bào)

需求: 門(mén): 有open()和close()兩個(gè)動(dòng)作,下面使用抽象類(lèi)和接口來(lái)定義這個(gè)抽象概念.有的門(mén)具備報(bào)警功能,有的門(mén)不具備.因此可如下設(shè)計(jì).

public interface Alarm{void alarm(): }public abstract class Door{public abstract void open();public abstract void close(); } public class AlaramDoor extends Door implements Alarm {@overridepublic void open(){// ...}@overridepublic void close(){// ...}@overridepublic void alarm(){// ...} }

在這里,我們?cè)俅螐?qiáng)調(diào)抽象類(lèi)是對(duì)事物的抽象,而接口是對(duì)行為的抽象.

形參和返回值

抽象類(lèi)名作為形參和返回值

  • 方法的形參是抽象類(lèi)型,其實(shí)需要的是該抽象類(lèi)的子類(lèi)對(duì)象
  • 方法的返回值是抽象類(lèi)名,其實(shí)返回的是該抽象類(lèi)的子類(lèi)對(duì)象

接口名作為形參和返回值

  • 方法的形參是接口名,其實(shí)需要的是該接口的實(shí)現(xiàn)類(lèi)對(duì)象

  • 方法的返回值是接口名,其實(shí)返回的是該接口的實(shí)現(xiàn)類(lèi)對(duì)象

// Jummping.java public interface Jumpping {void jump(); // public abstract void jump(); }// Cat.java public class Cat implements Jumpping {@Overridepublic void jump() {System.out.println("貓?zhí)吒?#34;);} }// JumppingOperator.java public class JummpingOperator{public void sueJumpping(Jumpping j){j.jump();}public Jummping getJumpping(){Jumpping j = new Cat();return j;} }// JumppingDemo.java public class JumppingDemo{public static void main(String[] args){// 創(chuàng)建操作對(duì)象,并調(diào)用方法JumppingOperator jo = new JumppingOperator();Jumpping j = new Cat();jo.useJumpping(j);System.out.println("--------");Jumpping j2 = jo.getJumpping();j2.jump();} }

內(nèi)部類(lèi)

內(nèi)部類(lèi): 就是在一個(gè)類(lèi)中定義一個(gè)類(lèi)

public class Outer{public class Inner{} }

內(nèi)部類(lèi)與外部類(lèi)的交互

public class Outer {private int num = 10;public class Inner {public void show() {// 內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的私有變量System.out.println(num);}}// 外部類(lèi)使用內(nèi)部類(lèi)時(shí),需要先new一個(gè)內(nèi)部類(lèi)實(shí)例public void method(){Inner i = new Inner();i.show();} }

成員內(nèi)部類(lèi)

成員內(nèi)部類(lèi): 在類(lèi)中定義的類(lèi)

public class Outer {private int num = 10;public class Inner {public void show() {System.out.println(num);}} }
  • 訪問(wèn)如下:
public class InnerDemo {public static void main(String[] args) {// 創(chuàng)建內(nèi)部類(lèi)對(duì)象,并調(diào)用方法Outer.Inner i = new Outer().new Inner();i.show();} }/*格式: 外部類(lèi)名.內(nèi)部類(lèi)名 對(duì)象名 = 外部類(lèi)對(duì)象.內(nèi)部類(lèi)對(duì)象; */

一般來(lái)說(shuō),我們創(chuàng)建內(nèi)部類(lèi),就是不希望該類(lèi)直接被引用

可以參照類(lèi)的形式,為內(nèi)部類(lèi)添加一個(gè)訪問(wèn)方法

// Outer.java public class Outer{private int num = 10;private class Inner{public void show(){System.out.println(num);}}public void innerShow() {Inner i = new Inner();i.show();} }// InnerDemo.java public class InnerDemo{public static void main(String[] args){Outer o = new Outer();o.innerShow();} }

局部?jī)?nèi)部類(lèi)

寫(xiě)在外部類(lèi)的方法里面

// Outer.java public class Outer{private int num = 10;public void method(){class Inner{public void show(){System.out.println(num);}}} }

局部?jī)?nèi)部類(lèi)的調(diào)用,需要在外部類(lèi)的方法中創(chuàng)建這個(gè)局部?jī)?nèi)部類(lèi)的實(shí)例,然后間接調(diào)用局部?jī)?nèi)部類(lèi)的方法

// Outer.java public class Outer{private int num = 10;public void method(){Class Inner{public void show(){System.out.println(num);}}Inner i = new Inner();i.show();} }// InnerDemo.java public class InnerDemo{public static void main(String[] args){Outer o = new Outer();o.method();} }

匿名內(nèi)部類(lèi)

new Inter(){public void show(){// ...} }

本質(zhì): 是一個(gè)繼承了該類(lèi)或者實(shí)現(xiàn)了該接口的子類(lèi)匿名對(duì)象

上面提及繼承類(lèi)或者接口,那么首先得有一個(gè)接口

// Inter.java public interface Inter{void show(); }// Outer.java // 在Outer類(lèi)中實(shí)現(xiàn)匿名內(nèi)部類(lèi) public class Outer{public void method(){Inter i = new Inter(){@Overridepublic void show(){System.out.println("匿名內(nèi)部類(lèi)");}};i.show(); // 調(diào)用重寫(xiě)后的show方法i.show();} }// 測(cè)試類(lèi): OuterDemo.java public class OuterDemo{public static void main(String[] args){Outer o = new Outer();o.method();} }

【小栗子】

// Jumpping.java public interface Jumpping{void jump(); }// JunmppingOperator.java public class JumppingOperator{public void method(Jumping j){j.jump();} }

以上有一個(gè)接口Jumping以及一個(gè)接口操作類(lèi)JumppingOperator, 接口中定義的方法是抽象的.因此調(diào)用需要使用匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)

// JumppingDemo.java public class JumppingDemo{public static void main(String[] args){JumppingOperator jo = new JumppingOperator();jo.method(new Jumpping(){@Overridepublic void jump(){System.out.println("貓可以跳高高了");}})} }

總結(jié)

以上是生活随笔為你收集整理的Java --- 基础学习Ⅱ的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。