use*_*621 13 java inheritance access-modifiers restriction
假设我在java中有四个具有给定层次结构的类.
class A {}
class B extends A {}
class C extends B {}
class D extends C {}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,A类的所有可访问字段将通过继承可用于其所有子类.现在,如果我希望A类的几个字段只能用于B类.
在java中有什么办法可以限制父类的某些字段到它的直接子类吗?
alf*_*sin 10
不是说我会在制作中做这样的事情,但是你走了:
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 {}
Run Code Online (Sandbox Code Playgroud)
所以基本上你可以使用这个技巧只允许你想要的类(使用黑名单或白名单方法)来调用getA().
OUTPUT:
1
1
Exception in thread "main" java.lang.IllegalStateException: hahaha
...
Run Code Online (Sandbox Code Playgroud)
将父类成员限制为其直接子类,为此,
Java提供了protected访问修饰符,您可以在其中访问类成员:
1) 课堂内
2) 包装内和
3) 包外仅按Subclass。
如果你想将数据成员限制为直接子类,那么你可以做的是:
声明一类如下:
package com.firstpackage;
Class A{
protected int a;
}
Run Code Online (Sandbox Code Playgroud)
现在在另一个包中使用子类,如下所示:
package com.secondpackage;
Class B extends A{
//Access data members of class A
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您声明Class C and Dinpackage com.secondpackage;和extendsfrom Class B,那么这两个类 ( Class C and D) 就不是 的直接子类Class A,当然也不在Class A实现的同一个包中。所以A类的数据成员在Class C and D.
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |