与类访问修饰符相比,使用的限制较少的成员访问修饰符有什么用?

问题描述 投票:1回答:1

说我有一个带有一些成员的类,并且这些成员的访问修饰符比类本身的限制少。

一个具体的例子可能是:

package apples;

class A { // package private
    public int foo() { // public (=> less restrictive than *package private*)
        return 42;
    }
}

据我所知,对[[class访问修饰符的限制要比对[[member访问修饰符的限制更大,它将覆盖较少限制的member访问修饰符。因此,限制较少的member访问修饰符应该完全无效。

  • 我的理解正确吗?
    • 如果没有,后果是什么?
  • 限制成员访问修饰符较少的合理原因是什么?
  • 最后,有什么要遵循的[[最佳实践?

我也做了一些实验,因为我认为一旦开始传递函数引用,它可能会产生后果,但是即使那样,访问修饰符似乎也没有关系。

我构造的情况如下:

    [apples.B提供了一个公共方法bla(),该方法返回对apples.A.foo的引用。
  • 然后pizzas.C调用apples.B.bla以获得对A.foo的引用并调用它。
  • 因此A.foo()C不直接可见,但只能通过B.bla()间接访问
  • 我测试了它,是否使foo()

    package private]的访问修饰符没有区别。

  • package apples; import java.util.function.IntSupplier; public class B { public IntSupplier getReferenceToAFoo() { A aInstance = new A(); return aInstance::foo; } }
    package pizzas;
    
    import apples.B;
    
    import java.util.function.IntSupplier;
    
    public class C {
        private int callAFooIndirectly() {
            B bInstance = new B();
            IntSupplier intsupplier = bInstance.getReferenceToAFoo();
            return intsupplier.getAsInt();
        }
    
        public static void main(String[] args) {
            C cInstance = new C();
    
            int i = cInstance.callAFooIndirectly();
            System.out.println(i);
            assert 42 == i;
        }
    }
    
    
    说我有一个带有一些成员的类,并且这些成员的访问修饰符比类本身的限制少。一个具体的例子可能是:包装苹果; class A {//封装为私有...
    java oop access-modifiers
    1个回答
    1
    投票
    我的理解正确吗?
    © www.soinside.com 2019 - 2024. All rights reserved.