牛客问题
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、静态成员:编译和运行都以左边为准。