多态

1.多态的概述

 

 2.多态的格式和使用

 1 public class FuTest1 {
 2     public void method(){
 3         System.out.println("父类方法");
 4     }
 5     public void methodFu(){
 6         System.out.println("父类特有方法");
 7     }
 8 }
 9 
10 
11 public class ZiTest extends FuTest1{
12     @Override
13     public void method(){
14         System.out.println("子类特有方法");
15     }
16 }
17 
18 
19 /*
20 代码中体现多态性,其实就是一句话:父类引用指向子类对象
21 格式:
22 父类名称 对象名 = new 子类名称();
23 或者:
24 接口名称 对象名 = new 实现类名称
25  */
26 public class Demo01Multi {
27     public static void main(String[] args) {
28 //        ZiTest zi  = new ZiTest();
29 //        zi.method();
30 //        zi.methodFu();
31         //多态的写法:左侧父类的引用,指向了右侧子类的对象。
32           FuTest1 obj = new ZiTest();
33           obj.method();
34           obj.methodFu();
35     }
36 }

 3.多态中成员变量的使用特点

 1 public class FuTest2 /*extends Object*/ {
 2     int num = 10;
 3     public void showNum(){
 4         System.out.println(num);
 5     }
 6 
 7 
 8 
 9 public class ZiTest2 extends FuTest2{
10     int num = 20;
11     int age = 15;
12 
13     @Override
14     public void showNum() {
15         System.out.println(num);
16     }
17 }
18 
19 
20 /*
21 访问成员变量的两种方式:
22 1.直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则想上找。
23 2.间接通过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则想上找。
24  */
25 public class Demo02Multi {
26     public static void main(String[] args) {
27         FuTest2 obj = new ZiTest2();
28         System.out.println(obj.num); //父:10
29         //System.out.println(obj.age);//错误写法:父类没有该变量,向上找不到
30         System.out.println("=======================");
31         //子类没有覆盖重写就是父:10
32         //子类覆盖重写,就是访问子:20
33         obj.showNum();
34     }
35 }

4.多态中成员方法的使用特点

 1 public class FuTest3 {
 2     public void method(){
 3         System.out.println("父类方法");
 4     }
 5     public void methodFu(){
 6         System.out.println("父类特有方法");
 7     }
 8 }
 9 
10 
11 public class ZiTest3 extends FuTest3{
12     public void method(){
13         System.out.println("子类方法");
14     }
15     public void methodZi(){
16         System.out.println("子类特有方法");
17     }
18 }
19 
20 
21 /*
22 在多态的代码中,成员方法的访问规则是:
23     看new的是谁,就优先用谁,没有则向上找。
24     口诀:编译看左边,运行看右边
25 对比一下:
26 成员变量:编译看左边,运行还看左边
27 成员方法:编译看左边,运行看右边
28  */
29 public class Domo02Multi {
30     public static void main(String[] args) {
31         FuTest3 obj = new ZiTest3(); //多态
32         obj.method(); // 父子都有,优先用子
33         obj.methodFu(); //子类没有,父类有,向上找到父类
34 
35     }
36 }

5.使用多态的好处

 

 6.对象的向上转型

 

 

 1 public abstract class Animal {
 2     public abstract void eat();
 3 }
 4 
 5 
 6 
 7 public class Cat extends Animal{
 8 
 9     @Override
10     public void eat() {
11         System.out.println("猫吃鱼");
12     }
13 }
14 
15 
16 public class Demo01Main {
17     public static void main(String[] args) {
18         //对象的向上转型:父类引用指向子类对象
19         Anima anima= new Cat();
20         anima.eat();
21     }
22 }

7.对象的向下转型

 1 public abstract class Anima {
 2     public abstract void eat();
 3 }
 4 
 5 
 6 public class Cat extends Anima{
 7 
 8     @Override
 9     public void eat() {
10         System.out.println("猫吃鱼");
11     }
12     public void catchMouse(){
13         System.out.println("猫抓老鼠");
14     }
15 }
16 
17 
18 public class Demo01Main {
19     public static void main(String[] args) {
20         //对象的向上转型:父类引用指向子类对象
21         Anima anima= new Cat(); //本来创建的时候就是一只猫
22         anima.eat();//猫吃鱼
23         //anima.catchMouse();//错误写法
24 
25         //向下转型,进行“还原”动作
26         Cat cat = (Cat) anima;
27         cat.catchMouse();//猫抓老鼠
28 
29         //下面是错误的向下转型
30         //本来new的时候是一只猫,现在非要当作狗
31         //错误写法!编译不会报错,但是运行会出现异常
32         //java.lang.ClassCastException
33 //        Dog dog = (Dog) animal;
34     }
35 }

8.用instanceof关键字进行类型判断

 1 /接上面6.7代码
 2 public class Dog extends Anima{
 3     @Override
 4     public void eat() {
 5         System.out.println("狗啃骨头");
 6     }
 7 }
 8 
 9 //如何才能直到一个父类引用的对象,本来是什么子类:
格式: 对象 instatceof 类名称
这将会得到一个boolean值的结果,也就是判断前面的对象能不能当作后面类型的实例 10 public class Demo02Instanceof { 11 public static void main(String[] args) { 12 Anima anima = new Cat(); 13 anima.eat(); 14 giveMePet(new Dog()); 15 }

//如果希望调用子类特有的方法,需要向下转型
//判断一个父类引用animal本来是不是Dog
16 public static void giveMePet(Anima anima){ 17 if (anima instanceof Dog){ 18 Dog dog = (Dog) anima; 19 dog.eat(); 20 } 21 if(anima instanceof Cat){ 22 Cat cat = (Cat) anima; 23 cat.eat(); 24 } 25 } 26 }

 

posted @ 2022-03-20 18:21  当时只道是寻常呀  阅读(32)  评论(0)    收藏  举报