johnzsj 发表于 2022-1-7 22:50:38

java中关于访问父类的父类的同名属性问题

class A{
        public int a;
        public A(){
                a = 100;
        }
}

class B extends A{
        public int a;
        public A(){
                a = 90;
        }
}

class C extends B{
        public void m{
                //如何用访问父类的父类中的同名成员变量a
        }
               
}

class Test{
        public static void main(String[] args){
                C c1 = new C();
                c1.m();
        }
       
}

我记得我好像看过一个视频,好像是用 super.XXX.XXX.a 解决的,我知道的方法有在类B中设置方法使之能访问到A;还有就是使用((A)this).a;用super的我想不太出来,想请教一下各位

小伤口 发表于 2022-1-8 00:04:57

本帖最后由 小伤口 于 2022-1-8 00:15 编辑

1你的代码本身就有错误
   class B extends A{
      public int a;
      public A(){
                a = 90;
      }
}
这是B类应该写B的构造方法而不是父类

2你的m方法少()号

public void m{
                //如何用访问父类的父类中的同名成员变量a
      }

如果用super访问,首先明白java不支持多继承只有单继承,但是可以用你类似上述的代码实现间接的多继承。但是间接就有间接的局限性
你的B类继承A类,C类继承B类,因为你的B类a变量覆盖了A类的a变量,所以你的C类只继承了B类覆盖过后的a变量,而super本身的作用就是访问父类的属性和变量
你覆盖掉了父类的父类的变量所以是无法用super直接访问父类的父类
至于你说的
我记得我好像看过一个视频,好像是用 super.XXX.XXX.a 解决的
我想是因为视频的代码是没有将父类的父类变量覆盖掉,所以可以直接用super.
或者是类似像我下面的方法,所以是super.xxx

我这里给出了一个间接用super访问的方法,将就着看吧
package com.xiaoshangkou;
class A{
    public int a;
    public A(){
      a = 100;
    }
}

class B extends A{
    public int a;
    public int test1(){
      return super.a;
    }
    public B(){
      a = 90;

    }
}

class C extends B{
    public void m(){
      //如何用访问父类的父类中的同名成员变量a
      System.out.println(super.test1());
    }
}

class Test{
    public static void main(String[] args){
      C c1 = new C();
      c1.m();
    }

}

johnzsj 发表于 2022-1-8 09:54:31

小伤口 发表于 2022-1-8 00:04
1你的代码本身就有错误
   
这是B类应该写B的构造方法而不是父类


这个方法我知道,但还是感谢,还可以用强制类型转化来强制读取父类的父类的属性{:5_109:}

小伤口 发表于 2022-1-8 11:14:37

johnzsj 发表于 2022-1-8 09:54
这个方法我知道,但还是感谢,还可以用强制类型转化来强制读取父类的父类的属性

你的问题是用super访问,不是强制类型转换呀{:5_102:}

johnzsj 发表于 2022-1-10 23:19:00

小伤口 发表于 2022-1-8 11:14
你的问题是用super访问,不是强制类型转换呀

对,只是还想到了强制转换的一种方法
页: [1]
查看完整版本: java中关于访问父类的父类的同名属性问题