浅谈四种内部类

Java中内部类分为四种,分别是静态内部类、成员内部类、局部内部类和匿名内部类。下面分别介绍这四种内部类以及相互之间的联系和区别。

 

1. 静态内部类(static inner class)

1.1 定义方式

public class OuterClass{//外部类
    public static class StaticInnerClass{ } //这个为静态内部类
}

1.2 实例化方式

OuterClass.StaticInnerClass innerClass = new OuterClass.StaticInnerClass();

1.3 注意事项

由于此内部类为静态内部类,所以它只能访问外部类中的静态成员变量和静态成员方法,不能访问非静态的成员变量和方法。理解这一点可以类比静态方法。

 

2. 成员内部类(member inner class)

2.1 定义方式

public class OuterClass{//外部类
    public class MemberInnerClass{ } //这个为成员内部类
}

2.2 实例化方式

OuterClass.MembetInnerClass innerClass = new OuterClass().new MemberInnerClass();

2.3 注意事项

由于此内部类为成员内部类,所以它能访问外部类中的所有成员变量和成员方法,包括静态和非静态。理解这一点可以类比普通方法。

【对比】静态内部类和成员内部类的实例化方式:

由于静态内部类的对象是属于外部类,而不是属于外部类的对象,所以其实例化时直接通过外部类的类名加内部类的类名来完成。而成员内部类的对象属于外部类的对象,所以其实例化需要通过外部类的对象加内部类的类名来完成。

 

3. 局部内部类(local inner class)

3.1 定义方式

public class OuterClass{//外部类
    public void test(){//外部类中的方法
        class LocalInnerClass{ } //局部内部类
        //此处实例化局部内部类的方法
       }
}

3.2 实例化方式

由于局部内部类在OuterClass类以外无法访问(理解这一点可以类比方法的局部变量),所以对局部内部类的访问只能在定义该类的方法中完成。

3.3 注意事项

局部内部类只能访问外部类的final类型的变量。

 

4. 匿名内部类(anonymous inner class)

4.1 定义方式

public class OuterClass{
    public Strring get(Date date){
        return data.toLocaleString();
    }

    public static void main(String[] args){
        OuterClass outerClass = new OuterClass();

        String str = outerClass.get(new Date()){
            @Override
            public String toLocaleString(){
                return "hello world";
            }//匿名内部类结束

        };
    }
}

4.2 实例化方式

由于匿名内部类没有类名,也就没有构造方法,所以无法进行实例化。

4.3 注意事项

(1)匿名内部类没有类名,没有访问修饰符,没有extends和implements等关键字,也没有构造方法。

(2)匿名内部类隐式的继承了一个类或者实现了一个接口,上面例子中就是继承了Date类。(继承的类或者实现的接口就是new后面的那个类或者接口)

 

5. 结语

以上是本人关于内部类的理解,如有不当之处,敬请指正。

 

    原文作者:冷血有情556
    原文地址: https://blog.csdn.net/liu_005/article/details/48269407
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞