一、啥是多态?
1、多态是指想同类型的变量、调用同一方法时呈现出多种不同的行为特征(引用变量在编译时的类型和运行时的类型不同就会发生多态);
2、多态通常出现在存在继承关系的类中;
3、例如:
public class BaseClass {
public int book = 10;
public void base(){
System.out.println("父类的普通方法!");
}
public void test(){
System.out.println("父类将会被覆盖的方法!");
}
}
class SubClass extends BaseClass{
//重新定义book实例变量隐藏父类的book变量
public String book = "书籍";
@Override
public void test(){
System.out.println("子类覆盖父类的test方法");
}
public void sub(){
System.out.println("子类的普通方法!");
}
public static void main(String args[]){
//创建一个BaseClass的实例,引用变量bc的编译时的类型和运行时类型相同,不存在多态
BaseClass bc = new BaseClass();
System.out.println(bc.book); //将会输出10
//下面调用的两个方法将会执行父类(BaseClass)的方法
bc.base();
bc.test();
//创建一个SubClass的实例,引用变量sc的编译时的类型和运行时类型相同,不存在多态
SubClass sc = new SubClass();
System.out.println(sc.book); //将会输出“书籍”
sc.base();//将调用父类的base方法
sc.test();//由于子类(SubClass)重写了父类的test方法,所以,此处将会调用子类的test方法
//此处polymorphic编译时的类型和运行时的类型不同,多态发生
BaseClass polymorphic = new SubClass();//此处将会自动发生向上转型
//Java允许把一个子类对象直接赋值给一个父类的引用变量,无须转型,称之为向上转型,与此相对的还有向下转型
System.out.println(polymorphic.book);//将会输出10,由于对象的实例变量不具备多态性
polymorphic.base();//执行父类BaseClass的base方法
polymorphic.test();//将会执行子类SubClass的test方法,由于子类的额test方法将父类的test方法覆盖了
//由于polymorphic编译时是BaseClass类型,而sub()是属于子类SubClass的方法,
// BaseClass中不存在Sub()方法,编译不能通过,故下一行代码将会报错
//polymorphic.sub();
}
}