如何使子类只能从实例访问?

Posted

技术标签:

【中文标题】如何使子类只能从实例访问?【英文标题】:How to make a subclass accessible from instance only? 【发布时间】:2020-10-03 19:27:47 【问题描述】:

我想创建一个只能从超类的实例访问的子类,而不是从超类本身访问的子类,以确保超类的变量已被初始化。 例如:

public class SuperClass 

     int num;
     
     SuperClass(int number)
         num = number;
     
     //Make this\/ accessible from instance only
     class SubClass
     
         SubClass()

         public int read()
             return num;
         
     

在另一个文件中:

public void err()
    SuperClass.SubClass obj = new SuperClass.SubClass(); //Error! Superclass is not an instance
    System.out.println(obj.read());

public void right()
    SuperClass sup = new SuperClass(3);
    SuperClass.SubClass obj = new sup.SubClass(); //Correct, sup is an instance
    System.out.println(obj.read()) //Print 3

【问题讨论】:

请注意,SubClass 并不是真正的子类,而是嵌套类 @JanezKuhar 是正确的。在您问题的代码中,Subclass不是SuperClass 的子类,它是nested class。也许您应该考虑更改问题的标题?当然,真正的问题是,你为什么认为你需要这样做? 【参考方案1】:

这是不可能的。非静态内部类必须通过外部类的实例进行实例化。请参阅this 链接了解更多信息。

【讨论】:

【参考方案2】:

内部类

与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,由于内部类与实例相关联,它本身不能定义任何静态成员。

作为内部类实例的对象存在于外部类的实例中。考虑以下类:

类外部类 ... 类内部类 ...

InnerClass 的实例只能存在于 OuterClass 的实例中,并且可以直接访问其封闭实例的方法和字段。 要实例化内部类,您必须先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:

OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 有两种特殊的内部类:本地类和匿名类。

check the link

【讨论】:

以上是关于如何使子类只能从实例访问?的主要内容,如果未能解决你的问题,请参考以下文章

Scala:如何使子类(在其他实例上)可以访问受保护的方法?

无法从基类指针访问子类方法

如何访问子类中的函数?

从子类访问父类的私有实例变量?

Java抽象类(二十一)

抽象类抽象方法