成员内部类又分为静态成员内部内和非静态成员内部类 局部内部类可以位于方法内、块内、构造器内 成员内部类:分为成员内部类和局部内部类
(1) 成员内部类可以访问外部类的所有内容,包括静态和非静态的都可以访问 (2)静态成员内部类只能访问外部类的静态成员、静态方法,因为静态内部类是不依赖实例对象的,即便实例对象不存在也能运行,因此静态的只能访问静态的,避免出现问题
class Demo { private static String dept; private String name; class InnerDemo { public void InnerFunc() { System.out.println("外部类的静态和非静态成员变量" + name + dept); outerFunc(); outerStaticFunc(); } } /** * 静态类是不依赖实例对象的,即便实例对象不存在也能运行,因此静态的只能访问静态的,避免出现问题 */ static class StaticInnerDemo { public void InnerFunc() { System.out.println("只能访问外部类的静态方法和变量:" + dept); outerStaticFunc(); } } public void outerFunc() { System.out.println("外部类非静态方法"); } public static void outerStaticFunc() { System.out.println("外部类静态方法"); } }(3)外部类不能直接访问内部类的成员变量和方法,因为作用域不同,但可以通过内部类的实例对象进行调用,或者通过静态内部类.静态方法和成员变量进行调用
class Demo { private static String dept; private String name; class InnerDemo { public void InnerFunc() { StaticInnerDemo.staticInnerFunc(); new StaticInnerDemo().InnerFunc(); } } /** * 静态类是不依赖实例对象的,即便实例对象不存在也能运行,因此静态的只能访问静态的,避免出现问题 */ static class StaticInnerDemo { public void InnerFunc() { System.out.println("只能访问外部类的静态方法和变量:" + dept); outerStaticFunc(); } public static void staticInnerFunc() { System.out.println("内部类静态方法"); } }(4)内部类和外部类的变量名相同,调用方式如下:
class Demo { private int num = 10; class InnerDemo { private int num = 20; public void InnerFunc() { int num = 30; System.out.println(num); //30 就近原则 System.out.println(this.num);//20 System.out.println(Demo.this.num);//10 } } }(5) 静态和非静态内部类对象的创建方式如下:
public class Main { public static void main(String[] args) { //非静态内部类创建方式 Demo demo = new Demo(); Demo.InnerDemo innerDemo = demo.new InnerDemo(); System.out.println(innerDemo); //静态内部类创建方式 Demo.StaticInnerDemo staticInnerDemo = new Demo.StaticInnerDemo(); System.out.println(staticInnerDemo); } }匿名内部类实际就是局部内部类的定义和对象创建过程的代码集合
public class TestA { @Test public void test(){ int j=10; Runnable a=new Runnable() { @Override public void run() { //j=100;//此处不能这些写,匿名内部类方法访问外层的局部变量,要求局部变量必须是final修饰的 System.out.println(j); } }; a.run(); } }