int i=1; public void test(){ System.out.print("A"); } } public class B extends A{ int j=2; public static void main(String[] args){ A a = new B(); a.test(); System.out.println(a.i); // a.test2(); // System.out.println(a.j); } public void test(){ System.out.println("B"); } public void test2(){ System.out.print("BB"); } } 父类引用指向子类对象 虽然new 出来的 是B类型的 但是 a 引用 看到的只是 B里面含有A 内容(所继承的,也可以这样理解)的东西 也就是说 a。test2() 是不行的 a是父类引用 看不到B 里面B 特有的方法test2()【以及属性j】 是B 自己的 所以a 不能调用test2() 方法
public static void main(String[] args){
A a = new B();
System.out.println(a);
}通过这个小程序就能看出来a是B的对象。
这个这样一个东东:一个父类的引用指像了一个子类的对象。
你调用 方法时,只能调用 父类里边有的方法,子类里边的方法调用不了。
你可以想像这是一个黑盒子,盒子里边是new的一个对象,但是对外提供的只是一个父类的引用。在这种情况下,当然不可能调
用子类的方法了...
子类 obj=(子类)对象;
这样就可以调用子类特有方法了
父类 对像=new 子类();
比
子类 对像=new 子类();
的好处,总是有一点不明白
int i=1;
public void test(){
System.out.print("A");
} } public class B extends A{ int j=2; public static void main(String[] args){
A a = new B();
a.test();
System.out.println(a.i);
// a.test2();
// System.out.println(a.j); } public void test(){
System.out.println("B");
} public void test2(){
System.out.print("BB");
}
} 父类引用指向子类对象 虽然new 出来的 是B类型的 但是 a 引用 看到的只是 B里面含有A 内容(所继承的,也可以这样理解)的东西 也就是说
a。test2() 是不行的 a是父类引用 看不到B 里面B 特有的方法test2()【以及属性j】 是B 自己的 所以a 不能调用test2()
方法
这样new出来的东西,它确实是一个“子类”的对象,但是系统却把它当做一个“父类”的对象来看待,当有多态存在时,才动态地去调用子类重写的方法。
另外要说明的是,用instanceof("父类");和instanceof("父类");两者都是true
Person aa=new Student();
这个表达式分三步:
1.你声明了一个Person(父)类型的指针或者说引用aa放在栈里。
2.在堆里new出一块空间Student(子),同时Student(子)这个空间里还包含一个Person(父)
3.然后aa指向堆里的这个Student(子)。
aa只能调用子继承父的东西(可以直白理解为共同拥有的,如属性,方法等),而不能用子类自己特有的。 当你aa.调用方法时 虚拟机是先去父类里找的,但是执行的时候是子类重写后的。