概念:在一个类的内部再定义一个完整的类
class Outer{ class Inner{ } }
特点:
在类的内部定义,与实例变量(属性)、实例方法同级别的类。
外部类的一个实例部分,创建内部类对象时,必须依赖外部类对象。
Outer out = new Outer(); Inner in = new Inner();
MemberInner.java
package com.commonClass.demo01; //外部类 public class MemberInner { //实例变量(属性) private String name = "大白很白"; private int age = 100; //内部类 class Inner{ private String address = "火星"; private String phone = "130"; //方法 public void show(){ //打印外部类的属性 System.out.println(name); System.out.println(age); //打印内部类中的属性 System.out.println(address); System.out.println(phone); } } }
TestOuter.java
package com.commonClass.demo01; public class TestOuter { public static void main(String[] args) { //1.创建外部类对象 // MemberInner memberInner = new MemberInner(); //2.创建内部类对象 // MemberInner.Inner inner = memberInner.new Inner(); //一步到位 MemberInner.Inner inner = new MemberInner().new Inner(); inner.show(); /* 大白很白 100 火星 130 */ } }
不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员。
只能直接访问外部类的静态成员(实例成员需实例化外部类对象)。
Outer.Inner inner = new Outer.Inner(); Outer.Inner.show();
Outer.java
package com.commonClass.demo02; public class Outer { private String name = "我的母语是无语"; private int age = 100; //静态内部类:级别和外部类相同 static class Inner{ private String address = "地球"; private String phone = "111"; //静态成员 private static int count = 1000; public void show(){ //调用外部类的属性 //1.先创建外部类对象 Outer outer = new Outer(); System.out.println(outer.name); System.out.println(outer.age); //调用静态内部类的属性和方法 System.out.println(address); System.out.println(phone); //调用静态内部类的静态属性 System.out.println(Inner.count); } } }
TestOuter.java
package com.commonClass.demo02; public class TestOuter { public static void main(String[] args) { //直接创建静态内部类对象 Outer.Inner inner = new Outer.Inner(); //调用方法 inner.show(); /* 我的母语是无语 100 地球 111 1000 */ } }
定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。
局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。
限制类的使用范围。
Outer.java
package com.commonClass.demo03; //外部类 public class Outer { private String name = "野猪"; private int age = 10; public void show(){ //定义局部变量 String address = "亚特兰蒂斯";//省略final //局部内部类:不能加任何访问修饰符 class Inner{ //局部内部类的属性 private String phone = "123456"; private String email = "dabai@123.com"; //private final static int count = 12; public void show2(){ //访问外部类的属性 System.out.println(name);//省略了Outer.this. System.out.println(age);//省略了Outer.this. //访问内部类的属性 System.out.println(phone);//省略了this. System.out.println(email);//省略了this. //访问局部变量,jdk1.7要求,变量必须是常量final,jdk1.8自动添加final System.out.println(address);//变为常量:亚特兰蒂斯 } } //创建局部内部类对象 Inner inner = new Inner(); inner.show2(); } }
TestOuter.java
package com.commonClass.demo03; public class TestOuter { public static void main(String[] args) { Outer outer = new Outer(); outer.show(); /* 野猪 10 123456 dabai@123.com 亚特兰蒂斯 */ } }
Usb.java
package com.commonClass.demo04; //接口 public interface Usb { //服务 void service(); }
Mouse.java
package com.commonClass.demo04; public class Mouse implements Usb{ @Override public void service() { System.out.println("连接电脑成功,鼠标开始工作了..."); } }
TestUsb.java
package com.commonClass.demo04; public class TestUsb { public static void main(String[] args) { //创建接口类型的变量 //Usb usb = new Mouse(); //usb.service();//连接电脑成功,鼠标开始工作了... //局部内部类 /* class Fan implements Usb{ @Override public void service() { System.out.println("连接电脑成功,风扇开始工作了..."); } } */ //Usb usb = new Fan(); //usb.service();//连接电脑成功,风扇开始工作了... //使用匿名内部类优化(相当于创建了一个局部内部类) Usb usb = new Usb() { @Override public void service() { System.out.println("连接电脑成功,风扇开始工作了..."); } }; usb.service();//连接电脑成功,风扇开始工作了... } }