java基础多态问题1111111111111?

public class Test {
public static void main(String[] args) {
Zi zi = new Zi();
zi.service();
}
}
class Fu{
String name = "张三";
public void service(){
System.out.println(this.name);
System.out.println(this.getClass().getSimpleName());
doGet();
doPost();
}
public void doGet(){
System.out.println("fu-->get");
}
public void doPost(){
System.out.println("fu-->post");
}
}
class Zi extends Fu{
String name = "李四";
public void doGet(){
System.out.println("zi-->get");
}
public void doPost(){
System.out.println("zi-->post");
}
}
结果:张三
Zi
zi-->get
zi-->post
有没有能解释一下 想半天没想明白 不要谈什么就近原则 内存分析下?
为什么输出张三 不是李四啊?

6个回答

Fu,没有service方法,肯定要向上转型的,这个时候,对象已经自动默认是fu对象,所以应该是fu对象的属性

子类声明的成员变量名与父类的成员变量名相同时,子类会隐藏这个继承来的成员变量。

当子类调用父类的方法时,才会使用这个被隐藏的成员变量。

由于service方法是从父类继承的,因此调用时使用的是被隐藏的成员变量。

子类没有service方法,因此会被upcast,也就是说只能访问父类定义的成员变量了。
而且,变量的多态没必要重新定义,建议将代码改为如下内容:

 public class Test {
    public static void main(String[] args)
    {
        Zi zi = new Zi();
        zi.service();
    }
}
class Fu {
    public String name = "张三";
    public void service()
    {
        System.out.println(this.name);
        System.out.println(this.getClass().getSimpleName());
        doGet();
        doPost();
    }
    public void doGet()
    {
        System.out.println("fu-->get");
    }
    public void doPost()
    {
        System.out.println("fu-->post");
    }
}

class Zi extends Fu {
    public Zi()
    {
        this.name = "李四";
    }

    public void doGet()
    {
        System.out.println("zi-->get");
    }
    public void doPost()
    {
        System.out.println("zi-->post");
    }
}

属性没有多态性,父子类 同名属性算2个

子类没有service的方法,所以调用的是父类的service方法,那么this代表的是当前对象的引用,此时引用的父类,也就是说this是父类,那么自然this.name是父类的属性

分析什么内存啊大哥,你Zi zi = new Zi();zi.service();都这样子了,直接最基础的知识好吧,new 的是子类的实例,所以先找service方法,因为没有service方法
所以会找父类中的service方法.
然后第二步为什么是张三,因为域对象是没有继承覆盖的,所以会找自己类中的name属性啊!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐