【Java学习笔记】11.内部类

本文详细介绍了Java内部类的概念及特点,包括内部类的定义、使用场景、与外部类的交互方式,以及如何正确地在不同上下文中使用内部类。此外,还探讨了匿名内部类的应用及其限制。

1、内部类
定义在其他类内部的类被称为内部类

  1. 内部类提供了更好的封装,不允许同一包的其他类访问
  2. 内部类成员可以访问外部的私有数据
  3. 匿名内部类适用于创建仅需要使用一次的类

定义与普通类的区别
1. 内部类比外部类可以使用三个修饰符:private,protected,static
2. 非静态内部类不可以有静态成员

2.非静态内部类
大部分内部类都被作局部内部类为成员内部类定义,而不是作为局部内部类。成员内部类与类的变量、方法、构造器相类似的类成员;局部内部类和匿名内部类不是类成员。

外部类的上一级程序单元是包,所以它只有2个作用域;而内部类的上一级程序单元是外部类所以他的作用域范围有4个

    public class Outer {

        private int outProp=9;

        //定义非静态内部类
        class Inner{
            private int inProp=5;
            public void accessOuterProp(){
                System.out.println("外部类的outProp:"+outProp);
            }
        }

        public void accessInnerProp(){
            //创建内部类实例,并访问其的内部类的属性
            System.out.println("内部类的inProp:"+new Inner().inProp);
        }

        public static void main(String[] args) {
            Outer d=new Outer();
            d.accessInnerProp();
        }

    }

非静态内部类的方法访问某个变量时的顺序为:局部变量->内部类的成员变量->外部类的成员变量。
如果遇到外部类的成员变量、内部类的成员变量和内部类方法的局部变量名相同时,可以通过使用this、外部类类名.this来区分

非静态内部类的成员不能直接被外部类直接使用,只能通过实例化内部类来实现

根据静态成员不能访问非静态成员规则,外部类静态成员方法、静态代码块不能访问非静态内部类

  public class Outer{

        class Inner{
                private int inProp=5;
                public void accessOuterProp(){
                    System.out.println("外部类的outProp:"+outProp);
                }
        }
        public static void main(String[] args) {
            Demo1 d=new Demo1();
            d.accessInnerProp();
            //此处会发生编译错误,因为在外部静态方法中访问了非静态内部类
            Inner i=new Inner();
        }

    }

非静态内部类不能有静态方法、静态成员变量、静态初始化块

3.使用内部类

  1. 在外部类内部使用内部类。不要在外部类的静态成员中使用非静态内部类,因为静态成员不能访问非静态成员
  2. 在外部类以外使用非静态内部类。在外部类以外使用内部类,内部类完整类名应该是OuterClass.InnerClass。如果外部类有包名,则应该增加包名前缀。内部类的构造器必须使用外部类对象来调用
  Out.In in=new Out().new In();

当一个SubClass类继承类Out外部类的Inner内部类

     public SubClass(Out out){
            out.super();
        }

在外部类以外使用静态内部类

  Out.Inner in=new Out.Inner();

4.匿名内部类

  1. 只需要使用一次的
  2. 创建匿名内部类时会立即创建该类的实例,这个类的定义会立即消失
  3. 匿名类不能重复使用

语法格式:

   new 实现接口()|父类构造器(实参列表)
    {
        //匿名内部类的类体部分
    }

匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口
匿名内部类的两条规则:

  1. 匿名内部类不能是抽象类。因为系统在创建一个匿名内部来时,会立即创建匿名内部类对象
  2. 匿名内部类不能定义构造器。由于匿名内部类没有类名,所以不能定义构造器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值