Java基础:内部类

Java基础:内部类



N种内部类

  • 常见的内部类:
    • 常规内部类
    • 静态内部类
    • 局部内部类
    • 匿名内部类

常规内部类

  • 没有 static 关键字修饰且定义在外部类中

  • 内部类可以直接访问外部类的私有属性

  • 示例:

    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);
            }
    
        }
    
    }
    
    public class Application {
        public static void main(String[] args) {
            Outer outer = new Outer();//实例化外部类
            outer.out();
            //通过外部类来实例化内部类
            Outer.Inner inner = outer.new Inner();//实例化内部类
            inner.in();
            inner.getID();
        }
    }
    

    输出

    这是外部类的方法
    这是内部类的方法
    10
    

静态内部类

  • 与常规内部类不同,静态内部类有 static 关键字修饰且定义在外部类中

  • 不能直接访问外部类的非静态属性

  • 示例

    public class Outer {
    
        private static int id = 10;    //私有属性
    
        public static class Inner {	//静态内部类只能直接访问外部类的静态属性
    
            //获取外部类的静态属性
            public void getID() {
                System.out.println(id);
            }
    
        }
    
    }
    
    public class Application {
        public static void main(String[] args) {
            Outer outer = new Outer();
            //通过外部类来实例化内部类
            Outer.Inner inner = new Outer.Inner();//实例化静态内部类
            inner.getID();
        }
    }
    

    输出

    10
    

局部内部类

  • 定义在方法体或语句块中的类

  • 不能加访问任何修饰符

  • 示例:

    public class Outer {
    
        public void method() {
            //第一种局部内部类
            class Inner{
    
            }
    
        }
    
    }
    
    //一个java类中,可以有多个class类,但是只能有一个public类
    //第二种局部内部类
    class A{
    
    }
    

匿名内部类

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

  • 示例:

    public class Test {
        public static void main(String[] args) {
            //没有名字初始化类,不用将实例保存到变量中
            new Apple().eat();  //匿名内部类
    
            new UserService() {	//匿名内部类
    
                @Override
                public void hello() {
    
                }
            };
    
        }
    }
    
    class Apple {
       public void eat(){
           System.out.println("1");
       }
    }
    interface UserService{
        void hello();
    }
    
posted @ 2021-04-13 20:02  D..T  阅读(48)  评论(0编辑  收藏  举报