其它类中调用static的内部类时出错

我需要在其它类中调用内部类,为什么当内部类没有static时可以通过外部类的 实例.new 内部类();得到内部类对象,但是当将内部类设为static时这句就出错了呢?

正确示例

img


错误示例

img

静态内部类 不需要 new 来实例化,直接 类引用 或 类对象来引用

创建静态内部类对象,可以使用这种语法格式来创建:

外部类名.静态内部类名 变量名 = new 外部类名.静态内部类名(); (引用自参考链接)

测试代码如下:

参考链接:


静态内部类指的是什么?如何使用? - 知乎 所谓静态内部类,就是使用static关键字修饰的成员内部类。与成员内部类相比,在形式上,静态内部类只是在内部类前增加了static关键字,但在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态… https://zhuanlan.zhihu.com/p/604272550



package testinner;

public class TestInner {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
            // https://blog.csdn.net/legendaryhaha/article/details/83066691
            // https://zhuanlan.zhihu.com/p/604272550
           // 创建静态内部类使用这种语法格式:外部类名.静态内部类名  变量名 = new 外部类名.静态内部类名()
            Outer.Inner inner01 = new Outer.Inner();
            inner01.sayHello();
    }

}

class Outer{
    
    static class Inner{
        
        void sayHello() {
            System.out.println("Hello!");
        }
    }
    
}

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7541473
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:普通局部变量与static局部变量的区别
  • 除此之外, 这篇博客: 为什么使用static的类方法不需要new中的 static静态成员 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    在Java中,静态内部类和非静态内部类之间存在一些区别,这导致了在调用方式上的差异。

    静态内部类的特点: 1. 静态内部类是独立于外部类的存在,即使没有外部类的对象,也可以直接访问静态内部类。 2. 静态内部类的对象不会自动持有外部类的引用。 3. 静态内部类可以直接通过外部类.内部类的方式来创建对象。

    非静态内部类的特点: 1. 非静态内部类是依赖于外部类存在的,不能独立存在。 2. 非静态内部类的对象会自动持有外部类的引用。 3. 非静态内部类只能通过外部类的对象来创建对象,即外部类对象.new 内部类()

    基于以上的特点,我们可以得出以下解释:

    当内部类没有static修饰时,它是依赖于外部类的存在的,需要通过外部类的对象来访问和创建。因此,我们需要先创建外部类的对象,然后再通过此对象来创建内部类的对象。

    对于静态内部类,它是独立于外部类的存在,可以直接通过外部类.内部类的方式来创建对象。所以,在调用静态内部类时,应该使用外部类.内部类的语法来创建对象,而不能通过创建外部类对象的方式来调用静态内部类。

    所以,在你的错误示例中,外部类.内部类 内部对象 = new 外部类.内部类(); 这段代码会出错,因为静态内部类不依赖于外部类的对象,无法通过创建外部类对象的方式来调用静态内部类。

    正确的示例中的代码 外部类.内部类 内部对象 = 外部对象.new 内部类(); 能够成功运行,因为这是创建非静态内部类对象的正确方式,在实例化内部类对象之前,我们需要先创建外部类的对象。

    总结一下: - 如果内部类是非静态的,可以通过实例化外部类对象来获得内部类对象。 - 如果内部类是静态的,则应该使用外部类.内部类的方式来创建内部类对象。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^