当我创建一个带有父对象引用的子对象时,比如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 ?
}
在这里,当您编写Parent p=new Child()
时,子类的对象将使用父类和子类的属性创建,但用于保存该对象的引用变量是父类的,或者您可以说是父类的。
当我们想访问任何类的实例方法或变量时,引用变量应该只属于该类或其子类。
所以我们不能用父类的引用变量访问子类的变量。只有父类中存在的变量才能通过父类的引用变量访问,使用该引用变量保存父类对象或子类对象并不重要。
所以从p引用变量访问代码中“a”实例变量的唯一方法是将p类型转换为子类型,然后它可以访问子类的变量。
`
Parent p = new Child();
System.out.println(((Child)p).a);
`
它不起作用的原因是父类无权访问其子类的属性。您可能正在创建一个子类
类,但将其分配给一个父类
对象。由于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 ?
}
可以通过将引用类型转换为子类型来实现。
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中的内部逻辑等。 下面的代码会让你清楚地理解我的问题。