多态
定义:同一行为具有多个不同变现形式或形态的能力。
多态性在Java中有两种体现形式:
1、方法的重载与覆写。
2、对象的多态。
对象的多态有两种类型:
1、向上转型:父类 父类对象=new 子类实例。
对象发生向上转型后,所调用的方法一定是被子类覆写过的方法。
public class PolDemo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//像上转型
A a=new B();
a.fun1();
}
}
class A{
public void fun1() {
System.out.println("A——>fun1()");
}
}
class B extends A{
public void fun1() {
System.out.println("B——>fun1()");
}
public void fun2() {
System.out.println("B——>fun2()");
}
}
//结果:
//B——>fun1()
2、向下转型——能调用子类自己的定义的方法。
先进行对象向上转型,才能进行对象的向下转型。
public class PolDemo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a=new B();
B b=(B)a;
b.fun1();
b.fun2();
}
}
class A{
public void fun1() {
System.out.println("A——>fun1()");
}
}
class B extends A{
public void fun1() {
System.out.println("B——>fun1()");
}
public void fun2() {
System.out.println("B——>fun2()");
}
}
//结果:
//B——>fun1()
//B——>fun2()
instanceof关键字
作用:判断一个对象是哪个类的实例。
建议在进行对象转型前优先使用instanceof进行判断。
public class InstanceofDemo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
fun(new B()); //传递B类实例,产生向上转型
}
public static void fun(A a) { //此方法可以分别调用各自子类单独定义的方法
a.fun1();
if(a instanceof B) { //判断是否是B类实例
B b=(B)a; //进行向下转型
b.fun1();
b.fun2();
}
}
}
class A{
public void fun1() {
System.out.println("A——>fun1()");
}
}
class B extends A{
public void fun1() {
System.out.println("B——>fun1()");
}
public void fun2() {
System.out.println("B——>fun2()");
}
}
//B——>fun1()
//B——>fun1()
//B——>fun2()
在类设计时永远不要去继承一个已经实现好的类。而是去继承抽象类或去实现接口。