内部类
把类定义在其他类的内部;在A类中定义一个B类,B类就是内部类
特点
1 内部类可以直接访问外部类的成员,包括私有
2 外部类要访问内部类的成员,必须创建对象
位置划分: 成员内部类,局部内部类
成员内部类创建对象: 外部类名.内部类名 对象名 = 外部类对象.内部类对象
class Out { private int outNum = 10; class In { public void getOutNum(){ // 10 System.out.println(outNum); } } } public class OutAndIn { public static void main(String[] args) { Out.In oi= new Out().new In(); oi.getOutNum(); } }
静态内部类: 只能访问外部类的静态成员
创建对象方式; 外部类名.内部类名 对象名 = new 外部类名.内部类名();
class Out { private static int outNum = 10; public static class In { public void getOutNum(){ // 10 System.out.println(outNum); } } } public class OutAndIn { public static void main(String[] args) { Out.In oi= new Out.In(); oi.getOutNum(); } }
面试题
class Out { private int num = 10; public class In { private int num = 30; public void getOutNum() { int num = 50; // 50 System.out.println(num); // 30 System.out.println(this.num); // 10 System.out.println(new Out().num); // 10 System.out.println(Out.this.num); } } } public class OutAndIn { public static void main(String[] args) { Out.In oi = new Out().new In(); oi.getOutNum(); } }
局部内部类
class Out { private int num = 10; public void getOutNum() { class In { public void getNum() { // 10 System.out.println(num); } } In in = new In(); in.getNum(); } } public class OutAndIn { public static void main(String[] args) { new Out().getOutNum(); } }
匿名内部类
内部类的简化写法
前提: 存在一个类(具体类或者抽象类)或者接口
格式: new 类名或者接口名() {重写方法}
本质: 是一个继承了类或者实现了接口的子类匿名对象
interface In { void getNum(); } class Out { private int num = 10; public void getOutNum() { new In() { @Override public void getNum() { System.out.println(num); } }.getNum(); } } public class OutAndIn { public static void main(String[] args) { new Out().getOutNum(); } }
interface In { void getNum(); } class Out { private int num = 10; public In getOutNum() { return new In() { @Override public void getNum() { System.out.println(num); } }; } } public class OutAndIn { public static void main(String[] args) { new Out().getOutNum().getNum(); } }