• java学习日记 多态性


    1、多态性严格来讲有两种描述形式:。

    • 方法的多态性:

      |- 方法的重载:同一个方法名称,会根据传入参数的类型及个数不同执行不同的方法。

      |- 方法的覆写:同一个方法,会根据子类的不同,实现不同的功能。

    • 对象的多态性:指的是发生在继承关系类之中,子类和父类之间的转换

      |- 向上转型(自动完成):父类 父类对象=子类实例;。

      |- 向下转型(强制完成):子类 子类对象=(子类)父类实例;。

     2、向上转型

    class A{
        int age =10;
        public void fun(){
            print();
        }
        public void print(){
            System.out.println("A");
        }
    }
    
    class B extends A{
        int age = 100;
        public void print(){
            System.out.println(this.age);
            System.out.println(super.age);
        }
    }
    public class ExtendsDemo1 {
        public static void main(String[] args) {
            A a = new B();
            a.print();
        }
    }

    运行结果:

    100
    10

    3、向下转型

    public class ExtendsDemo1 {
        public static void main(String[] args) {
            A a = new B();
            B b = (B) a;  //向下转型
            b.print();
        }
    }

    运行结果:

    100
    10

    向上转型的意义是参数的统一。

    参数统一后,可以调用子类覆写的方法。

    向下转型指的是父类调用子类自己的特殊方法。

    对于数据的操作分为两步,(1)设置数据(保存数据),需要向上转型统一数据类型。(2)取出数据。

    对于对象的转型,给出以下的经验总结:

    ●80%的情况下都只会使用向上转型,因为可以得到参数类型的统一。

    5%的情况下会使用向下转型,目的是调用子类的特殊方法;。

    ●15%的情况下是不转型,例如: String。

    个性化的操作在-一个标准的开发之中应该尽量少出现,因为对象的转型操作里面存在安全隐患。

     4、观察如下代码:

    class A{
        public void print(){
            System.out.println("A");
        }
    }
    
    class B extends A{
        public void print(){
            System.out.println("B");
        }
    }
    public class ExtendsDemo1 {
        public static void main(String[] args) {
            A a = new A();
            B b = (B) a;
            b.print();
        }
    }

    运行报错:

    Exception in thread "main" java.lang.ClassCastException: com.hengqin.test1.A cannot be cast to com.hengqin.test1.B
        at com.hengqin.test1.ExtendsDemo1.main(ExtendsDemo1.java:17)

    类转换异常,两个没有关系的类强行发生了向下转型。

    学习instanceof 关键字

    class A{
        public void print(){
            System.out.println("A");
        }
    }
    
    class B extends A{
        public void print(){
            System.out.println("B");
        }
    }
    public class ExtendsDemo1 {
        public static void main(String[] args) {
            A a1 = new A();
            System.out.println(a1 instanceof A);
            System.out.println(a1 instanceof B);
    
            A a = new B();
            System.out.println(a instanceof A);
            System.out.println(a instanceof B);
            if (a instanceof B){//如果a对象是B类的实例
                B b = (B) a;
                b.print();
            }
        }
    }

    运行结果:

    true
    false
    true
    true
    B

    对于向下转型,一定要先发生向上转型,建立关系后才能发生。

  • 相关阅读:
    Scott的ASP.net MVC框架系列文章之一
    NHibernate配置的总体流程(转载)
    深入浅出MFC》学习笔记之一
    用javascript实现选择下拉菜单间的数据转移,用javascript实现超强的万年历,javascript弹出窗口后,关闭窗口时不弹出对话框
    深入理解动态库
    C#中读取文件内容
    a id="saveButton" href="#" onclick="javascript:startUpload();"Upload !!/a
    如何调用DLL (基于Visual C++6.0的DLL编程实现)
    MSDN获取网站,www.bd66.com
    应用MFC开发高级应用程序
  • 原文地址:https://www.cnblogs.com/cathycheng/p/13158974.html
Copyright © 2020-2023  润新知