Java四大内部类代码示例

Posted 流楚丶格念

tags:

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

四大内部类

成员内部类

就是普通的内部类,放在类里声明

例如:

package com.yyl.statictest;

public class PubClassTest 

    private String outer;
    public String pouter;
    private static String visit="visit";

    class PubInnerClass
        private String name;
        private int age;

        public PubInnerClass(String name, int age) 
            this.name = name;
            this.age = age;
        
    


当内部类访问外部类时,可以不受访问控制符的影响,直接访问属性与方法

public void visitOuter()
    System.out.println(PubClassTest.visit);
    System.out.println(outer);
    System.out.println(pouter);
    System.out.println(PubClassTest.this.outer);

当外部类变量与方法和内部类同名,内部类默认访问自己的成员变量或方法,引用外部变量使用时加类名.this类名.this.变量名类名.this.方法名(),例如:

public void visitOuterSame()
    System.out.println(PubClassTest.this.pouter);
    System.out.println(this.pouter);

在其他类创建一类中的内部类:内部类 对象名 = new 外部类对象( ).new 内部类( ),例如:

PubClassTest.PubInnerClass pubInnerClass = new PubClassTest().new PubInnerClass("22",22);

外部类不能直接使用内部类的成员和方法,如下报错,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。

静态内部类

在成员内部类前加一个static修饰就是静态内部类

例如:

public class StaticTest 
    private String outer;
    private static String visit="visit";

    static class StaticInnerClass
        private String name;
        private int age;

        public StaticInnerClass(String name, int age) 
            this.name = name;
            this.age = age;
        
    

静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问,例如

public void visitPubMem()
    System.out.println(new StaticTest().outer);

外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员,例如

public void visitOuter()
    System.out.println(StaticTest.visit);

创建静态内部类的对象时,不需要通过外部类的对象,可以直接创建 内部类 对象名= new 内部类();,例如

StaticTest.StaticInnerClass staticInnerClass = new StaticTest.StaticInnerClass("yyl",12);

局部内部类

定义在外部类方法中,作用范围和创建对象范围仅限于当前方法。限制类的使用范围,只能在当前方法中使用。

例如:

package com.yyl.statictest;

public class LocalClassTest 
    private String outer="outer";
    private static String visit="visit";

    public void test()
        String str = "string";

        class LocalInnerClass
            private String name="localinnerclass";
            private int age;

            public void show()
                System.out.println(str);
                System.out.println(visit);
                System.out.println(LocalClassTest.this.outer);
                System.out.println(name);
            
        

        LocalInnerClass localInnerClass = new LocalInnerClass();
        localInnerClass.show();
    


    public static void main(String[] args) 
        LocalClassTest localClassTest = new LocalClassTest();
        localClassTest.test();
    


运行结果如下:

局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final。不能在方法内部类中创建可变的局部变量,jdk1.8自动添加final

没有访问修饰符,但可以使用final或abstract修饰

可以访问外围类的成员变量。类名.this.变量名,例如:

System.out.println(LocalClassTest.this.outer);

局部内部类内不能有静态声明,即不能使用关键字static,如下

在外部类方法中创建局部内部类对象才能调用局部内部类中方法

LocalInnerClass localInnerClass = new LocalInnerClass();
localInnerClass.show();

匿名内部类

使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

接口:

package com.yyl.statictest;

public interface AnonymousInterface 
    public void show();

匿名内部类实现:

package com.yyl.statictest;

public class AnonymousClassTest 
    public static void main(String[] args) 
        // 直接声明匿名类对象
        AnonymousInterface anonymousClassTest = new AnonymousInterface() 
            public int age;

            @Override
            public void show() 
                System.out.println("AnonymousClassTest。。。。。。");
            
        ;
        anonymousClassTest.show();

        // 方法里传入匿名内部类
        test(new AnonymousInterface()
            @Override
            public void show() 
                System.out.println("test里的AnonymousInterface");
            
        );
    

    public static void test(AnonymousInterface anonymousInterface)
        anonymousInterface.show();
    

匿名内部类中是不能定义构造函数的。

匿名内部类中不能存在任何的静态成员变量和静态方法。

匿名内部类为局部内部类(即方法内部类),所以局部内部类的所有限制同样对匿名内部类生效。

匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。

当所在的方法的形参需要被内部类里面使用时,该形参必须为final。

可以写代码块,初始化匿名内部类

匿名内部类可以很方便的定义回调。

使用内部类可以非常方便的编写事件驱动程序。

内部类的优点

  1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类
  2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据
  3. 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便

以上是关于Java四大内部类代码示例的主要内容,如果未能解决你的问题,请参考以下文章

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

Java面向对象(OOP)--内部类(局部内部类)

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

java学习之内部类包与代码块

java内部类之成员内部类之局部内部类

java内部类