【JavaSE基础】内部类?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Soldier49Zed/article/details/102733887

内部类都有哪些?

四种:静态内部类、非静态内部类、局部内部类、匿名内部类。

静态内部类和非静态内部类的区别

直接代码演示

class OuterClass{
    private static String msg = "GeeksForGeeks";

    //静态内部类
    public static class NestedStaticClass{
        //静态内部类只能访问外部类的静态成员和静态方法
        public void printMessage(){
            //试着将msg改成非静态的,这将导致编译错误
            System.out.println("来自静态内部类的消息: " + msg);
        }
    }

    //非静态内部类
    public class InnerClass{
        public void display(){
            System.out.println("来自非静态内部类的消息: " + msg);
        }
    }
}

public class Demo {
    //怎么创建静态内部类和非静态内部类的实例
    public static void main(String[] args) {
        //创建静态内部类的实例(注意前面还是要加外部类的名字)
        OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();

        //调用静态内部类的非静态方法
        printer.printMessage();

        //结合以上步骤,一步创建的内部类实例
        OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();
        //现在可以调用内部类方法
        innerObject.display();
    }
}

静态内部类和非静态内部类主要的不同:

1)静态内部类不依赖于外部类实例而被实例化,而非静态内部类需要在外部类实例化后才可以被实例化。

2)静态内部类不需要持有外部类的引用。但非静态内部类需要持有对外部类的引用。

3)静态内部类不能访问外部类的非静态成员和静态方法。它只能访问外部类的静态成员和静态方法。非静态内部类能够访问外部类的静态和非静态的成员和方法。

局部内部类

在外部类的方法中定义的类。其作用的范围是在所在的方法内。它不能被public、private、protected来修饰。它只能访问方法中定义为final类型的局部变量。

class outerClass{
    public void f(){
        class innerClass{ //局部内部类    
        }
    }
}

匿名内部类

interface Person{
    public abstract void eat();
}

public class Demo2 {
    public static void main(String[] args) {
        Person p = new Person() {
            @Override
            public void eat() {
                System.out.println("Eat Something");
            }
        };
        p.eat();
    }
}

是一种没有类名的内部类。

需要注意的是:

扫描二维码关注公众号,回复: 7601043 查看本文章
  1. 匿名内部类一定是在new的后面,这个匿名内部类必须继承一个父类或者实现一个接口。
  2. 匿名内部类不能有构造函数。
  3. 只能创建匿名内部类的一个实例
  4. 在Java8之前,如果匿名内部类需要访问外部类的局部变量,则必须使用final来修饰外部类 局部变量。在现在的Java8已经取消了这个限制。

猜你喜欢

转载自blog.csdn.net/Soldier49Zed/article/details/102733887