JAVA基础笔记 10 内部类

创建内部类

// 创建内部类
public class Pracel2 {
    // 内部类
    class Contents {
        private int i = 11;
        public int value() {
            return i;
        }
    }
    public Contents contents() {
        return new Contents();
    }
    public static void main(String[] args) {
        Pracel2 p = new Pracel2();
    // 通过调用外部类对象的方法来生成内部类对象
        Pracel2.Contents c = p.new Contents();
    }
}

内部类拥有外部类的所有元素的访问权

interface Selector {
    boolean end();
    Object current();
    void next();
}
// Sequence只是一个固定大小的Object的数组,已类来封装起来
public class Sequence {
    private Object[] items;
    private int next = 0;

    public Sequence(int size) {
        items = new Object[size];
    }

    public void add(Object x) {
        if (next < items.length)
            items[next++] = x;
    }
    /* 内部类  通过实现接口的selector功能
    *  方法end(),current(),next()都用到了object对象,这都是外部类的字段
    */
    private class SequenceSelector implements Selector {
        private int i = 0;
        @Override
        public boolean end() {
            return i == items.length;
        }
        @Override
        public Object current() {
            return items[i];
        }
        @Override
        public void next() {
            if (i < items.length)
                i++;
        }
    }
    /* 通过外部类的方法来返回内部类的对象
     * 当某个外部类的对象创建了一个内部类对象时,内部类对象会捕获一个指向那个外部类独享的引用,这一切编译器都是自动处理。
    */
    public Selector selector() {
        return new SequenceSelector();
    }

    public static void main(String[] args) {
        Sequence sequence = new Sequence(10);

        for (int i = 0; i < 10; i++) {
            sequence.add(new Strings("zheng"));
        }

        Selector selector = sequence.selector();
        while (!selector.end()) {
            System.out.println(selector.current() + " ");
            selector.next();
        }
    }
}

使用.this与.new

public class DotNew{
    public class Inner{}
    public static void main(String [] args){
        DotNew dn = new DotNew();
        //创建某个内部类的对象  (.new语法)
        DotNew.Inner dni = dn.new Inner();
    }
}

匿名类

public class Parcel9{
// 在匿名内部类中使用一个外部定义的对象,参数引用是final的
    public Destination destination(final String dest){
        return new Destination(){
            private String label = dest;
            public String readLabel(){
                return label;
            }
        }
    }
}

//匿名类的工厂模式
// 接口1
interface Service {
    void methond1();
    void methond2();
}
// 接口2
interface ServiceFactory {
    Service getService();
}

class Impletional1 implements Service {
    @Override
    public void methond1() {
        System.out.println("Implement method1");
    }

    @Override
    public void methond2() {
        System.out.println("Implement method2");
    }
    匿名类 
    public static ServiceFactory factory = new ServiceFactory() {
        @Override
        public Service getService() {
            return new Impletional1();
        }
    };
}
public class Factory {
    public static void serviceConsumer(ServiceFactory fact) {
        Service s = fact.getService();
        s.methond1();
        s.methond2();
    }

    public static void main(String[] args) {
        serviceConsumer(Impletional2.factory);
    }

}

嵌套类

普通的内部类对象隐式地保存了一个引用,指向创建他的外部类对象。但是当内部类为static的时候。
1.如果创建嵌套类的对象,并不需要其外部类的对象
2.不能从嵌套类的对象中访问非静态的外部类的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值