【JavaSE】内部类讲解(一)

简介: 【JavaSE】内部类讲解

一、什么是内部类

       一个类在另一个类的内部,这个就叫内部类。

       如下图,InnerClass 类就是内部类,而 OuterClass 类就叫外部类

二、内部类简单介绍

 在Java中,可以将一个类定义在另一个类或者一个方法的内部,前者为内部类,后者为外部类。

内部类是封装的一种体现

创建内部类时,我们要明确两点:

     1.定义在class 类名{} 花括号外部的,即使是在一个文件夹里,都不能称为内部类!!

class OuterClass{
    class InnerClass{
    }
}
public class Demo3 {

OuterClass 和 Demo3 彼此互相独立,不能为对方的内部类

     2.内部类和外部类共用一个java 源文件,但是经过编译之后,内部类会形成单独的字节码文件。

内部类生成的字节码文件名:外部类$内部类.class


同时,内部类类型可以分为四种,分别为 实例内部类、静态内部类、本地内部类 (了解)、匿名内部类   ,下面我将依依为大家介绍。

三、实例内部类

实例内部类是内部类中比较普通的,如下类型就是实例内部类

class Out{
    //实例内部类
    class Inner{
    }

(1)实例内部类的成员变量和方法的构建

跟普通类的一样,实例内部类也能构建自己的成员变量和方法(包括构造方法)

class Out{
    class Inner{
        public int data2 = 3;
        private int data3 = 4;
        public void Inner(){
            System.out.println("实例内部类的构造方法");
        }
        public void InnerFunc(){
            System.out.println("实例内部类的普通方法");
        }
    }

需要注意:

     ① 在实例内部类中,不能构建静态的成员变量,要想构建静态的成员变量,必须加 final

   

     ② 在实例内部类中,不能构建静态的成员方法,就算加 final 也不行!!

(2)实例内部类在类外创建

由于内部类的特殊性,不能用类名实例化对象!!必须要借助外部类的实例化对象辅助,如下

外部类.内部类 变量名 = 外部类实例.new 内部类;
class Out{
    class Inner{
        public int data2 = 3;
        public void Inner(){
            System.out.println("实例内部类的构造方法");
        }
        public void InnerFunc(){
            System.out.println("实例内部类的普通方法");
        }
    }
}
public class Demo2 {
    public static void main(String[] args) {
        Out out = new Out();
        Out.Inner inner = out.new Inner();
        //也可以写为 Out.Inner inner = new Out().new Inner();
        inner.InnerFunc();
        System.out.println(inner.data2);
    }
}

为什么要借助外部类对象才能实例化内部类?

  我们可以把内部类Inner 当成外部类 Out 的一个实例成员,实例成员的调用都是依赖对象的。这也就是为啥要有 外部类对象才能获取 实例内部类的原因。


注意:

     在外部类的方法中,能直接用内部类实例化成员变量,不必再借用外部类的实例化对象

class Out{
    class Inner{
        public void Inner(){
            System.out.println("实例内部类的构造方法");
        }
        public void InnerFunc(){
            System.out.println("实例内部类的普通成员方法");
        }
    }
    // 外部类 的成员方法 
    public void Func(){
        Inner inner = new Inner();
        inner.InnerFunc();
    }
}

(3)在内部类访问外部类的成员变量

在内部类中可以访问外部类的成员变量

例如:

class Out{
    public int data1 = 1;
    private int data2 = 2;
    class Inner{
        public int data3 = 3;
        private int data4 = 4;
        public void InnerFunc(){
            System.out.println(data1);
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
        }
    }
}

       

在内部类中访问外部类的成员变量都几条规则需要大家掌握:


     ① 当实例内部类的成员变量跟外部类的成员变量同名时,按就近原则访问

class Out{
    public int data1 = 1;
    class Inner{
        public int data1 = 11;
        public void InnerFunc(){
            System.out.println(data1);
        }
    }
}

 

      ② 访问同名的外部类成员变量 需要外部类名+this才能访问  Out.this.data1

class Out{
    public int data1 = 1;
    class Inner{
        public int data1 = 11;
        public void InnerFunc(){
            System.out.println(data1);
            System.out.println("外部类的data1:"+Out.this.data1);
        }
    }
}


      ③ 访问静态同名的外部类成员变量 需要外部类 才能访问 Out.data2

class Out{
    public int data1 = 1;
    public static int data2 = 2;
    class Inner{
        public int data1 = 11;
        public static final int data2 = 22;
        public void InnerFunc(){
            System.out.println(data2);
            System.out.println("外部类的data2:"+Out.data2);
        }
    }
}

(4)总结

相关文章
|
11月前
|
Java
【JavaSE】详解final关键字
【JavaSE】详解final关键字
|
Java 编译器
【JAVASE】继承 中
【JAVASE】继承
|
Java 程序员 编译器
【JavaSE】一起学继承
【JavaSE】一起学继承
|
6月前
|
Java
JavaSE学习之--抽象类,接口,内部类(一)
JavaSE学习之--抽象类,接口,内部类(一)
87 0
|
6月前
|
存储 Java 编译器
JavaSE学习之--抽象类,接口,内部类(三)
JavaSE学习之--抽象类,接口,内部类(三)
39 0
|
6月前
|
存储 Java 机器人
JavaSE学习之--抽象类,接口,内部类(二)
JavaSE学习之--抽象类,接口,内部类(二)
55 0
|
11月前
|
Java
【JavaSE】内部类
【JavaSE】内部类
|
Java 程序员
【JAVASE】继承 上
【JAVASE】继承