解读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 + "
" + "性别为:" + 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 }
原文地址:https://www.cnblogs.com/coderls/p/6435302.html