Java内部类
1.内部类访问规则:
(1)成员内部类中不可以有静态属性;静态内部类可以有;
(2)内部类可以直接访问外部类中的成员,包括私有;
(3)外部类访问内部类,必须实例化内部类;
public class Test01 { public static void main(String[] args) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); System.out.println(inner.s3); System.out.println(inner.s4); } } class Outer{ String s1 = "s1"; private String s2 = "s2"; class Inner{ String s3 = "s1"; String s4 = s2; } }
2.静态内部类:
(1)静态内部类只能访问外部静态成员;
(2)可以直接用"外部类名.内部类名.静态成员"调用静态成员;
(3)可以不依赖外部类实例创建对象;
public class Test { public static void main(String[] args) { Outer outer = new Outer(); System.out.println(Outer.Inner.s3); Outer.Inner inner = new Outer.Inner(); System.out.println(inner.s4); } } class Outer{ static String s1 = "s1"; private static String s2 = "s2"; static class Inner{ static String s3 = "s1"; String s4 = s2; } }
3.局部内部类:
1.不可以被成员修饰符修饰;
2.可以直接访问外部类中的成员;
3.不可访问它所在的局部中的变量,只能访问被final修饰的局部变量;//jdk1.8之后不用finnal修饰也可以
public class Test { public static void main(String[] args) { Outer outer = new Outer(); outer.test01(); } } class Outer{ String s1 = "s1..."; private String s2 = "s2..."; public void test01(){ String s3 = "s3..."; final String s4 = "s4..."; class Inner{ public void test02(){ String s11 = s1; String S12 = s2; String S13 = s3; String S14 = s4; System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4); } } Inner inner = new Inner(); inner.test02(); } }
4.匿名内部类:
1.匿名内部类前提:必须继承一个类或者实现接口;两者取其一;
2.匿名内部类格式: new 父类或者接口() {子类内容};
3.匿名注意点:
(1)不能有构造方法;
(2)不能有静态成员;
(3)所有抽象方法都要实现;
1)匿名内部类理解:
//接口 interface Demo{ public abstract void sayHi(); } //外部类 class Outer{ class Inner implements Demo{ @Override public void sayHi() { System.out.println("hi"); } } void run(){ new Inner().sayHi(); } } //测试 public class Test { public static void main(String[] args) { new Outer().run(); } }
2)匿名内部类:
//接口 interface Demo{ public abstract void sayHi(); } //外部类 class Outer{ void run(){ new Demo(){ @Override public void sayHi() { System.out.println("hi"); } }; } } //测试 public class Test { public static void main(String[] args) { new Outer().run(); } }