【问题标题】:Understanding scope of private method [duplicate]了解私有方法的范围[重复]
【发布时间】:2015-12-14 16:00:29
【问题描述】:

我的一个朋友问我这个问题。为什么下面的代码在调用 aa.x() 时没有出错?
我知道 aa 是对 B 类对象的引用,但是在 A 类的方法中调用 A 类的私有方法,它是可见的,因此可以访问。

我的理解正确吗?或者这背后还有什么其他原因?

public class A {
    public void xyz() {
        System.out.println("A");
    }
    private void x() {
        System.out.println("A:x");
    }
    public static void main(String[] args) {
        B b = new B();
        A aa = b;
        aa.x();
        aa.xyz();
        B bb = (B) aa;
        bb.xyz();
        bb.xyz12();
    }
}
class B extends A {
    public void xyz() {
        System.out.println("B");
    }
    public void xyz12() {
        System.out.println("B-12");
    }
}

【问题讨论】:

  • 这么多重复,这么少时间... 编辑: 呃,好吧,也许不是子类的皱纹。
  • 如果您希望它理解,请在此处阅读访问修饰符docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html。 private 访问修饰符用于 Class 并且 main 在此类中,因此调用该方法没有问题
  • 这里最好写A aa = new A()而不是A aa = b。由于A aa = b 是合法的并且aa.x()A#main() 中是合法的,所以一切正常。
  • 你的理解是正确的。如果它是一个公共方法,它将被 B 类继承,并且在运行时 B 类的方法将被执行。如果方法不是继承的并且只存在于 B 中,那么编译器会抛出错误。

标签: java


【解决方案1】:

我不能立即使用子类找到重复项,但基本上它与this question 的答案相同。

有两件事可以控制对x 的访问:

  1. 执行访问的代码在哪里。因为xA 私有的,所以访问它的代码必须是A 中方法的一部分。它不能在子类 (B) 或不相关的类中。

  2. 您使用的是哪种参考。如果您有A 参考,您可以访问x。如果您有 B 引用,则不能,即使您的代码是 A 方法的一部分。您可以将其转换为A,然后访问x,但您不能直接使用B 类型的引用来执行此操作。

【讨论】:

  • 这不是关于代码的位置,而是更多关于aa的编译时间类型。您将无法在 A 内执行 b.x()。运行时类型无关紧要。范围和可访问性都与编译时间有关。
  • @SotiriosDelimanolis: 也是,但如果你有一个A 引用a,你不能在非A 代码中使用a.x() ,或者,
  • 当然,但我不认为这是他们的要求。
  • @SotiriosDelimanolis: "...在 A 类的方法中调用 A 类的私有方法,该方法可见且因此可访问..." 代码在哪里正在运行的似乎很适合我。
  • 这个问题可以简化,因为这里有B 是无关紧要的(因为它扩展了A,因此是一个A)。这与您引用的问题完全相同。
【解决方案2】:

它之所以可见,是因为调用它的main方法包含在A类中。将它移到B类中,它就不起作用了

【讨论】:

    【解决方案3】:

    由于私有方法不被继承,超类引用调用它自己的私有方法。

    你的main方法是A的方法,所以可以调用x()私有方法。

    private 修饰符——该字段只能在其自己的类中访问。

    【讨论】:

      猜你喜欢
      • 2011-09-10
      • 2013-04-11
      • 2014-08-26
      • 2013-01-20
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      • 2016-04-23
      • 2013-06-05
      相关资源
      最近更新 更多