Java|polymorphism多态-java三大特性

Java|polymorphism多态-java三大特性

/**
* 测试多态 polymorphism 方法的多态
*/
public class TestPolymorphism {
void eat(){
System.out.println(\"各国人的吃饭方式\");
//父类的方法


class Chinese extends TestPolymorphism{
void eat(){
System.out.println(\"用筷子\");
//子类重写

void drink(){
System.out.println(\"喝茶\");


class American extends TestPolymorphism{
void eat(){
System.out.println(\"用叉子\");


class TestPoly{
static void pe(TestPolymorphism p){
//静态方法属于类 , 在类内可直接调用 , 不依附于对象名.
p.eat();

public static void main(String[
args) {
pe(new TestPolymorphism());
//new一个父类对象 , 调用父类的eat
pe(new Chinese());
//new一个子类对象 (形参)p = new Chinese()  父类引用p 指向子类对象Chinese() 称为向上转型
//执行p.eat()时 p指向子类对象 变成子类对象.eat()
pe(new American());
//父类引用p(形参)指向父类或不同的子类 调用各自重写的方法 形成多态
TestPolymorphism p1 = new Chinese();
p1.eat();
//执行时p1指向子类对象 变成子类对象.eat()
//无法调用p1.drink(); 首先判定父类p1.drink() 父类没有drink方法 此时还没到p1指向子类对象的步骤
//TestPolymorphism p1为编译类型     new Chinese()为运行时类型
//父类引用变量p1只能调用编译类型TestPolymorphism的方法 不能调用运行时类型Chinese的方法
TestPolymorphism p2 = new Chinese();
//父类引用p2  指向子类对象  称为向上转型
Chinese c = (Chinese) p2;
//子类引用c 指向父类编译类型p2 称为向下转型 需要用(类名)强制转换
c.drink();
//p2.drink();依然报错
((Chinese)p2).drink();
【Java|polymorphism多态-java三大特性】//(Chinese)p2强制转换后可用drink()
//原对象仍然是Chinese类 p2仍然是TestPolymorphism类 c是Chinese类
if(p2 instanceof American){
//判断p2是否属于American类
American a2 = (American) p2;
//由于Chinese类不属于American类 虽然编译时可以强制转换 但运行时会报错
//添加if语句判断instanceof 为false即不执行
a2.eat();