鱼C论坛

 找回密码
 立即注册
查看: 1591|回复: 4

[已解决]java中关于访问父类的父类的同名属性问题

[复制链接]
发表于 2022-1-7 22:50:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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你的代码本身就有错误
     
  1. class B extends A{
  2.         public int a;
  3.         public A(){
  4.                 a = 90;
  5.         }
  6. }
复制代码

这是B类应该写B的构造方法而不是父类

2你的m方法少()号

  1. public void m{
  2.                 //如何用访问父类的父类中的同名成员变量a
  3.         }
复制代码


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

我想是因为视频的代码是没有将父类的父类变量覆盖掉,所以可以直接用super.
或者是类似像我下面的方法,所以是super.xxx

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

  8. class B extends A{
  9.     public int a;
  10.     public int test1(){
  11.         return super.a;
  12.     }
  13.     public B(){
  14.         a = 90;

  15.     }
  16. }

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

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

  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-8 00:04:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 小伤口 于 2022-1-8 00:15 编辑

1你的代码本身就有错误
     
  1. class B extends A{
  2.         public int a;
  3.         public A(){
  4.                 a = 90;
  5.         }
  6. }
复制代码

这是B类应该写B的构造方法而不是父类

2你的m方法少()号

  1. public void m{
  2.                 //如何用访问父类的父类中的同名成员变量a
  3.         }
复制代码


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

我想是因为视频的代码是没有将父类的父类变量覆盖掉,所以可以直接用super.
或者是类似像我下面的方法,所以是super.xxx

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

  8. class B extends A{
  9.     public int a;
  10.     public int test1(){
  11.         return super.a;
  12.     }
  13.     public B(){
  14.         a = 90;

  15.     }
  16. }

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

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

  28. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-8 09:54:31 | 显示全部楼层
小伤口 发表于 2022-1-8 00:04
1你的代码本身就有错误
     
这是B类应该写B的构造方法而不是父类

这个方法我知道,但还是感谢,还可以用强制类型转化来强制读取父类的父类的属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的问题是用super访问,不是强制类型转换呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-10 23:19:00 | 显示全部楼层
小伤口 发表于 2022-1-8 11:14
你的问题是用super访问,不是强制类型转换呀

对,只是还想到了强制转换的一种方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 05:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表