zoukankan      html  css  js  c++  java
  • 多态、向上转型、向下转型

     1 package cn.learn.Polymorphism;
     2 
     3 public class Fu {
     4     public void method(){
     5         System.out.println(",父类子类都有的方法,父类方法运行");
     6 
     7     }
     8     public void methodFu(){
     9         System.out.println("父类独有,子类没有的的方法运行");
    10     }
    11 
    12     int num=10;    //与子类成员变量重名的情况
    13 }
     1 package cn.learn.Polymorphism;
     2 
     3 public class Zi extends Fu{
     4     public void method() {
     5 
     6         System.out.println("父类子类都有的方法,子类方法运行");
     7     }
     8     public void methodZi(){
     9         System.out.println("子类独有方法");
    10     }
    11     //成员变量不可覆盖重写
    12     int num=20;    //与子类成员变量重名的情况
    13 }
     1 package cn.learn.Polymorphism;
     2 /*
     3    多态是对象的多态
     4    代码中体现多态性:父类引用指向子类对象
     5     -
     6     对象的向上转型  eg:Animal animal = new Cat();
     7     从小范围转到大范围,安全,但有弊端,子类无法调用子类特有方法如下methodZi()
     8    父类名称 对象名   = new 子类名称();
     9    接口名称 实现类名 = new 实现名称();
    10 
    11    -
    12    对象的向下转型(还原)子类名称 对象名=(子类名称)父类对象
    13    注:子类对象要与new的相同,不能向下转型为其他父类对象
    14    eg:
    15    Fu obj = new Zi();
    16    Zi obj = (Zi)obj2  错误,编译不报错,运行报错,抛出 java.lang.ClassCastException
    17    Zi obj = (Zi)obj  正确
    18    目的:使用Zi类中的特有方法
    19 
    20    优点:无论右边new的谁,左边调用仍然不变
    21 
    22  */
    23 public class Polymorphism {
    24     public static void main(String[] args) {
    25         Fu obj =new Zi();  //向上转型
    26         obj.method();    //子父同时存在,运行的是子类的,new的是谁就运行谁的
    27         obj.methodFu();  //子类没有这个方法就在父类找
    28 
    29         //成员方法obj.methodZi()不能直接调用,向上转型弊端,需要向下还原
    30         //可以判断下,格式:对象名 instanceof 类名称,返回值为Boolean
    31         System.out.println(obj instanceof Zi);
    32 
    33         // 成员方法,多态中,new出的对象,编译在左,运行在右
    34         // 成员变量,多态中,对象都看左类的成员变量
    35         //如果不知道obj 向下还原成谁,可以用if(obj instanceof 类名称)进行判断再转型
    36         ((Zi) obj).methodZi(); //正确 ,向下转型还原
    37 
    38 
    39         /*
    40         成员变量访问的两种方式:
    41         1.直接访问:等号左边是谁就是谁的成员变量,没有则向上查找
    42         2.间接访问:通过成员方法进行访问,该方法属于谁,就用谁。没有同上
    43          */
    44         System.out.println(obj.num);   //调用的是父类的num 10,不报错这是与成员方法取得区别,向上转型
    45         System.out.println(((Zi) obj).num);   //调用的是子类的num 20   向下转型
    46 
    47     }
    48 }
  • 相关阅读:
    记一次DRF问题排障
    贷款
    wpf 手指触摸图片放大缩小 设置放大缩小值
    wpf下的图片放大缩小
    WPF 鼠标移动到图片变大,移开还原,单击触发事件效果
    导出压缩
    Sql Server 数据库分页存储过程书写
    Asp.Net Core MVC传值 Asp.Net Core API 前台写法
    MVC下拉框
    Dapper和EF学习
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/11470286.html
Copyright © 2011-2022 走看看