把類定義在其餘類的內部;在A類中定義一個B類,B類就是內部類面試
1 內部類能夠直接訪問外部類的成員,包括私有ide
2 外部類要訪問內部類的成員,必須建立對象this
位置劃分: 成員內部類,局部內部類spa
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(); } }
內部類的簡化寫法get
前提: 存在一個類(具體類或者抽象類)或者接口class
格式: 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(); } }