【问题标题】:Private method of call from Child Object从子对象调用的私有方法
【发布时间】:2015-09-16 18:13:44
【问题描述】:
class Parent {
    public Parent() {
        System.out.println("Parent Default..");
        System.out.println("Object type : " + this.getClass().getName());
        this.method();
    }

    private void method() {
        System.out.println("private method");
    }
}

class Child extends Parent {
    public Child() {
        System.out.println("Child Default..");
    }

    public static void main(String[] args) {
        new Child();
    }
}

当我运行此代码时,它会打印“this”的类名 = Child 但是“this”对象为什么能够调用父类的私有方法呢?

【问题讨论】:

  • 你需要在父类中删除'this',因为当你调用继承时,this指向子类引用,所以它不会调用那个。
  • 因为它是 parent 的私有方法 if this = parent 那么它调用它自己的方法
  • 默认构造函数由编译器从子类自动提供
  • 私有方法正在调用,因为您在 Parent 构造函数中调用该方法。
  • @DanialHussain 删除 this 不会改变任何事情。

标签: java inheritance private private-methods


【解决方案1】:

这里没有创建父实例,您可以使用 jdk 安装的 /bin 文件夹中的jvisualjvm 确认这一点,子实例也没有创建。仍然调用父构造函数。

输出:

Parent Default..
Object type : com.packagename.Child
private method
Child Default..

子类可以调用父构造函数。 而在 parent 的构造函数中,正如 Krishanthy Mohanachandran 上面提到的,可以合法地调用私有方法。

【讨论】:

    【解决方案2】:

    当你扩展类时,私有方法不会被继承。但是子类的对象包含父类的对象,所以当调用超类构造函数时。你可以在超类内部调用超类的私有方法

    【讨论】:

      【解决方案3】:

      很明显,你可以在类内调用任何私有成员,但不能在类外调用。

      在这种情况下是合法的。在这个程序中,首先会调用 Parent 的构造函数,您可以在类中调用私有方法。

      【讨论】:

      • 但首先看看我调用该方法的对象类型。
      • 什么意思?您正在使用父类对象来调用它的方法。
      • 如果你运行代码然后你会看到“this”对象打印出子对象的类名。
      【解决方案4】:

      首先,在调用new Child()时,由于Child类中没有声明的无参构造函数,它会简单地调用super(),它正在调用Parent构造函数。

      然后,当执行this.getClass().getName() 时,这里的this 代表Child 实例,这就是为什么你会得到“Child”的结果。请记住,Object#getClass() 返回对象所属的最具体的类。更多来自here

      关于为什么this.method() 有效。首先,因为Child 扩展了Parent,所以Child 实例也是Parent 实例。 java 作用域修饰符控制可以访问方法或字段的位置。以Parent#method()为例,private修饰符表示该方法只能在Parent类内部访问(调用)。这正是您编码的方式。它调用Parent 类的构造函数中的方法,该方法编译规则。从here查看更多关于java访问控制的信息

      【讨论】:

      • “这里这代表一个子实例” 如果您运行 Harshit Gupta 的代码,则不会为子实例或父实例创建实例。我确信像 Child 这样的“东西”存在于内存(堆)中的某处,但不存在于实例中……查看 jvisualjvm 以验证这一点。如果您执行 Child ch = new Child() 之类的操作,那么您肯定可以看到正在创建 instance,但我们知道,这又不是用于 Super 类。
      【解决方案5】:

      private 与对象的实际类无关。同一顶级类中的任何代码都可以访问private 成员。 (顶级类是不嵌套的,与继承无关)

      method定义在Parent中,调用this.method()也在Parent中,所以是允许的。

      【讨论】:

        猜你喜欢
        • 2015-09-14
        • 2020-09-17
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-09
        相关资源
        最近更新 更多