欢迎访问宙启技术站
智能推送

Java函数的内部类与匿名类方法

发布时间:2023-07-06 00:37:41

Java中的内部类是指在一个类的内部定义的类。内部类可以访问外部类的成员,包括私有成员,并且可以实现更加灵活的功能。Java中的内部类有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。

成员内部类是定义在外部类的成员位置上的类,它可以访问外部类的成员变量和方法。成员内部类可以拥有自己的成员变量和方法,并且可以实现接口。成员内部类的定义方式如下:

public class Outer {
    private int outerField;
    
    public class Inner {
        private int innerField;
        
        public void doSomething() {
            System.out.println(outerField);
            System.out.println(innerField);
        }
    }
}

在外部类中创建内部类的实例时,需要通过外部类的实例来创建。例如:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();

局部内部类是定义在代码块内的类,它只能在代码块内部访问。局部内部类也可以访问外部类的成员变量和方法。局部内部类的定义方式如下:

public class Outer {
    private int outerField;
    
    public void doSomething() {
        int localVar = 10;
        
        class LocalInner {
            private int innerField;
            
            public void doSomethingElse() {
                System.out.println(outerField);
                System.out.println(localVar);
                System.out.println(innerField);
            }
        }
        
        LocalInner inner = new LocalInner();
        inner.doSomethingElse();
    }
}

在外部类的方法中创建局部内部类的实例时,可以直接创建。局部内部类只能在外部类的方法中访问,且只能访问 final 类型的局部变量,这是因为局部内部类的生命周期可能比它所在的方法要长。

匿名内部类是没有名字的内部类,它是在创建对象时定义并实现的。匿名内部类可以继承一个类或实现一个接口。匿名内部类的定义方式如下:

public class Outer {
    public void doSomething() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello, world!");
            }
        };
        
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

在创建匿名内部类时,直接在创建对象的地方实现它,并且可以在其中重写方法、定义新的方法或变量。匿名内部类只能访问 final 类型的局部变量。

静态内部类是定义在外部类内部的静态类,它可以是私有的。静态内部类只能访问外部类的静态成员和方法,不可以访问外部类的非静态成员和方法。静态内部类的定义方式如下:

public class Outer {
    private static int outerStaticField;
    
    public static class StaticInner {
        private int innerField;
        
        public void doSomething() {
            System.out.println(outerStaticField);
            System.out.println(innerField);
        }
    }
}

在外部类中创建静态内部类的实例时,不需要通过外部类的实例来创建。例如:

Outer.StaticInner inner = new Outer.StaticInner();

总结来说,Java的内部类和匿名类为我们提供了一种实现更加灵活的功能的方式。通过内部类,我们可以访问外部类的成员,提高了类的封装性;通过匿名类,我们可以在创建对象时定义并实现它,简化了代码的编写。这些特性使得我们可以更加方便地实现一些复杂的功能和设计更加灵活的程序。