解读Java内部类
一、基本概念:
顾名思义,内部类存在于外部类当中,依附于外部类。就像眼睛和脑袋的关系一样。
二、几点说明:
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 @Override 12 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 @Override 12 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 }