内部类,静态内部类,成员内部类,匿名内部类


内部类:
内部类是再类中建立类

class name{
  class n{
  }
}
//调用内部类是要先调用外部类的
public class{
 public static void main(....){
  name na=new na();
  name n a=na.new n();
//侧面反应出建立的规则,左边是声明,右边是实例化的定义所以调用的实例外部类na.(左边只是给他一个可视化的名字,右边是给其一个地址)
  } 
}
——————————————————————————————————————————
成员内部类:
class Dog{
    public void f(){//方法,为以后的外部类的调用提供接口,
        class D{
            public int n=3;
            void show(){
                System.out.print(n);
            }
        }
        D d=new D();
    //此类的实例化是在方法中建立起类的实例化,当方法的执行直接跑到此步
        d.show();
    }
}

public class Main{
    public static void main(String[] args){
        Dog d=new Dog();
        d.f();
    }
}
//声明:局部内部类和局部变量差不多
————————————————————————————————————————————
class Dog{
    static int n=1;
    int a=3;
    static class D{

        void show(){
            System.out.print(n);
            //System.out.print(a);  ERROR; 静态内部类只能访问外部类的静态成员
        }
        /*解析personal:大致原因类外部类不用时候是被回收机制回收,而静态内部类是到系统的结束为止,
        如果不是静态外部类成员,再次访问就出错*/
      /*官方点:因为外部类的非静态方法是需要创建外部类对象才能调用的,而你的静态内部类是不需要外部类对象就可以得到的*/
    }
    

}

public class Main{
    public static void main(String[] args){
        //静态内部类的建立可以直接跳过外部类的实例化
        Dog.D d=new Dog.D();
        
    }
}
————————————————————————————————————————————
//匿名内部类:
//匿名内部类是该类或者该接口的子类的匿名对象
interface Animal{
    void shout();
}
public class Main{
    public static void main(String[] args){
        String name="小花";
        animal(new Animal(){//这是接口的之类匿名对象,并且定义了shout方法
            public void shout(){
                System.out.println(name+"mm");
            }
        });
    }
    public static void animal(Animal a){
        a.shout();
    }
}
package Test;
abstract class Animal{
    public abstract void shout();
}
public class Main{
    public static void main(String[] args){
        new Animal(){
            public void shout(){
                System.out.println("555");
            }
        }.shout();//.(点)前面是一个对象直接调方法
    }
}