Java内部类

Java内部类

1.成员(普通)内部类

  • public class Outer{
        public class Inner{}
    }
    
  • 依赖外部类对象而存在

  • 成员内部类中,不能定义静态成员

    1.1外部类调用内部类

    //怎样调用成员变量,就可以怎样调用成员内部类,
    //(是指,非静态可以直接调用静态,静态不可直接调用非静态这方面)
    public class Outer{
        //成员内部类
        public class Inner{public void in();}
        //外部类的非静态方法,访问成员内部类
        public void out(){
         Inner inner=new Inner();
        inner.in();
        }
     //外部类的静态方法,访问成员内部类
        public static void outSta(){
            Outer out=new Outer();
            Inner inner=out.new Inner();
            inner.in();
        }
    }
    
    

    1.2内部类调用外部类

    public class Outer{
        private int id=10;
        public void out(){System.out.println("这是外部类的方法");}
        public class Inner{
            public void in(){System.out.println("这是内部类的方法");}
            //获得外部类的私有属性
            public void getId(){
                System.out.println(id);//10
            }
            //调用外部类的方法
            Outer.this.out();
        }
    }
    

2.静态内部类

  • public class Outer{
        static class Inner{}
    }
    
  • 不需要依赖其外部类对象

  • 静态内部类中也无法访问外部类的非静态成员

  • 静态内部类可以用public,protected,private修饰

  • 外部类可以访问内部类对象所有访问权限的成员

  • 详解:外部类的非静态成员是属于每一个外部类对象的,而本身静态内部类就是独立外部类对象存在的,所以静态内部类不能访问外部类的非静态成员,而外部类依然可以访问静态内部类对象的所有访问权限的成员,和普通内部类相同。

    2.1外部类调用内部类

    //静态内部类
        public static class Inner{public void in();}
    //能怎样调用静态属性就能怎样调用静态内部类
    new Outer.Inner().in();//类. 调用方式 
    
    

    2.2内部类调用外部类

    public static class Inner{}
    //此时,System.out.println(id),获取不到id,解决方法,id修改为静态
    

3.局部内部类

  • public class Outer{
        public void out(){
            public class Inner{}
        }
        
    }
    
  • 其声明在一个方法体 / 一段代码块的内部,

  • 在局部内部类前不加修饰符public和private,其范围为定义它的

    代码块

  • 不在定义类的定义域之内便无法使用,只能在out()方法中使用

  • 可以任意访问该方法out()内的局部变量

  • 其提供的功能使用匿名内部类都可以实现,而本身匿名内部类可以写得比它更简洁,

  • 因此局部内部类用的比较少

4.匿名内部类

  • 是局部内部类的简要写法,可以在不声明类名的情况下,继承其他类并创建对象

  • 作用范围和局部内部类完全一致

  • 有多种形式,其中最常见的一种形式莫过于在方法参数中新建一个接口对象 / 类对象,并且实现这个接口声明 / 类中原有的方法了

  •  // 1自定义接口
    	interface Inner {
            void in(int i);
        }
    
        private void demo() {
            // 在这个过程中会新建一个匿名内部类对象,
            // 这个匿名内部类实现了Inner 接口并重写 in 方法
            Inner inner = new Inner() {
    	        // 可以在内部类中定义属性,但是只能在当前内部类中使用,
    	        // 无法在外部类中使用,因为外部类无法获取当前匿名内部类的类名,
    	        // 也就无法创建匿名内部类的对象
                public void in(int i){
                    System.out.println("demo")
                }
            }
    
  • //2新建一个类对象 
    // new Object() 过程会新建一个匿名内部类,继承于 Object 类,
            // 并重写了 toString() 方法
            clickListener.onClick(new Object() {
                @Override
                public String toString() {
                    return "hhh";
                }
            });
    

5.总结

image-20221122195211280

  • 静态内部类,作用范围,就像静态变量一样

    • 成员内部类,作用范围,就像成员变量一样
    • 局部、匿名内部类,作用范围,就像局部变量一样
  • 访问范围可以由内而外,不可,由外而内

    • 局部内部类,可以访问,静态属性、静态内部类

    • 静态内部类,访问不了,局部内部类

6.使用情况

当不想让这个类,被外部访问时,可以使用内部类。对内,想要访问某些内部数据时,就得用到内部类,比如一些类的私有属性。

  1. 只想让类内部使用,就可以定义一个静态内部类
  2. 只是某个方法需要用到,就可以使用匿名内部类

在实际开发中,用的最多的就是静态内部类、匿名内部类。

Java8可以将匿名内部类写成lambda表达式,能够极大简化代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值