鱼C论坛

 找回密码
 立即注册
查看: 1938|回复: 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你的代码本身就有错误
     
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();
    }

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

使用道具 举报

发表于 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();
    }

}
想知道小甲鱼最近在做啥?请访问 -> 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-12-22 14:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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