仅限父类成员到其直接子类

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)

  • **IllegalStateException:hahaha**不是说我会在制作中做这样的事情:D (4认同)

Ron*_*kar 5

将父类成员限制为其直接子类,为此,

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.

  • 这根本不是真的:在您的示例中让类 C 和 D 扩展 B(反过来,扩展 A)仍然能够访问类 A 中的受保护字段 - 即使它们位于另一个包中! (3认同)