总结:内部类与泛型

内部类

实例内部类
class OuterClass {
    public int data1 = 10;
    public static int data2 = 20;

    /*
     * 实例内部类---问题:
     * 1.如何拿到实体内部类的对象?
     * 2.在实例内部类当中,是否可以定义static的数据成员?
     *   可以,必须用static final修饰 -》必须是在编译时期确定的!
     * 3.内部类可以访问外部类的所有数据成员,包括私有的。
     * 4.实例内部类是否有额外的开销?包含了外部类的this。
     * 5.InnerClass是OuterClass 的 成员。
     * 6.OuterClass.this->拿到外部类的对象的引用。*/
    class InnerClass {
        public int data3 = 100;
        public static final int data4 = 200;
        public int data1 = 10000;

        public InnerClass() {
        }

        public void func() {
            System.out.println("InnerClass::func()");
            System.out.println("data1: " + this.data1);
            System.out.println("data2: " + data2);
            System.out.println("data3: " + data3);
            System.out.println("data4: " + data4);
            //实例内部类包含了外部类的this
            System.out.println("Outerdata1: " + OuterClass.this.data1);
        }
    }
}

public class InnerClassTest {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        /*访问(拿到)实例内部类的对象:
         * 外部类名.实例内部类名  变量名称 = 外部类对象的引用.new 内部类对象*/
        OuterClass.InnerClass in = outerClass.new InnerClass();
        in.func();
    }
}
静态内部类
class OuterClass2 {
    public int data1 = 16;
    public static int data2 = 18;

    /**
     * 静态内部类-》static
     * 1.如何拿到静态内部类的实例对象?--将静态内部类看成外部类的静态成员.
     */
    static class InnerClass2 {
        public int data3 = 100;
        public static final int data4 = 200;
        public int data1 = 300;
        public OuterClass2 o = null;

        public InnerClass2() {
        }

        public InnerClass2(OuterClass2 out) {
            this.o = out;
        }

        public void func() {
            System.out.println("InnerClass2::func()");
            System.out.println("data3:" + data3);//100
            System.out.println("data4:" + data4);//200
            System.out.println("data1:" + data1);//300
            System.out.println("data2:" + data2);//18
            System.out.println("out-data1:" + OuterClass2.data2);//16
            //问题:静态内部类能否访问外部类的实例成员,不能直接访问;
            //System.out.println("outdata1: "+ OuterClass2.this.data1);---error
            /*间接访问的步骤:
             * 1. public InnerClass2(OuterClass2 out) {
             *    this.o = out;}
             * 2. public OuterClass2 o = null;
             * 3.OuterClass2 outerClass2 = new OuterClass2();
             *   OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2(outerClass2);
             * 4.System.out.println("out2-data1:" + o.data1);*/
            System.out.println("out2-data1:" + o.data1);//16
        }
    }

}

public class StaticInnerClass {
    public static void main(String[] args) {
        OuterClass2 outerClass2 = new OuterClass2();
        /*访问静态内部类对象:
         *外部类名.静态内部类名  in = new 外部类类名.内部类();*/
        OuterClass2.InnerClass2 innerClass2 = new OuterClass2.InnerClass2(outerClass2);
        innerClass2.func();
        int ret = OuterClass2.InnerClass2.data4;
//        System.out.println(ret);//200
    }
}
匿名内部
//new MyThread();//匿名对象
        /**
         * 匿名内部类-》MyThread的一个子类
         */
        new MyThread(){
            @Override
            public void func() {
                //super.func();
                System.out.println("inner::MyThread::func()");
            }
        }.func();

泛型

1.泛型:MyArrayList:他只是一个占位符;
证明当前的类是一个泛型类。
2.泛型注意事项
(1) 坑1:泛型是不能够new 泛型数组的 T[] a = new T[];—ERROR
(2)坑2:泛型的参数必须是引用类型,不能是内置类型(简单类型)
3.泛型的意义:
(1)a:可以进行自动类型检查。
(2)b:可以自动进行类型转换。
4.泛型到底是怎么编译的?
类型的擦除机制;擦成了Object类型,并不是替换。
5.泛型参数是不参与类型的组成的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值