5.8 内部类 与 匿名类

5.8.1 内部类

这里写图片描述
java支持在一个类中声明了一个类,这样的类称为内部类(InnerClass),而包含内部类的类 称为 内部类的外部类(OuterClass).内部类一般用来试下一些没有通用意义的功能逻辑。

定义内部类:只需要将类的定义放在一个用于封装他的外部类 的 类体内部即可。
【例5-23】内部类的定义和使用示例。

Ex5_23_InnerClass.java
package com.ch5;

public class Ex5_23_InnerClass {

    public static void main(String[] args) {
        Parcel p = new Parcel();  // 这个构造方法是系认提供的默认无参构造方法
        Parcel.Contents c = p.new Contents(33);// 创建内部类
        Parcel.Destination d = p.new Destination("山西大同"); // D行
        // Destination d = p.new Destination("山西大同");     // A行
        p.setValue(c, d);
        p.ship();
        p.testShip();
    }

}

class Parcel{
    private Contents c;
    private Destination d;
    private int contentsCount = 0;
    class Contents{   // 内部类
        private int i;
        Contents(int i){
            this.i = i;
            contentsCount++; // C行
        }

        int value(){
            return i;
        }
    }

    class Destination {  // 内部类
        private String lable;
        Destination(String whereTo){
            lable = whereTo;
        }

        String readLabel(){
            return lable;
        }
    }

    void setValue(Contents c,Destination d){
        this.c = c;
        this.d = d; 
    }

    void ship(){
        System.out.println("运输" + c.value() + "到" + d.lable);// B行
    }

    public void testShip(){
        c = new Contents(22);
        d = new Destination("山西太原");
        ship();
    }
}

运行结果:
这里写图片描述
程序编译后生成4个文件:

Ex5_23_InnerClass.class,

Parcel.class,

Parcel $ Contents.class

Parcel $ Destination.class .

例5-23中,可以看出内部类Destination和Contents的定义包含在外部类 Parcel中,内部类的声明 与 声明成员变量或成员方法一样。 注意内部类的声明和创建 均需要使用 外部类 . 内部类 的形式。如 D行中的Parcel.Destination , p.new Destination(“山西大同”) .

内部类与类中的成员变量 和 成员方法一样,均为外部类的成员,其使用有如下特点:

  1. 外部类使用内部类成员。 外部类使用内部类 同 (外部类使用)其他成员变量和成员方法 没有区别。 例如5-23中的B行,在Parcel 类的ship方法中可以世界使用Destination和Contents类的成员方法和成员变量。
  2. 内部类使用外部类的成员。 一个类把 内部类看成是自己的成员,外部类的成员变量在内部类中仍然有效,内部类可以直接使用外部类的成员变量和 方法(这些变量和方法可以是private修饰的),这是内部类的一个好处,如李5-23的C行。 如果内部类和外部类有 同名 的成员变量,可以使用“外部类名 . this “来访问外部类中同名的成员变量。
    运行结果
  3. 非外部类使用内部类。 非外部类的其他类 使用内部类,如Ex5_23_InnerClass 类 使用Destination 和 Contents类,在类名和new 运算符前分别冠以外部类的名字 及外部对象名,如D行。如果直接使用的话,如A行,会出错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值