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

Java中的内部函数:如何使用内部类和匿名类定义函数?

发布时间:2023-06-15 18:38:59

Java中内部函数指的是在一个类的内部定义的函数,可以使用内部类和匿名类来实现。内部函数相比于普通函数,可以访问外部类的私有变量和方法,也可以方便地调用外部类的方法。

内部类

内部类是一种定义在另一个类中的类,在Java中可以使用内部类来定义内部函数。内部类有四种类型:成员内部类、局部内部类、匿名内部类和静态内部类。

1. 成员内部类

成员内部类是定义在另一个类的内部的普通类。一个成员内部类可以访问外部类的所有成员变量和方法,即使是私有的。

定义成员内部类的语法如下:

public class OuterClass {
    //外部类成员变量
    private int data = 100;
    
    //成员内部类
    public class InnerClass {
        //内部类方法
        public void display() {
            System.out.println("Data = " + data);
        }
    }
    
    //主方法
    public static void main(String[] args) {
        //创建外部类对象
        OuterClass outer = new OuterClass();
        //通过外部类对象创建内部类对象
        InnerClass inner = outer.new InnerClass();
        //调用内部类方法
        inner.display();
    }
}

在这个例子中,InnerClass是一个成员内部类,可以直接访问外部类的私有变量data。在主方法中通过创建外部类对象outer,然后使用outer.new InnerClass()创建内部类对象inner,最后调用内部类方法display()。

2. 局部内部类

局部内部类是定义在一个方法或代码块中的类,局部内部类只在它所在的方法或代码块中有效,不能被外部类的其他方法访问。

定义局部内部类的语法如下:

public class OuterClass {
    //外部类方法
    public void display() {
        //局部内部类
        class InnerClass {
            //内部类方法
            public void print() {
                System.out.println("Hello World");
            }
        }
        //创建内部类对象
        InnerClass inner = new InnerClass();
        //调用内部类方法
        inner.print();
    }
    
    //主方法
    public static void main(String[] args) {
        //创建外部类对象
        OuterClass outer = new OuterClass();
        //调用外部类方法
        outer.display();
    }
}

在这个例子中,InnerClass是一个局部内部类,定义在display()方法中,只能在这个方法内部使用。在display()方法中通过创建内部类对象inner,然后调用内部类方法print()。

3. 匿名内部类

匿名内部类是没有名字的内部类,它在声明和定义同时完成,通常用来创建某个接口或抽象类的对象。

定义一个匿名内部类的语法如下:

public interface Greeting {
    public void sayHello();
}

public class OuterClass {
    //外部类方法
    public void display() {
        //匿名内部类
        Greeting greeting = new Greeting() {
            //实现接口方法
            public void sayHello() {
                System.out.println("Hello World");
            }
        };
        //调用接口方法
        greeting.sayHello();
    }
    
    //主方法
    public static void main(String[] args) {
        //创建外部类对象
        OuterClass outer = new OuterClass();
        //调用外部类方法
        outer.display();
    }
}

在这个例子中,Greeting是一个接口,定义了一个抽象方法sayHello()。然后在display()方法中使用了一个匿名内部类来实现Greeting接口的sayHello()方法,创建一个Greeting对象greeting,然后调用接口方法greeting.sayHello()。

4. 静态内部类

静态内部类是定义在一个类内部的静态类,它可以访问外部类的静态成员和方法,但不能访问外部类的非静态成员和方法。

定义静态内部类的语法如下:

public class OuterClass {
    //外部类静态变量
    private static int data = 100;
    
    //静态内部类
    public static class InnerClass {
        //静态内部类方法
        public static void display() {
            System.out.println("Data = " + data);
        }
    }
    
    //主方法
    public static void main(String[] args) {
        //调用静态内部类方法
        InnerClass.display();
    }
}

在这个例子中,InnerClass是一个静态内部类,定义在OuterClass中,并且是静态的。在主方法中可以通过OuterClass.InnerClass.display()来调用静态内部类的方法。

匿名类

匿名类是一种没有名字的类,可以在声明和定义同时完成。在Java中,使用匿名类可以轻松地实现接口、抽象类和父类的方法。

1. 实现接口

实现一个接口并创建接口对象的语法如下:

public interface Greeting {
    public void sayHello();
}

public class OuterClass {
    //外部类方法
    public void display() {
        //匿名类实现接口
        Greeting greeting = new Greeting() {
            //实现接口方法
            public void sayHello() {
                System.out.println("Hello World");
            }
        };
        //调用接口方法
        greeting.sayHello();
    }
    
    //主方法
    public static void main(String[] args) {
        //创建外部类对象
        OuterClass outer = new OuterClass();
        //调用外部类方法
        outer.display();
    }
}

2. 继承父类

继承一个父类并创建父类对象的语法如下:

public class Person {
    //父类方法
    public void display() {
        System.out.println("I am a person");
    }
}

public class OuterClass {
    //外部类方法
    public void display() {
        //匿名类继承父类
        Person person = new Person() {
            //重写父类方法
            public void display() {
                System.out.println("I am a boy");
            }
        };
        //调用父类方法
        person.display();
    }
    
    //主方法
    public static void main(String[] args) {
        //创建外部类对象
        OuterClass outer = new OuterClass();
        //调用外部类方法
        outer.display();
    }
}

3. 实现抽象类

实现一个抽象类并创建抽象类对象的语法如下:

public abstract class Shape {
    //抽象方法
    public abstract void draw();
}

public class OuterClass {
    //外部类方法
    public void display() {
        //匿名类实现抽象类
        Shape shape = new Shape() {
            //实现抽象方法
            public void draw() {
                System.out.println("Draw a circle");
            }
        };
        //调用抽象方法
        shape.draw();
    }
    
    //主方法
    public static void main(String[] args) {
        //创建外部类对象
        OuterClass outer = new OuterClass();
        //调用外部类方法
        outer.display();
    }
}

匿名类的缺点是,由于它没有名字,所以不能再其他地方使用它的实例。如果需要在多个地方使用相同类型的匿名类,就需要创建多个相同的匿名类实例。