举个例子:
package com.qfedu.b_duotai; public class Demo1 { public static void main(String[] args) { //父类的引用指向子类的对象 Father father = new Son(); father.eat(); //当父类的引用指向子类的对象的时候 //父类不能调用子类独有的方法 //如果子类重写父类的方法,调用的是子类的方法 //father.driver(); //Daughter daughter = new Daughter(); test(new Daughter()); test(new Son()); test(new Son1()); } //如果写一个方法的参数的话,尽可能的写父类的对象 //具有很强的扩展性 public static void test (Father father) { father.eat(); } // public static void test (Son son) { // son.eat(); // } // public static void test (Daughter daughter) { // daughter.eat(); // } // public static void test (Son1 son1) { // son1.eat(); // } }
package com.qfedu.c_duotailainxi; public class Person { // public void feed (Dog dog) { // dog.eat(); // } // public void feed (Cat cat) { // cat.eat(); // } //方法的形参传的是一个父类的对象 //调用方法的时候可以传子类的对象 //形参 (父类)= 实参(子类) //父类的引用指向子类的对象 public void feed (Pet pet) { pet.eat(); } }
父与子对象之间的转换可以分为向上转型和向下转型
向上转型:通过子类对象(小范围的)去实例化父类对象(大范围)。自动转换
java多态的核心思想:【父类的引用指向子类的对象】
向下转型:通过父类的对象(大范围)转为子类的对象(小范围)。强制类型转换
例子:向上转型
package com.qfedu.d_zhuanxing; class A { public void test () { System.out.println("test:A"); } } class B extends A { @Override public void test() { // TODO Auto-generated method stub System.out.println("test:B"); } } public class Demo1 { public static void main(String[] args) { //向上转型 过子类对象(小范围的)去实例化父类对象(大范围)。自动转换 //把子类真实的值赋值给父类的引用 //父类 子类对象 = new 子类() 无需强转 默认的一种写法 A a = new B(); //子类 子类对象 = (子类)new 父类(); 强转 B b = (B) new A(); } }
例子:向下转型
package com.qfedu.d_zhuanxing; class A1 { public void test1 () { System.out.println("test:A1"); } } class B1 extends A1 { @Override public void test1() { // TODO Auto-generated method stub System.out.println("test:B1"); } } public class Demo2 { public static void main(String[] args) { //向下转型 子类 子类对象 = new 父类(); //B1 b1 = (B1)new A1();//报错了 //解决方案 A1 a1 = new B1();//向上转型 func(a1); } public static void func (A1 a1) { if (a1 instanceof B1) { B1 b1 = (B1)a1;//向下转型 b1.test1(); } else { System.out.println("xixida"); } } }
作用:测试左边的对象是否是右边类的实例
语法格式:
对象 instnaceof 类 返回值是布尔类型数据
例子:
package com.qfedu.d_zhuanxing; interface A2 { } class B2 implements A2 { } class C2 extends B2 { } public class Demo3 { public static void main(String[] args) { A2 a2 = new B2();//父类的引用指向子类的对象(小转 大) //测试左边的对象是否是右边类的实例 boolean ret = a2 instanceof B2; System.out.println(ret);//true // a2这个对象的是接口A2实例对象的引用 boolean ret1 = a2 instanceof A2; System.out.println(ret1);//true B2 b2 = new B2(); //你的叔叔长得像你爷爷 boolean ret2 = b2 instanceof A2; System.out.println(ret2); //你的叔叔长的像你 大忌 //总结:左边的那个对象 一定是 instanceof 右边的那个类的子孙类 //C2 c2 = (C2)new B2(); boolean ret3 = b2 instanceof C2;//能不能将b2转为C2的实例吗?不能 爹转儿子 要强转 System.out.println(ret3);//false B2 b3 = new C2();//向上转型 boolean ret4 = b3 instanceof A2;// A2 b3 = new C2(); System.out.println(ret4); boolean ret5 = b3 instanceof B2;// B2 b3 = new C2(); System.out.println(ret5); boolean ret6 = b3 instanceof C2;//C2 c2 = new C2(); System.out.println(ret6); } }