内部类

内部类

1. 什么是内部类?

内部类就是在一个类的内部(类的里面)在定义一个类。在A类中定义一个B类,那么B类就是A类的内部类,A类就是B类的内部类。

2. 内部类分类

  • 成员内部类
    • public class Inner{} / class Inner{}
  • 静态内部类 加了static,
    • public static class Inner{} / static class Inner{}
  • 局部内部类
  • 匿名内部类

3 详解各个内部类

3.1 成员内部类

1.创建一个外部类Outer,在类Outer里面定义一个内部类Inner

2.在Application启动类中调用外部类,内部类的属性和方法。

//外部类Outer
public class Outer {
    private int id1 = 10;	//外部类私有属性
    int id2 = 11;			//外部类公有属性
	
    //外部类私有方法
    private void out1() {
        System.out.println("这是外部类的私有方法");
    }
	//外部类公有方法
    public void out2() {
        System.out.println("这是外部类的公有方法");
    }

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

        //内部类可以获得外部类的私有属性和私有方法!(公有的更能!)正常类是做不到的。
        public void getID() {
            System.out.println(id1);
            System.out.println(id2);
        }
        public void getMethod() {
            out1();
            out2();
        }
    }
}
//启动类Application
public class Application {
    public static void main(String[] args) {
        //首先实例化外部类,new一个外部类对象
        Outer outer = new Outer();
        //通过外部类对象来实例化内部类
        Outer.Inner inner = outer.new Inner();
        inner.in();//内部类调用自己的内部类方法
        inner.getID();//内部类对象获取外部类私有属性和公有属性
        inner.getMethod();//内部类对象获取外部类私有方法和公有方法!
    }
}

3.2 静态内部类

1.创建一个外部类Outer2,在类Outer2里面定义一个内部类Inner2

2.创建Application2

//外部类Outer2
public class Outer2 {
    private static int id1 = 10;
    static int id2 = 11;

    private static void out1() {
        System.out.println("这是外部类的私有方法");
    }
    public static void out2() {
        System.out.println("这是外部类的公有方法");
    }

    
    //内部类+static(静态内部类)
    //外部类的没加static的私有、公有属性和方法拿不到了。静态内部类没办法访问非静态属性!
    /*原因:实例化外部类后,static静态内部类也随之加载了,而外部类的非静态属性方法还都没出生呢,所有拿不到*/
    //要想拿到,只能是外部类的私有、公有属性和方法也要加static
    public static class Inner2 {
        public void in() {
            System.out.println("这是内部类的公有方法");
        }

        public void getID() {
            System.out.println(id1);
            System.out.println(id2);
        }

        public void getOUT() {
            out1();
            out2();
        }
    }
}

public class Application2 {
    public static void main(String[] args) {
        Outer2 outer2 = new Outer2();
    }
}

3.3 局部内部类

1.创建一个外部类Outer3,在类Outer3里面定义一个方法,在这个方法里面创建局部内部类

//在外部类方法里面定义的类是局部内部类
public class Outer3 {
    public void method(){
        //局部内部类
        class Inner{}
    }
}

3.4 匿名内部类

没有名字初始化类,不用将实例保存到变量中

public class Outer4 {
    public static void main(){
        //正常调用
        //将实例保存到变量中了
        Apple apple = new Apple();
        apple.eat();


        //匿名内部类
        //没有名字初始化类,不用将实例保存到变量中
        new Apple().eat();

        //new接 口    也不需要名字 也是匿名
         UserService userService= new UserService(){
            @Override
            public void Hello(){
            }
        };

    }
}
//类Apple
class Apple{
    public void eat(){
        System.out.println("1");
    }
}
//接口
interface UserService{
    void Hello();
}

4 总结各个内部类

//成员内部类
1.成员内部类可以获得其外部类的私有属性和私有方法!(外部类公有的更能获得!),正常类是做不到的。
    
//静态内部类
1.内部类+static(静态内部类)
2.外部类的没加static的私有、公有属性和方法拿不到了,静态内部类没办法访问非静态属性!
原因:实例化外部类后,static静态内部类也随之加载了,而外部类的非静态属性方法还都没出生呢,所有拿不到。
要想拿到,只能是外部类的私有、公有属性和方法也要加static
    
//局部内部类
1.在外部类的方法里面定义的类是局部内部类
    
//匿名内部类
1.没有名字初始化类,不用将实例保存到变量中 new Apple().eat();
posted @ 2022-04-08 19:05  intelliyu  阅读(20)  评论(0编辑  收藏  举报