概念:在java中,一个类也可以定义在一个类的内部,定义在内部的类称为内部类(inner class),定义在外部的类称为外部类(out class)
语法:
public class Outer { [修饰符] class Inner{ } }
经过编译后这两个类是平行关系
分类:
一:成员内部类
上面的例子就是成员内部类,成员内部类一般都用默认修饰符
(1)内部类怎么创造对象呢
public class Test01 { public static void main(String[] args) { // 【1】先创建外部类对象 Outer outer = new Outer(); // 【2】创建内部类对象 Inner inner = outer.new Inner(); inner.showInfo(); } }
(2)内部类可以访问外部类的私有成员变量(原理:作用域作用)
public class Outer { private String name = "Outer"; class Inner{ public void showInfo() { System.out.println(name); } } }
特殊情况:如果内部类变量名和外部类变量名相同,那访问形式是
public class Outer { private String name = "Outer"; class Inner{ private String name = "Inner"; public void showInfo() {// 访问外部类的私有成员 System.out.println(this.name); // 访问外部类的私有成员 System.out.println(Outer.this.name); } } }
二:静态内部类
也就是内部类被static修饰符修饰了
(1)创建静态内部类
public class Test01 { public static void main(String[] args) { Inner inner = new Outer.Inner(); inner.showInfo(); } }
(2)静态内部类可以访问外部内的(私有)静态成员
public class Outer { private static String name = "Outer"; static class Inner{ public void showInfo() { System.out.println("showInfo"); System.out.println(name); } } }
三:方法内部类
将类定义到方法中
public class Outer { public void print() { class Inner{ public void showInfo() { System.out.println("show info"); } } Inner inner = new Inner(); inner.showInfo(); } }
注意:如果方法中的变量进入该内部类,那么自动被final修饰变成常量
public class Outer { public void print(int b) { int a = 10; class Inner{ public void showInfo() { System.out.println("show info"); System.out.println("print() ->a:"+10); // 在方法内部类中不能修改方法的局部变量(final) // a = 20; // b = 20; } } a = 20; Inner inner = new Inner(); inner.showInfo(); } }
四:匿名内部类
如果要使用的类未来只会用到一次,那么可以声明该类为匿名的
*匿名内部类一定要实现接口
package cn.sxt01.inner04; public class Outer { public void print() { // 方法内部类 /*class Inner implements MyInterface{ @Override public void showInfo() { System.out.println("Inner:showInfo"); } }*/ /*Inner inner = new Inner(); inner.showInfo();*/ // new Inner().showInfo(); // 匿名内部类 new MyInterface(){ @Override public void showInfo() { System.out.println("Inner:showInfo"); } }.showInfo(); } }