当前位置: 首页 > 知识库问答 >
问题:

在java中从父类型引用访问子属性

微生恩
2023-03-14

当我创建一个带有父对象引用的子对象时,比如parent p=new child() 那么基本上它是一个具有父引用的子对象,并且具有父对象和子对象的属性。如果它是具有父类型引用的子对象,那么为什么我不能使用它访问子属性。我正在尝试做以下事情:

class Parent {

}

class Child extends Parent {
 int a = 20;
 public static void main(String[] args) {
  Parent p = new Child();
  System.out.println(p.a); //gives compile time error
  // question is , p is parent type reference variable , but it is pointing to object of child
  // class, then we should be able to access child properties from it, but we cant, why ?
 }

共有3个答案

刘和正
2023-03-14

在这里,当您编写Parent p=new Child()时,子类的对象将使用父类和子类的属性创建,但用于保存该对象的引用变量是父类的,或者您可以说是父类的。

当我们想访问任何类的实例方法或变量时,引用变量应该只属于该类或其子类。

所以我们不能用父类的引用变量访问子类的变量。只有父类中存在的变量才能通过父类的引用变量访问,使用该引用变量保存父类对象或子类对象并不重要。

所以从p引用变量访问代码中“a”实例变量的唯一方法是将p类型转换为子类型,然后它可以访问子类的变量。

`
Parent p = new Child();
  System.out.println(((Child)p).a);

`

计寒
2023-03-14

它不起作用的原因是父类无权访问其子类的属性。您可能正在创建一个子类类,但将其分配给一个父类对象。由于Child继承自Parent,因此您可以将Child强制转换为Parent

你基本上在做:

 Parent p = (Parent) new Child();

换句话说,您正在创建一个父对象。类中没有一个属性。

你可以做到:

class Parent{
    int a = 20;
}

class Child extends Parent{

public static void main(String[] args){
     Child c = new Child();
     System.out.println(c.a); //gives compile time error
     // question is , p is parent type reference variable , but it is pointing to object of child
     // class, then we should be able to access child properties from it, but we cant, why ?
}
慕容成文
2023-03-14

可以通过将引用类型转换为子类型来实现。

class Parent {
}

class Child extends Parent {
    int a = 20;
    public static void main(String[] args) {
        Parent p = new Child();
        System.out.println(((Child)p).a);
    }
}

如果p不是子类型的对象,它将抛出ClassCastException。因此,最好通过instanceof操作符检查p是否是Child的对象

    if (p instancof Child) {
        System.out.println(((Child)p).a);
    }
 类似资料:
  • 怎么可以让这个 self.logger 属于子类(不是直接添加到子类属性这种方式),并且可以运行

  • 嗨,我是Java泛型的新手,我正在尝试访问泛型类中的属性。到目前为止,我已经找到了C#相关的答案,如果有人能指导我如何在java中做到这一点,那将是非常有帮助的。假设我有Class Car,它有整数型轮子和字符串型模型的属性。现在我有一个方法,比如

  • 问题内容: 这不是一件很难的事,但我无法弄清楚如何做到最好。 我有一个父指令,像这样: 和一个子指令: 如何从子指令轻松访问父指令的和属性?在我的链接函数中,我可以访问父级作用域-我应该用来观察这些属性吗? 放在一起,我想拥有的是: 这个想法是默认情况下显示一组字段。如果单击,它们将成为输入并可进行编辑。 问题答案: 从这篇SO帖子中汲取灵感,我在这个笨拙的人中有一个可行的解决方案。 我不得不改变

  • 我有以下情况: 在执行代码时,输出为:5。 如何通过父类方法访问子类(B)变量(x)? 这是否可以在不重写print()方法的情况下完成(即在B中取消注释)? [这很重要,因为在重写时,我们将不得不再次重写print()方法的整个代码] 编辑过 进一步澄清:- 问题的动机是使用父类方法中的子类私有变量的值。这不需要更改父类私有变量的值来获得所需的结果 (感谢大家的时间和帮助)

  • 问题内容: 如何从儿童的基类访问装饰器? 我以为(错误地)认为ffg。会工作: 该类工作正常,但随后我创建了一个继承自此的子类: 这甚至无法正确导入,更不用说运行了。@_deco未定义。尝试baseclass._deco会引发未绑定的方法_deco()错误,这并不奇怪。 任何想法如何做到这一点,我真的很想将装饰器封装在该类中,但是我对此想法并不满意,需要在基类和子类中对其进行调用。 问题答案:

  • 既然这个对象(在标题中说明)可以调用子类中的重写方法,为什么它不能调用子类的其他方法?我需要尽可能详细的回答,比如内存组织,JVM中的内部逻辑等。 下面的代码会让你清楚地理解我的问题。