1、可以用父类去声明子类对象
2、可以将父类对象强转为子类对象,前提是只有父类对象本身就是用子类new出来的时候, 才可以在将来被强制转换为子类对象
实例如下:
package hrx;
public class TestExtends {
static class A {
private int x = 1;
private int y = 2;
}
static class B extends A{
private int x = 2;
private int y = 4;
}
public static void main(String[] args) {
A a = new A();
B b = new B();
b = (B) a;
System.out.println(b.x);
}
}
会出现如下报错:
正确做法:
package hrx;
public class TestExtends {
static class A {
private int x = 1;
private int y = 2;
}
static class B extends A{
private int x = 2;
private int y = 4;
}
public static void main(String[] args) {
A a = new B();
B b = new B();
b = (B) a;
System.out.println(b.x);
}
}
结果如下:
那么再来考虑一下,用父类声明的子类对象,到底是父类还是子类,看下边实例:
package hrx;
public class TestExtends {
static class A {
private int x = 1;
private int y = 2;
public void print(){
System.out.println("I am A");
}
}
static class B extends A{
private int x = 2;
private int y = 4;
public void print(){
System.out.println("I am B");
}
}
public static void main(String[] args) {
A a = new B();
System.out.println(a.x);
a.print();
}
}
结果如下:
到这里相比大家已经明白,用父类声明的子类,变量不会被覆盖,而方法会被覆盖,这是因为,基本数据类型采用的是值传递,因而不会将父类的变量的值覆盖,而方法采用的是引用传递,因此会覆盖,java的参数传递详见:java参数传递详解