Java 内部类

## 内部类

内部类就是在一个类的内部再定义一个类。如:

Class A {
    Class B{
        
    }
}

A 是 B 的外部类,B 是 A 的内部类

成员内部类

public class Outer {
    private int id ;
    public  void out() {
        System.out.println("外部类的方法");
    }
    
	// 成员内部类
    public class Inner {
        public  void inner() {
            System.out.println("内部类的方法");
        }

        // 可以直接使用外部类的属性/方法
        public void getOuterId(){
            System.out.println("内部类调用外部类属性和方法");
            // 创建成员内部类之前肯定要创建外部类对象
            // 即使id不是静态变量、out不是静态方法,但创建外部类对象时已经存在。
            System.out.println(id);
            out();
        }
    }
}

image-20200512155751798

静态内部类

看到静态二字难免想起 static,没错!在成员内部类的基础上添加static修饰符,内部类即成为静态内部类

image-20200512155922614

此时,静态内部类与外部类一起加载,所以不能调用非静态的属性和方法!

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

    public static void outStatic() {
        System.out.println("外部类的静态方法");
    }

    // 静态内部类
    public static class Inner {
        public void inner() {
            System.out.println("内部类的方法");
        }

        // 可以直接使用外部类的 静态!! 属性/方法
        public void getOuterId(){
            System.out.println("内部类调用外部类 静态!! 属性和方法");
            outStatic();
        }
    }
}

image-20200512160516325

局部内部类

局部内部类与局部变量类似,在方法中声明

public class Outer {

    public void out() {
        System.out.println("进入外部类的方法");
        // 局部内部类
        class Inner {
            public void inner() {
                System.out.println("局部内部类与局部变量类似,在方法中声明");
            }
        }

        Inner inner = new Inner();
        inner.inner();
    }
}

image-20200512161410153

匿名内部类

public class Application {
    public static void main(String[] args) {
        // 匿名内部类在多线程中的使用,到时候再深究
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类实现线程的逻辑操作");
            }
        });
        // 开启线程
        thread.start();
    }
}

源文件声明规则

在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。

  • 一个源文件中只能有一个public类
  • 一个源文件可以有多个非public类
  • 源文件的名称应该和public类的类名保持一致。例如:源文件中public类的类名是Employee,那么源文件应该命名为Employee.java。
  • 如果一个类定义在某个包中,那么package语句应该在源文件的首行。
  • 如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。
  • import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。

除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。

原文地址:https://www.cnblogs.com/1101-/p/12882821.html