如何使子类只能从实例访问?
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
【讨论】:
以上是关于如何使子类只能从实例访问?的主要内容,如果未能解决你的问题,请参考以下文章