Day015 内部类

内部类


定义

内部类就是在一个类的内部再定义一个类,比如,A类中定义一个B类,那么B类相对A类来说就称为内部类,而A类对于B类来说就是外部类了。


内部类的分类

  • 成员内部类:定义在外部类里面的非静态类,可以在内部类中使用所有外部类的属性和方法

    public class Outer {
        
        //成员内部类
       public class Inner{
           
        }
    }
    
  • 静态内部类:定义在外部类里面的静态类,通过类加载机制我们知道只能使用外部类的静态属性和方法。

    public class Outer {
        
        //静态内部类
       public static class Inner{
           
        }
    }
    
  • 局部内部类(只能在定义内部类的方法中实例化和调用,属于这个外部类的方法)

    public class Outer {
        
        public void methods(){
            //局部内部类,
            class Inner{
                
            }
        }
    }
    
  • 匿名内部类


内部类的使用

Outer是外部类,inner是成员内部类

public class Outer {
    private int id;
    public void out(){
        System.out.println("这是外部类的方法");
    }

   public class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }
    }
}
  public static void main(String[] args) {
        Outer outer = new Outer();
        //通过这个外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.in();
    }

输出结果

这是内部类的方法

要想实例化内部类,需要先实例化外部类,然后用外部类的对象去实例化内部类。


内部类的作用


在内部类中可以直接访问外部类的所有属性和方法(包括私有属性和方法)。

如下面的例子,在内部类Inner中加一个获取外部类私有变量id的方法

public class Outer {
    private int id=10;
    public void out(){
        System.out.println("这是外部类的方法");
    }

   public class Inner{
        public void in(){
            System.out.println("这是内部类的方法");
        }

       //获取外部类的私有属性
        public int getId(){
            return id;
        }
    }
}
   public static void main(String[] args) {
        Outer outer = new Outer();
        //通过这个外部类来实例化内部类
        Outer.Inner inner = outer.new Inner();

        System.out.println(inner.getId());
    }

输出结果

10

匿名内部类的奇怪用法


public class test {
    public static void main(String[] args) {
        //没有名字初始化类,不用将实例保存在变量中
        new Apple().eat();

        //不是new接口,接口不能实例化,实际上是new了实现了接口的对象
        new UserService() {
            @Override
            public void hello() {

            }
        };

    }
}

class Apple{
    public void eat(){
        System.out.println("1");
    }
}

interface UserService{
    void hello();
}

内部类详解

狂神说java

上一篇:通过外部类可以访问难道内部类的私有成员


下一篇:Java|内部类