一、基本概念:
顾名思义,内部类存在于外部类当中,依附于外部类。就像眼睛和脑袋的关系一样。
二、几点说明:
1.内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 ;
2.内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的 ;
3.内部类声明成静态的,就不能随便的访问外部类的成员变量了,此时内部类只能访问外部类的静态成员变量 ;
4.内部类增加了代码的复杂性,有着诸多的缺点,其唯一有点就是可以访问外部类的所有成员。
三、分类:
1.成员内部类:
a).成员内部类可以看成是外部类的成员变量。
b).非静态内部类
1 public class Out { 2 3 int age; 4 String name; 5 private char sex; 6 7 8 class In { 9 10 int age;11 12 public void print() {13 //内部类可以访问任何权限的外部类成员14 System.out.println("姓名为:" + name + "\n" + "性别为:" + sex);15 }16 17 }18 }19 20 class Demo {21 22 public static void main(String[] args) {23 //非静态内部类对象的创建必须基于外部类对象(静态成员属于类,非静态成员属于对象)24 Out.In in = new Out().new In();25 in.print();26 }27 }
c).静态内部类
1 public class Out { 2 3 int age; 4 String name; 5 private char sex; 6 static int height; 7 8 9 static class In {10 11 int age;12 13 public void print() {14 //静态内部类只能访问外部类的静态变量15 System.out.println("身高为:" + height);16 }17 18 }19 }20 21 class Demo {22 23 public static void main(String[] args) {24 //静态内部类对象的创建可直接基于外部类(静态成员属于类,非静态成员属于对象)25 Out.In in = new Out.In();26 in.print();27 }28 }
d).私有内部类
1 public class Out { 2 3 int age; 4 String name; 5 private char sex; 6 static int height; 7 8 9 private class In {10 11 int age;12 13 public void print() {14 System.out.println("身高为:" + height);15 }16 17 }18 }19 20 class Demo {21 22 public static void main(String[] args) {23 //私有内部类只能在外部类内部使用,以下代码无效24 /*Out.In in = new Out.In();25 in.print();*/26 }27 }
2.匿名内部类:
a).内部类只使用一次时候,则定义为匿名内部类,节省定义新类的成本
b).匿名内部类在抽象类的实现
1 public abstract class Animal { 2 3 public abstract void eat(); 4 } 5 6 class Demo { 7 8 public static void main(String[] args) { 9 10 Animal dog = new Animal() {11 @Override12 public void eat() {13 System.out.println("狗吃骨头!!");14 }15 };16 dog.eat();17 }18 }
匿名内部类不允许定义构造函数.
c).匿名内部类在接口的实现
1 public interface Animal { 2 3 public abstract void eat(); 4 } 5 6 class Demo { 7 8 public static void main(String[] args) { 9 10 Animal cat = new Animal() {11 @Override12 public void eat() {13 System.out.println("猫吃鱼!!");14 }15 };16 cat.eat();17 }18 }
3.局部内部类:
a).局部内部类存在于方法体中,不常用
b).基本实现
1 public class Out { 2 3 //方法传参数给局部内部类时参数定义为fianl 4 public void outPrint(final String str) { 5 class In { 6 public void inPrint() { 7 System.out.println(str); 8 } 9 }10 new In().inPrint();11 }12 }13 14 class Demo {15 public static void main(String[] args) {16 new Out().outPrint("测试字符串!!");17 }18 }