局部内部类和成员内部类

Posted wurengen

tags:

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

什么是内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类。

内部类的种类?

  • 成员内部类
  • 局部内部类

成员内部类 :

定义在类中方法外的类

定义格式:

技术图片

注意事项:

  • 内部类可以直接访问外部类的成员,包括私有成员。
  • 外部类要访问内部类的成员,有2种方式:

方式一:外部类方法中,创建内部类对象,间接访问内部类成员

方式二:创建内部类的对象 格式为:

技术图片

内部类重名访问:

  • 在内部类中要访问,本类的局部变量 直接写变量名
  • 在内部类中要访问,本类的成员变量格式:this.变量名
  • 在内部类中要访问,外部类成员变量格式:外部类名称.this.外部类成员变量名

代码举例:

public class Body { //外部类
    class heart { //成员内部类
        String name = "王五";

        public void methodheart() {//内部类方法
            String name = "李四";
            System.out.println("我是成员内部类成员方法");
            //访问内部类局部变量
            System.out.println(name);//李四
            //访问内部类成员变量
            System.out.println(this.name);// 王五
            //访问外部类成员变量
            System.out.println(Body.this.name);//张三

        }
    }

    private String name = "张三";

    public void methodBody() {
        System.out.println("我是外部类成员方法");
        // 使用内部类方式一 ,在外部类方法中创建内部类对象,使用内部类成员
        new heart().methodheart();
    }

}

测试代码

public class Demo01InnerClass {
    public static void main(String[] args) {
        // 创建外部类对象,调用外部类方法,间接使用内部类成员
        Body body = new Body();
        body.methodBody();
        //==============================================================
        //方式2 直接调用.创建内部类对象
        Body.heart b = new Body().new heart();//
        // 内部类对象,使用成员
        b.methodheart();
    }
}

局部内部类

一个类定义在一个方法内部,那么这就是一个局部内部类。

“局部”:只有当前所属的方法才能使用,出了方法就不能使用了

定义格式:

修饰符  class  外部类名称{

         修饰符  返回值类型  外部类方法名称(参数列表){

                       class  局部内部类名称{

                              //...

                            }

             }

}

使用:

在外部类方法里创建,内部类对象。在调用内部类成员

代码举例:

package demo02;

public class Outer {
    
    public void methodOuter(){
        class  Inner{
            int age = 18;
            public  void  InnerMethod(){
                System.out.println("我是局部内部类方法");
            }


        }
        // 创建内部类对象
        Inner inner = new Inner();
        //输出局部内部类的成员变量
        System.out.println(inner.age);
        //调用局部内部类的方法
        inner.InnerMethod();

    }
}

测试代码

package demo02;

public class Test {
    public static void main(String[] args) {
        // 创建外部类对象
        Outer o = new Outer();
        //调用外部类方法,间接访问内部类属性
        o.methodOuter();
    }
}

总结:

  • 外部类的权限修饰符 要么不写 要么就是public
  • 成员内部类的权限修饰符可以是四种修饰符中的一种
  • 局部内部类 不能写修饰符
  • 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是常量,原因是类和方法的生命周期不一样。常量可以copy进入常量池使用。

 

以上是关于局部内部类和成员内部类的主要内容,如果未能解决你的问题,请参考以下文章

内部类(成员内部类局部内部类(包括匿名内部类))

内部类包修饰符代码块

java-07 内部类匿名内部类局部内部类lambda

java基础15 内部类(成员内部类局部内部类)和匿名内部类

内部类之局部内部类

java 如何调用局部内部类和匿名类