2-4 内嵌类之成员类

Member class - 成员类
一个静态成员类,若去掉“static”关键字,就成为成员类

下面的示例定义了四种“成员类”

public class Outer {
    private int data;

    // 1/4 - public权限
    public class Inner1 {
        private int data;
        private int data1;
        public Inner1() {
            data1 = 1; data = 1;
            Outer.this.data = 1;	// 访问外部类的“实例字段”
        }
    }

    // 2/4 - default权限
    class Inner2 {
        //static int j = 1;	//Compile error: can not define static filed, method, class in member class
        static final int CONSTANT = 1;	//OK, "static final" is allowed
    }

    // 3/4 - private权限
    private class Inner3 {
		// 4/4 - 嵌套定义
        public class Inner4 { }
    }

	// --- NOTICE ---
    // Inner5 is not a member class but a static member class
    interface Inner5 { }

    private static void staticMethod() {
        //can not create a member class instance directly in outer class' static method
        //Inner1 inner1 = new Inner1();
    }

    private void instanceMethod() {
        //can create a member class instance in outer class' instance method
        Inner1 inner1 = new Inner1();
    }
}

class Test {
    public Test() {
        //Outer.Inner2 inner2 = new Outer.Inner2(); // 不能脱离外部类而直接创造一个成员类的实例

        Outer outer = new Outer();
        Outer.Inner1 inner1 = outer.new Inner1();
    }
}
-- 特性:
类似于外部类的实例函数,成员类有public/private/default权限
一个成员类实例必然属于一个外部类实例,成员类可访问外部类的任一个实例字段和实例函数

-- 约束:
静态成员类不能与外部类重名
不能在成员类中定义static字段、方法和类。因为一个成员类实例必然与一个外部类实例关联,这个static定义完全可以移到其外部类中去
成员类不能是接口。因为成员类必须能被某个外部类实例实例化,而接口是不能实例化的

-- 何时使用:
方便一个类对外提供一个公共接口的实现。比如下面:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {

	// 提供给外界的公共接口
	private class Itr implements Iterator<E> {
		...
	}

	// 方便实例化,提供了一个factory方法
	public Iterator<E> iterator() {
		return new Itr();
	}
}
因为定义在AbstractList中的Itr可访问AbstractList中的任意字段和方法,所以很方便实现Iterator,无需AbstractList对外暴露更多的接口。
如果没有成员类机制,则只有把AbstractList暴露给未知的类去使用了。这样搞出来的实现不是“公共的”




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值