Java中的内部类

总述: 内部类作为Java中重要的机制,其创建和使用有许多独有的特点,本文主要介绍内部类对象的创建方法以及各种内部类的使用

一:什么是内部类

内部类是定义在类中的类,他可以访问所在外部类中的私有成员,并且仅其外部类中可见,达到隐藏自身的效果。

 

二:内部类的分类

内部类可分为4种,分别为:

1.成员内部类

  和外部类中成员变量和成员方法处于并列位置的内部类

2.局部内部类

  定义在外部类方法中的内部类

3.匿名内部类

  没有名字,通常作为回调函数使用,且只能使用一次

4.静态内部类

 

三:成员内部类

1.成员内部类中对外部类成员变量的访问方式

  方式一:直接通过变量名访问(默认使用外部类的引用)

 

1 class Outer{
2     private int num;
3     
4     public class Inner{
5         public void InnerMethod() {
6             System.out.println(num);
7         }
8     }
9 }

 

  此处,内部类Inner中的InnerMethod方法使用其所在外部类中的私有变量num

  方式二:通过外部类的引用来调用外部类中的私有变量

1 class Outer{
2     private int num;
3     
4     public class Inner{
5         public void InnerMethod() {
6             System.out.println(Outer.this.num);//不可直接使用外部类名进行调用
7         }
8     }
9 }

  此处Outer.this是Java中的一种特殊的语法规则,用于表示一个外部类对象的引用

 2.内部类对象的创建方法

  格式为

  外部类对象名.new 内部类名 (参数)

  例如:

 1 public class Test {
 2         public static void main(String[] args) {
 3             Outer out=new Outer(10);
 4             
 5             Outer.Inner inn=out.new Inner();//在其他类中创建Inner对象,必须指明创建内部类的外部类对象
 6         }
 7 }
 8 
 9 class Outer{
10     private int num;
11     
12     public Outer(int num) {
13         this.num=num;
14     }
15     
16     public void method() {
17         Inner in=this.new Inner();//在内部类的方法中通过this创建内部类对象
18     }
19     
20     public class Inner{
21         public void InnerMethod() {
22             System.out.println(Outer.this.num);//不可直接使用外部类名进行调用
23         }
24     }
25 }

  注意:Inner在其他类中的名字为Outer.Inner

 

四:局部内部类

1.作为定义在外部类方法中的内部类,仅有包含该内部类的方法可见,甚至外部类都不可见

2.局部内部类不能使用public或private修饰符修饰

3.局部类不仅可以访问外部类的私有变量,还可以访问方法中的局部变量

1     public void method2() {
2         class Inner2{
3             public void Inner2Method() {//一个定义在方法中的局部内部类
4                 System.out.println(num);
5             }
6         }
7         Inner2 in2=new Inner2();//注意:此处创建该内部类的对象不再使用this修饰符,因为该内部类仅方法内可见
8         in2.Inner2Method();
9     }

 

五:匿名内部类

匿名内部类没有对象名,只能使用一次,并且必须要继承或实现一个类或接口,定义格式为:

1 new 父类/接口名(构造参数) {
2     内部类方法或变量
3 }

例如:

创建一个抽象的父类:

1 abstract class Father{
2     public abstract void FatherMethod();
3 };

在main方法中创建一个用于实现父类中抽象方法的匿名内部类

public class Test {
        public static void main(String[] args) {
        
            Father f=new Father() {
                public void FatherMethod(){
                    System.out.println("我实现了父类中的method方法");
                }
            };
            f.FatherMethod();
        }
}

五:静态内部类

将在以后介绍

上一篇:内部类粗解


下一篇:js闭包