Java内部类详解(三大内部类)

Posted 师兄白泽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java内部类详解(三大内部类)相关的知识,希望对你有一定的参考价值。

Java内部类详解

1. 什么是内部类?

简单来说,内部类就是在一个类中定义的一个或多个类。把这一个类成为外部类。
内部类是一个非常有用的特性,因为他允许你把一些逻辑相关的类组织在一起,并控制位于内部类的可视性,但是要注意内部类和组合是完全不同的概念。
组合: 组合是一种代码复用机制,组合的是对象,通俗的理解是在一个类中创建或引用另一个类的对象。
内部类: 内部类是一种代码隐藏机制,通俗的理解是在一个类的内部定义另一个类。根据定义位置的不同,可以分为:成员内部类、局部内部类、匿名内部类和静态内部类。
内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);外部类需要创建内部类的对象,才能访问内部类的成员和方法。
与C++不同的是在C++中只是单纯的名字隐藏机制,与外围对象没有联系,也没有隐含的访问权。

2. 内部类的分类:

  1. 成员内部类
class Outter{
    private String name;//定义成员变量
    //定义成员方法,方法中访问内部类
    public void test(){
        Inner inner = new inner();
        inner.show();
    }
    //定义成员内部类
    class Inner{
        //在成员内部类的方法中访问外部类的成员变量
        void show(){
            System.out.print("name="+name);
        }
    }
}
public class Example{
    public static void main(String[] args){
        Outter outter = new Outter();//创建外部类对象
        outter.test();//调用test方法
    }
}

注:如果想用外部类去访问内部类,则需要通过外部类的对象去创建内部类的对象,语法如下:
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();

  1. 静态内部类
    可以使用static关键字修饰一个成员内部类,该内部类称为静态内部类,他可以在不创建外部对象的情况下被实例化。语法如下:
    外部类名.内部类名 变量名 = new 外部类名().内部类名();
class Outter{
    private static String name;//定义成员变量
    //定义静态内部类
    static class Inner{
        //在成员内部类的方法中访问外部类的成员变量
        void show(){
            System.out.print("name="+name);
        }
    }
}
public class Example{
    public static void main(String[] args){
        Outter.Inner inner = new Outter.Inner();//创建内部类对象
        inner.show();//调用show方法
    }
}

注:
在静态内部类中只能访问外部类的静态成员,去掉静态会报错
在静态内部类中可以定义静态的成员,而在非静态的内部类中不允许定义静态成员。

  1. 方法内部类
    方法内部类是指在成员方法中定义的类,它只能在当前方法中被使用。
class Outter{
    private static String name;//定义成员变量
    //定义成员方法,方法中访问内部类
    public void test(){
        //方法中的内部类
        class Inner{
            void show(){
                System.out.print("name="+name);//访问外部类的成员变量
            }
        }
        Inner inner = new Inner();
        inner.show();
    }
}
public class Example{
    public static void main(String[] args){
        Outter outter = new Outter();//创建外部访问对象
        inner.test();//调用test()方法
    }
}

以上是关于Java内部类详解(三大内部类)的主要内容,如果未能解决你的问题,请参考以下文章

Java之局部内部类和匿名内部类的区别详解(附源码)

Java内部类详解(含:成员内部类局部内部类匿名内部类静态内部类)

局部内部类详解

Java面向对象之内部类的详解

java四种内部类详解

第38题JAVA高级技术-内部类2(局部内部类)