java私有不能被访问_为什么Java不允许我通过同一个类的方法访问私有方法?

私有成员只能在他们声明的类中访问。所以如果你上课

class X{

private int field = 1;

private void method(){}

void foo(X x){

x.field = 2;

x.method(); // this is OK, because we are accessing members from instance of X

// via reference of class X (which is same class as this one)

}

void bar(Y y){// = lets assume that Y extends X

y.field = 3;

y.method(); // ERROR: we can't access `method()`

}

}

正如你所看到的,即使我们在声明此成员的类中,我们也不能访问派生类的私有成员。

可能的原因是私有成员不被继承到派生类的接口(这是私有可见性修饰符的整体目的)。因为在这样的类中,有可能以作者想要的方式重新声明这些成员,例如有人可以创建类似这样的类:

class Y extends X{

private String field = "foo";

private String method(){

return "bar";

}

}

所以如你所见,可以通过调用y.method()来尝试访问在Y类中声明的方法,但是您不能从X类访问它(由于封装)。这是场景编译器假设的,因为字段和私有方法不是多态的。

为了避免这种混乱,你需要明确地声明你想通过使用转换来调用当前类X中的私有成员

void bar(Y y){

((X)y).method();

}

< T extends A>发生同样的事情。由于T可以是A编译器的任何子类,所以不能访问其私有成员。所以你需要把它转回A

class A {

private T one() { return (T) this;}

protected T two() { return (T) this;}

protected void three() { ((A)two()).one(); }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值