面向对象编程05. 内部类
内部类
- 内部类就是在一个类的内部再定义一个类,比如A类中定义一个B类,那么B类成为内部类,而A类相对B类来说就是外部类。
成员内部类
public class Application2 { public static void main(String[] args) { //实例化成员内部类需要先实例化外部类再实例化成员内部类 A a = new A(); a.new B().run();//不用对象调用A的成员内部类B的run方法 System.out.println("================================"); A.B b = a.new B();//a.new B后加Alt + Enter b.run(); } } class A{ private int id = 50; private void a(){ System.out.println("成员内部类B直接调用了外部类A的私有方法a"); } class B{ void run(){ System.out.println("成员内部类B可以调用外部类A的私有属性:id="+id); a();//成员内部类B直接调用了外部类A的私有方法 } } } 输出结果: 成员内部类B可以调用外部类A的私有属性:id=50 成员内部类B直接调用了外部类A的私有方法a ================================ 成员内部类B可以调用外部类A的私有属性:id=50 成员内部类B直接调用了外部类A的私有方法a
静态内部类
即用static
关键字修饰的成员内部类。因为此时内部类成了静态类,所以与成员内部类有所区别:
class Outer { private static int id = 50; private int age = 40; private void out(){ System.out.println("Outer类的私有方法"); } static class Inner{ public void getId(){ //内部类能获得外部类的私有属性和私有方法 System.out.println("外部类的私有static变量可以直接调用:id="+id);//外部类的私有static变量可以直接调用 System.out.println("外部类的实例变量要用对象来调用:"+new Outer().age);//外部类的实例变量要用对象来调用 new Outer().out();//外部类的非静态方法要用对象来调用 } } } /** * @author 15065170282 */ public class Application { public static void main(String[] args) { //实例化内部静态类的话就无需提前实例化外部类 //实例化内部static类 Outer.Inner inner = new Outer.Inner(); inner.getId(); } } 输出结果: 外部类的私有static变量可以直接调用:id=50 外部类的实例变量要用对象来调用:40 Outer类的私有方法
局部内部类
在方法中定义的类:
private void out(){ class A{ void run(){ } } System.out.println("Outer类的私有方法"); }
匿名内部类
没有名字初始化类和接口:
public class Application3 { public static void main(String[] args) { //没有名字初始化类,不用将实例保存到变量中 new One().one(); //初始化接口 UserService userService = new UserService() {//实现了接口的匿名内部类 @Override public void use() { System.out.println("UserService接口中的use方法在匿名实现后被执行了"); } }; userService.use(); } } class One{ public void one(){ System.out.println("One的方法one被执行了"); } } interface UserService{ void use(); } 输出结果: One的方法one被执行了 UserService接口中的use方法在匿名实现后被执行了