1. 程式人生 > >第2章 內部類

第2章 內部類

Java

1.1 內部類概述
A:什麽是內部類
將類寫在其他類的內部,可以寫在其他類的成員位置和局部位置,這時寫在其他類內部的類就稱為內部類。其他類也稱為外部類。
B:什麽時候使用內部類
在描述事物時,若一個事物內部還包含其他可能包含的事物,比如在描述汽車時,汽車中還包含這發動機,這時發動機就可以使用內部類來描述。

class 汽車 { //外部類
class 發動機 { //內部類
}
}

1.2 成員內部類

成員內部類,定義在外部類中的成員位置。與類中的成員變量相似,可通過外部類對象進行訪問
A:定義格式

class 外部類 {
修飾符 class 內部類 {
//其他代碼
}
}
B:訪問方式
[AppleScript] 純文本查看 復制代碼
?
1
外部類名.內部類名 變量名 = new 外部類名().new 內部類名();
1.2.1 案例代碼三

  package com.itheima_01;

/*
 * 成員內部類:
 * 在類的成員位置,和成員變量以及成員方法所在的位置是一樣的
 * 在內部類當中,可以直接訪問外部類的成員,包括私有成員
 */
public class InnerDemo {
public static void main(String[] args) {
//Outer o = new Outer();
//o.method();
Outer.Inner i = new Outer().new Inner();
i.function();

}
}

class Outer {
private int num = 10;
public void method() {
Inner i = new Inner();
i.function();
}
class Inner {
public void function() {
System.out.println(num);
}
}
}
成員內部類
  成員內部類可以使用的修飾符:private,public,procted,final,static,abstract
1.2.2 案例代碼四

package com.itheima_01;[/align]/*
 * 成員內部類的修飾符:
 * 我們可以使用權限修飾符修飾成員內部類,但是如果使用私有來修飾,則無法在其他類中訪問
 * 我們可以使用static修飾成員內部類,不用再創建外部類的對象了
 *
 * 我們可以使用abstract,final修飾成員內部類
 */
public class InnerDemo2 {
public static void main(String[] args) {
//Outer2.Inner2 i;
//Outer2.Inner2 i = new Outer2.Inner2();
//i.function();
Outer2.Inner2.function();
}
}

class Outer2 {
public void method() {
Inner2 i = new Inner2();
}
static class Inner2 {
public static void function() {
System.out.println("function");
}
}
}
1.3 局部內部類
  局部內部類,定義在外部類方法中的局部位置。與訪問方法中的局部變量相似,可通過調用方法進行訪問
A:定義格式

class 外部類 {
修飾符 返回值類型 方法名(參數) {
class 內部類 {
//其他代碼
}
}
}
B:訪問方式
[AppleScript] 純文本查看 復制代碼
?
1
在外部類方法中,創建內部類對象,進行訪問

1.3.1 案例代碼五:

package com.itheima_02;[/align]/*
 * 局部內部類
 * 在方法內,出了方法之後就無法使用
 *
 *
 */
public class InnerDemo3 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}

class Outer {
public void method() {
int num = 10;
class Inner {
public void function() {
System.out.println("function");
}
}
Inner i = new Inner();
i.function();
}
public void test() {
//Inner i = new Inner();
//System.out.println(num);
}
}

1.4 匿名內部類
A:作用:匿名內部類是創建某個類型子類對象的快捷方式。
B:格式:
[AppleScript] 純文本查看 復制代碼
?
1
2
3
new 父類或接口(){
//進行方法重寫
};

代碼演示

//已經存在的父類:
public abstract class Person{
public abstract void eat();
}
//定義並創建該父類的子類對象,並用多態的方式賦值給父類引用變量
Person  p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//調用eat方法
p.eat();
使用匿名對象的方式,將定義子類與創建子類對象兩個步驟由一個格式一次完成,。雖然是兩個步驟,但是兩個步驟是連在一起完成的。
匿名內部類如果不定義變量引用,則也是匿名對象。代碼如下:

new Person(){
public void eat() {
System.out.println(“我吃了”);
}
}.eat();

1.4.1 案例代碼六:

package com.itheima_03;
/*
 * 匿名內部類:
 * 可以把匿名內部類看成是一個沒有名字的局部內部類
 * 定義在方法當中
 * 必須在定義匿名內部類的時候創建他的對象
 * 格式:
 * new 類/接口(){
 * 如果是創建了繼承這個類的子類對象,我們可以重寫父類的方法
 * 如果是創建了實現這個接口的子類對象,我們必須要實現該接口的所有方法
 * };
 * 原理:而是創建了繼承這個類的子類對象或者是創建了實現這個接口的子類對象
 *
 */
public class InnerDemo4 {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}

interface Inner {
public void function();
}

class Outer {
public void method() {
/*new Inner() {

@Override
public void function() {
System.out.println("function");
}
}.function();;*/
Inner i = new Inner() {

@Override
public void function() {
System.out.println("function");
}
};
i.function();
i.function();
}
}

1.4.2 案例代碼七:
匿名內部類作為參數傳遞

package com.itheima_04;

public interface Animal {
public abstract void eat();
}

package com.itheima_04;

public class Cat implements Animal {

@Override
public void eat() {
System.out.println("貓吃魚");
}

}

package com.itheima_04;

public class Dog implements Animal {

@Override
public void eat() {
System.out.println("狗啃骨頭");
}

}

package com.itheima_04;
/*
 * 匿名內部類的應用場景:
 * 作為參數進行傳遞
 *
 *     
 */
public class InnerDemo5 {
public static void main(String[] args) {
 //method(new Dog());
 //method(new Cat());
method(
new Animal() {

@Override
public void eat() {
System.out.println("貓吃魚");
}
}
);
}
public static void method(Animal a) {
a.eat();
}
}

第2章 內部類