JAVA- 内部类

内部类

public class InnerDemo {
    
    class Inner{
        public void innerMethod(){
            System.out.println("this is inner method");
        }
    }
    public Inner getInnerInstance(){
        return this.new Inner();
    }
    
    public static void main(String[] args) {
        //获取内部对象,这是第一种
        InnerDemo innerDemo = new InnerDemo();
        Inner inner = innerDemo.new Inner();
        
        //获取内部对象,这是第二种
        InnerDemo innerDemo1 = new InnerDemo();
        Inner inner1 = new InnerDemo().getInnerInstance();
    
    }    

成员内部类

定义了成员内部类后必须使用外部类对象来创建内部类对象,而不能世界去new 一个内部类对象,即

内部类 对象名 = 外部类对象.new 内部类()

一般来说,编译内部类后生成的类文件是以“外部类名称$内部类名称.class” 这种形式命名的,但在Java语言中,只要存在$,就应将其替换为 “ . ” 。

public class InnerDemo{
    class Inner{
     
    }
}

 成员内部类,只要外部这个类还在内存当中,这个成员内部类就会驻留在内存。

局部内部类

public class InnerDemo1 {
    public void call(){    //这是一个方法
        class Inner{       //这是一个方法里的局部内部类
            
        }
    }
}

局部内部类随着方法的弹栈而被销毁。

匿名内部类

定义匿名内部类的时候,必须要有接口或抽象类。这个匿名内部类还得写成一个局部的匿名内部类。

这个是非匿名内部类实现一个接口的代码:

interface Inner{
    void call();
}
public class InnerDemo1 {
    public void say(){
        class InnerImpl implements Inner{
            @Override
            public void call() {
            }
        }
    }
   
}

静态内部类

public class InnerDemo {
   static String name; //InnerDemo.name
   static class Inner{ //获取到该静态内部类构造器InnerDemo.Inner(),构造器获取实例对象new InnerDemo.Inner();
        public void function(){
            System.out.println("this is inner method");
        }
   }
}
  class Outer{ //定义外部类 

        String info="Welcome,everybody"; //定义外部类的私有属性

        class Inner{ //定义内部类
            public void print(){ //定义内部类的方法
              System.out.println(info); //直接访问外部类的方法
              }
            }
            public void fun(){ //定义外部类的方法
            new Inner().print(); //通过内部类的匿名对象调用内部类的print()方法
        }
  }
  public class OuterInner {


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Outer out = new Outer();
        Outer.Inner in = out.new Inner();
        in.print();

        }

  }

原文地址:https://www.cnblogs.com/RzCong/p/6852288.html