内部类分为三种:成员内部类、局部内部类、匿名内部类
/*
* 成员内部类:
* 在类的成员位置,和成员变量以及成员方法所在的位置是一样的
* 在内部类当中,可以直接访问外部类的成员,包括私有成员
*
* 成员内部类的修饰符:
* 我们可以使用权限修饰符修饰成员内部类,但是如果使用私有来修饰,则无法在其他类中访问
* 我们可以使用static修饰成员内部类,不用再创建外部类的对象了
*
* 我们可以使用abstract,final修饰成员内部类
*/
/*
* 局部内部类
* 在方法内,出了方法之后就无法使用(参考代码块特点)
*/
/*
* 匿名内部类:
* 可以把匿名内部类看成是一个没有名字的局部内部类
* 定义在方法当中
* 必须在定义匿名内部类的时候创建他的对象
* 格式:
* new 类/接口(){
* 如果是创建了继承这个类的子类对象,我们可以重写父类的方法
* 如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法
* };
* 原理:而是创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象
*
*/
package day27_内部类; /** 成员内部类:* 在类的成员位置,和成员变量以及成员方法所在的位置是一样的* 在内部类当中,可以直接访问外部类的成员,包括私有成员** 成员内部类的修饰符:* 我们可以使用权限修饰符修饰成员内部类,但是如果使用私有来修饰,则无法在其他类中访问* 我们可以使用static修饰成员内部类,不用再创建外部类的对象了** 我们可以使用abstract,final修饰成员内部类*/ public class InnerDemo {public static void main(String[] args) {Outer.Inner i = new Outer().new Inner();i.function();Outer.Inner2.eat();} }class Outer {private int num = 10;class Inner {public void function() {System.out.println(num);}}static class Inner2 {public static void eat() {System.out.println("吃东西");}} }
输出
/** 局部内部类* 在方法内,出了方法之后就无法使用(参考代码块特点)*/ public class InnerDemo2 {public static void main(String[] args) {Outer2 o = new Outer2();o.method();} }class Outer2 {public void method() {int num = 10;class Inner {public void eat() {System.out.println("狗吃肉");}}Inner i = new Inner();i.eat();}//出了method方法,方法内的变量、类都不可使用。public void fun() { // Inner i = new Inner(); // System.out.println(num); } }
输出