【问题标题】:Java accesing properties with same name in both classesJava在两个类中访问具有相同名称的属性
【发布时间】:2023-01-11 19:45:15
【问题描述】:

我有 2 个类,A 和 B,B 继承自 A。 这两个类都有一个名为 w 的 int 类型的属性。

在 A 类中 w 是公共的,在 B 类中 w 是私有的。

我使用 B 构造函数创建了一个 A 类型的对象 - A a = new B()

然而,当我试图访问 B 的属性时,我发现我只能访问类 A 的变量或方法,即使我创建了一个 B 类型的对象。

我认为这只有在两个类没有相同的方法或变量时才有意义。 但在这种情况下,两个类都有一个名为 w 的变量,但我只能访问存储在 A 类中的值。为什么会这样?

A类


public class A {
    public int w;
    private static String str = "K";

    
    public A() {
        str+="B";
        w+=str.length();
        str+=w;
    }
    
    @Override
    public String toString() {
        return str.charAt(w-2)+"P";
    }
    

}

B类

public class B extends A {
    public static int w = 2;
    private String str = "W";
    
    public B(int x) {
        w+=super.w;
        str+=super.toString()+w;
    }
    
    @Override
    public String toString() {
        return super.toString() + str;
    }
}

测试类


public class Q1 {

    public static void main(String[] args) {
        A a = new A();
        A a2 = new B(1);

        System.out.println(a);
        System.out.println(a.w);
        System.out.println(a2);
        System.out.println(a2.w);
        B b = new B(2);
        System.out.println(b);
    }

}

【问题讨论】:

  • 帮助我们帮助您——与其描述问题,不如分享一个证明问题的minimal reproducible example
  • 当您在 A 的引用上调用方法时,比如 a.doSomething();,编译器将检查该方法是否存在于 A 中。分配的对象是否封装了该方法并不重要,检查是在编译时完成的,而转换是在运行时发生的。
  • 请删除代码的屏幕截图并显示实际代码。

标签: java oop inheritance upcasting


【解决方案1】:

当您进行类型转换时,这是继承的正常行为。你可以查看这个link

【讨论】:

    【解决方案2】:

    由于变量a的类型是[class]A,变量只能访问类A的成员和方法(取决于访问说明符)——即使变量a的实际类型是类@ 987654328@。

    参考类javax.swing.JComponent中的方法paintComponent。方法参数的类型是Graphics,但参数的实际类型是Graphics2D(扩展Graphics)。但是,为了访问Graphics2D 的方法,您必须首先转换参数,即

    Graphics2D g2d = (Graphics2D) g;
    

    这是面向对象范式的一个基本方面。
    另请参阅comment@ArunSudhakaran 提出的问题

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 2014-01-12
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多