Java基础十七(内部类)

内部类


为什么会有内部类?
在描述事物,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机这个事物,这时发动机就可以使用内部类来描述。即就是内部事物必须寄宿在外部事物内部。

class Outer{
        //外部类的成员变量
        int num = 5;
        //写在Outer成员位置上的内部类
        class Inner{
                //内部类的成员函数
                void show(){
                        //在内部类中访问外部类的成员变量
                        System.out.println("Outer num = "+num);
                }
        }
}

内部类访问规则

  • 内部类可以直接访问外部类中的成员,但外部类不能直接访问内部类,若要访问,必须创建内部类对象才能访问
public class Test {
        public static void main(String[] args) {
                Outer out = new Outer();
                out.method();
        }
}
class Outer{
        int num = 5;
        class Inner{
                //内部类的成员函数
                void show(){
                        //在内部类中访问外部类的成员变量
                        System.out.println("Outer num = "+num);
                }
        }
        public void method(){
                //创建内部类对象,访问内部类的成员函数或者变量
                Inner in = new Inner();
                in.show();
        }
}

外部类Outer不能直接访问内部类Inner,在函数method中创建内部类对象in,再由外部类调用method函数,实现外部类访问内部类。


非静态非私有内部类

如果内部类是非静态的,且权限是非私有的,就可以在外部类以外的其他类中访问。即可以通过创建外部类对完成访问内部类,访问格式如下:

 //通过创建外部类对象,接着创建内部类对象
 Outer.Inner in = new Outer().new Inner();
 in.show();

静态的非私有内部类

当内部类在外部类成员位置上被static修饰时,由于静态可以直接使用类名调用,则创建内部类对象的方式:

 //因为内部类是静态,所以不需要创建Outer的对象。直接创建内部类对象就哦了。
Outer.Inner in = new  Outer.Inner();
in.show();

访问静态内部类的静态成员

由于内部类是静态的,可以直接使用外部类名调用内部类,而内部类的成员也是静态的,这时同样可以通过类名调用内部类的静态成员。

//既然静态内部类已随外部类加载,而且静态成员随着类的加载而加载,就不需要对象,直接用类名调用即可
Outer.Inner.show();

使用static修饰内部类,该内部类属于其外部类,而不属于外部类的对象;
静态内部类可包括静态成员也可包括非静态成员。根据静态成员不能访问非静态成员的规定,所以静态内部类不能访问外部类实例成员,只能访问外部类的静态成员。

注意:非静态内部类中不能定义静态成员变量和静态成员函数。但可以定义静态成员常量。原因:常量在生成字节码文件时直接就替换成对应的数字。

扫描二维码关注公众号,回复: 8930162 查看本文章

当内部类在外部类成员位置上被私有修饰,在外部类意外的其他地方是无法访问的。只能在外部类中访问。

内部类可以直接访问外部类的成员,那时因为内部类持有外部类的引用(外部类.this)。对于静态内部类不持有 外部类.this 而是直接使用 外部类名

发布了70 篇原创文章 · 获赞 56 · 访问量 1992

猜你喜欢

转载自blog.csdn.net/qq_43624033/article/details/103483285