<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
<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.如果父类有这个属性跟方法,而子类没有,则调用的是父类的属性跟方法。
重新运行(1)(2)(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) } }
the bus carrys 40 persons
Car travels at a speed of 90 km