假设我在java中有四个具有给定层次结构的类。
class A {}
class B extends A {}
class C extends B {}
class D extends C {}
根据我的理解,A类的所有可访问字段都可以通过继承用于其所有子类。现在,如果我希望A类的几个字段只能用于B类,那该怎么办呢。
在java中有什么办法可以限制父类的某些字段到它的直接子类吗?
答案 0 :(得分:9)
不是说我会在制作中做这样的事情,但是你去了:
class A {
private int a = 1;
public int getA() {
if (getClass().equals(A.class) ||
getClass().getSuperclass().equals(A.class)) {
return a;
} else {
throw new UnsupportedOperationException("hahaha");
}
}
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
System.out.println(a.getA());
System.out.println(b.getA());
System.out.println(c.getA());
}
}
class B extends A {}
class C extends B {}
所以基本上你可以使用这个技巧只允许你想要的类(使用黑名单或白名单方法) - 来调用getA()
。
<强>输出:强>
1
1
Exception in thread "main" java.lang.IllegalStateException: hahaha
...
答案 1 :(得分:4)
仅将父类成员限制为其直接子类,为此,
Java提供protected
访问修饰符,您可以在其中访问类成员:
1)课堂内
2)在包内
3)仅在子类外包。
如果要将数据成员限制为直接子类,那么您可以做的是:
声明一个类如下:
package com.firstpackage;
Class A{
protected int a;
}
现在在另一个包中使用子类:
package com.secondpackage;
Class B extends A{
//Access data members of class A
}
现在,如果您在Class C and D
中声明package com.secondpackage;
,从extends
声明Class B
,那么这两个类(Class C and D
)就不是Class A
当然不在Class A
实施的同一个包中。因此,Class C and D
无法访问A类数据成员。
答案 2 :(得分:3)
这不是正确的课程设计,但如果你真的想这样做,你可以管理这种情况。
同样,您希望将父类成员限制为直接子类以外的其他成员,您可以使用protected
访问修饰符并将其他类放在另一个package
中。
根据你的例子,
Class A
和Class B
将位于同一个包中,Class C,D
将是另一个包。您可以为Class A
的成员使用受保护的访问修饰符。
答案 3 :(得分:0)
您可以将所有属性设置为私有,并使用getter访问它们。 然后,您可以控制可见性并覆盖它。
有3个班级的例子:
class A{
private String test = "Test123";
protected String getTest(){return test;};
}
class B extends A{
@Override
protected String getTest(){return "no";};
}
class C extends B{
}
这里A类只与B共享测试属性。
B可以使用super.getTest()
访问A属性
C无法访问测试。
比检查班级类型更简洁。
答案 4 :(得分:0)
通过OOPS概念: 在继承概念中,类的设计行为对于一个类不能与其他类不同。
要停止将字段继承给子类,请将这些字段设为密闭(即私有)。而且,如果您要求仅直属孩子可以访问这些字段,请将该字段标记为受保护。
如果您需要访问直到最后一个叶子节点子类(在这种情况下,直到D类)的字段,然后将这些字段标记为public。
或者在将类设计为组件时,可以通过类级别的OOPS访问修饰符来限制一个类从另一组件继承。