多态之向上转型


牛客问题

public class Person{
	private String name = "Person";
	int age=0;
}
public class Child extends Person{
	public String grade;
	public static void main(String[] args){
		Person p = new Child();
		System.out.println(p.name);
	}
}

答案是->编译出错。

自己实验

public class Base
{
    private String name = "zjy";
    public String a = "a";
    public void method()
    {
        System.out.println("Base");
    }
}
class Son extends Base
{
    public String b = "b";
    public void method()
    {
        System.out.println("Son");
    }
    public void methodB()
    {
        System.out.println("SonB");
    }
}

运行截图如下:
没啥意思!


总结

向上转型,JAVA中的一种调用方式。向上转型是对A的对象的方法的扩充,即A的对象可访问B从A中继承来的和B“重写”A的方法。(百度百科)

在向上转型时,实际上java对引用变量会产生两种类型,

  • 一种是编译时的类型,也就是声明引用变量声明的类型,此时该引用变量具有声明类型(左边)的成员;
  • 另一种是运行时的类型,运行时的类型由实际创建的对象类型(右边)决定,而向上转型时运行时的类型是声明类型的子类,
    (1)如果子类中有方法覆盖了父类中的方法,向上转型时调用方法是将访问的将是覆盖后的方法(即子类的方法);
    (2)但是对于成员变量,向上转型是访问的是声明类型(左边)的成员变量。如下:
public class Base
{
    public String a = "a->Base";

    public void method()
    {
        System.out.println("Base");
    }
    public void methodA()
    {
        System.out.println("Base-A");
    }

}
class Son extends Base
{
    public String a = "b->Son";

    public void method()
    {
        System.out.println("Son");
    }
    public static void main(String[] args)
    {
        Base base = new Son();

//        System.out.println(base.name);
        System.out.println(base.a);
        base.method();
        base.methodA();
    }
}
//结果:
a->Base
Son
Base-A

总结一下:

  • 1、成员变量:以左边为准
  • 2、成员方法:编译以左边为准,运行以右边为准。
  • 3、静态成员:编译和运行都以左边为准。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值