1、向上转型
意义:当我们需要多个同父的对象调用某个方法时,通过向上转换后,则可以确定参数的统一.方便程序设计
ps:向上转型时,父类只能调用父类方法或者子类覆写后的方法,而子类中的单独方法则是无法调用的.
class Bike {
int speedLimit = 90;
void run() {
System.out.println("running");
}
}
public class Splender extends Bike {
int speedLimit = 100;
void run() {
System.out.println("running safely with 60km");
}
public static void main(String args[]) {
Bike b = new Splender();
b.run();//running safely with 60km
System.out.println(b.speedLimit);//90
}
}
Splendar类扩展Bike类并覆盖其run()方法。通过父类(Bike)的引用变量调用run方法。 因为它引用子类对象,并且子类方法覆盖父类方法,子类方法在运行时被调用。
运行时多态性不能由数据成员实现。
这两个类都有一个数据成员:speedLimit,通过引用子类对象的父类的引用变量来访问数据成员。 由于我们访问的数据成员没有被重写,因此它将访问父类的数据成员。
规则: 运行时多态性不能由数据成员实现。
2、向下转型
在java中,向下转型则是为了,通过父类强制转换为子类,从而来调用子类独有的方法(向下转型,在工程中很少用到).
为了保证向下转型的顺利完成,在java中提供了一个关键字:instanceof,通过instanceof可以判断某对象是否是某类的实例,如果是则返回true,否则为false
class A {
public void print() {
System.out.println("A:print");
}
}
class B extends A {
public void print() {
System.out.println("B:print");
}
public void funcB(){
System.out.println("funcB");
}
}
class C extends A {
public void print() {
System.out.println("C:print");
}
public void funcC(){
System.out.println("funcC");
}
}
public class Test{
public static void func(A a)
{
a.print();
if(a instanceof B)
{
B b = (B)a; //向下转型,通过父类实例化子类
b.funcB(); //调用B类独有的方法
}
else if(a instanceof C)
{
C c = (C)a; //向下转型,通过父类实例化子类
c.funcC(); //调用C类独有的方法
}
}
public static void main(String args[])
{
func(new A());
func(new B());
func(new C());
}
}
本文探讨了Java中的向上转型如何统一方法调用,以及向下转型的使用场景,重点介绍了通过父类引用调用子类方法和instanceof关键字的应用。通过实例展示了运行时多态性和数据成员访问的区别。
1062

被折叠的 条评论
为什么被折叠?



