一:为什么使用内部类?
1.每个内部类都能够独立的继承自一个(接口的)实现,所以无论外部类是否继承了一个(接口的)实现,对这个内部类都没有影响。
2.内部类提供了更好的封装,只有外部类能访问内部类。
二:内部类的使用
1.成员内部类:
如果一个类定义在了另一个类的内部,那么这个类就是成员内部类。成员内部类可以直接访问外部类的所有方法和属性。
public class Outter { private int x = 1; private static int y = 2; private void outterMethod(){ System.out.println("outterMethod"); }public class Inner{ public void innerMethod(){ System.out.println(x); //访问外部类的属性 System.out.println(y); outterMethod(); //访问外部类的方法 } } }
public class JavaSeTest { @Test public void innerTest(){
//成员内部类的创建方式:先创建一个外部类,然后再创建成员内部类 Outter outter = new Outter(); Outter.Inner inner = outter.new Inner(); inner.innerMethod(); } }
外部类不能直接访问内部类的方法和属性,需要通过内部类来访问
public class Outter { private int x = 1; private static int y = 2; public void callInnerMehtod(){ new Inner().innerMethod(); //先创建内部类,然后通过这个内部类对象来访问内部类的方法 } public class Inner{ public void innerMethod(){ System.out.println("innerMethod"); } } }
2.局部内部类
如果一个类定义在了方法或者作用域内,那么这个类称之为局部内部类;局部内部类不能用private,protected,public,static修饰,仅能用abstract,final来修饰。它的访问权限在这个方法或者作用域内。注意,成员内部类的访问权限是在外部类。
定义在方法内:
//Outter是外部类,Inner是局部内部类,定义在了getInnerClass方法中
public class Outter { public InnerInterface getInnerClass(String str){ class Inner implements InnerInterface{ private String name; public String getName(){ return this.name; } public Inner(String str){ this.name = str; } } return new Inner(str); }
3.匿名内部类
匿名内部类注意:
3.1 匿名内部类必须实现一个接口或者继承一个抽象类,同时要实现这个抽象类或者接口中的所有方法;
3.2 匿名内部类不能定义构造函数,匿名内部类也是一个局部内部类,匿名内部类不能存在静态方法或静态成员变量。
public class Person { private String name; public Person(String name){ this.name = name; } public void driveCar(Car car){ System.out.println(name+"驾驶"+car.run()); } } public interface Car { public String run(); } @Test public void innerTest(){ Person person = new Person("梁朝伟");
//以下蓝色代码块就是匿名内部类 person.driveCar(new Car(){ public String run() { return "保时捷跑1000公里"; } }); } }
4.静态内部类
静态内部类只能访问外部类的静态方法和静态成员变量,不能访问外部类的非静态方法和非静态成员变量
public class Outter { private static int age; private String name; static class Inner{ public void innerMethod(){ System.out.println(age); } } }