java学习笔记:java的多态,子类和父类的相互转换,父类引用指向子类的对象

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:24px;">      一</span><span style="font-size:18px;">.在java中可以将子类的引用赋给父类的对象,那么此时子类中那些不是从父类继承来的成员将不可见。以下代码bus 为car的子类,test类用来测试。</span></span>
package com.example.extendtest;

 class Car {


   void drive(){
	   System.out.println("Car travels at a speed of  90 km");
   }
   void length(){
	   System.out.println("car has travelled 5 hours");
   }
}
package com.example.extendtest;

class Bus extends Car{

   void length(){
	   System.out.println("the bus has travelled 8 hours");
   }
   void carry(){
	   System.out.println("the bus carrys 40 persons");
   }
}
package com.example.extendtest;

public class Test {
public static void main(String args[]){
	Bus bus=new Bus();
	Car car=bus;
	car.length();//(1)
	car.carry();//(2)
	car.drive();//(3)
}
}
1.如果父类中有这个属性跟方法,子类有重写过,那么调用的是子类中的属性跟方法。
运行test.java中的(1):the bus has travelled 8 hours
2.如果父类中没有这个属性跟方法,那么子类调用就会出错。
运行test.java中的(2):Exception in thread "main" java.lang.Error: 无法解析的编译问题:
	没有为类型 Car 定义方法 carry()at com.example.extendtest.Test.main(Te(t.java:8)
3.如果父类有这个属性跟方法,而子类没有,则调用的是父类的属性跟方法。
运行test.java中的(3):Car travels at a speed of  90 km
以上结果对于成员变量同样适用。

二、我们可以通过强制转换将这个父类在转换成子类类型,那些不可见的成员又可见了,由此可见,将子类引用给父类时,java虚拟机并没有抛弃那些非继承成员。

修改test.java 如下:
package com.example.extendtest;

public class Test {
public static void main(String args[]){
	Bus bus=new Bus();
	Car car=bus;
	Bus bus2=(Bus) car;
	bus2.length();//(1)
	bus2.carry();//(2)
	bus2.drive();//(3)
}
}
重新运行(1)(2)(3):
the bus has travelled 8 hours
the bus carrys 40 persons
Car travels at a speed of  90 km




你可能感兴趣的:(java,继承,多态)