zoukankan      html  css  js  c++  java
  • Java继承与向上转型总结

    • 子类只能继承一个父类
    • 子类会继承父类的所有域,只是私有域无法访问与使用
    • 父类对象的public域是所有类都可见的,而proteced域只能在本包与它的子类可见(注意的是子类对象只能访问它从父类继承的protected域,而不能访问父类对象的protected域),private域无法直接访问除非父类提供了public方法去访问
    • 一般情况下父类可以引用子类对象即向上转型Father father=new son();(因为子类对象中有父类所有的域);而子类不能引用父类对象Son son=new Fahter();(因为父类对象可能没有子类的所有域)
            /**
             * Manager继承Person类,Manager中多了private域bonus
             * 一般情况下父类可以实例成子类即向上转型(因为子类对象中有父类所有的域),而子类不能实例化成父类(因为父类对象可能没有子类的所有域)
             * 特殊情况:
             * 两个数组,将persons引用指向managers,两者公用同一个Manager数组
             * 此时用persons[0]=new Person();就会实现父类实例化成为一个子类且不报错
             * 也就是Manager[0]被实例化成Person
             * 此时Manager[0].getBonus()会报错,因为调用了不存在的域
             */
            Manager[] managers=new Manager[2];
            Person[] persons=managers;
            persons[0]=new Person();
            managers[0].getBonus();
    • 通过强制类型转换实现子类实例化为父类编译通过但执行时会报错java.lang.ClassCastException
    Son son=new Son();
    Father father=new Father();
    son=(Son)father;
    • Son instanceof Father->true;Fahter instanceof Son->false
    • 当父类引用一个子类对象时,不能直接调用子类中特有的域,而需要强制类型转换恢复为子类才能调用
    public class castClass{
        public static void main(String[] argv){
            A as[]=new A[2];
            as[0]=new A();
            as[1]=new B();
            ((B)as[1]).getB();
        }
    }
    
    class A{
        int a;
        public int getA(){
            return a;
        }
    }
    
    
    class B extends A{
        int b;
        @Override
        public int getA(){
            return 1;
        }
        public int getB(){
            return b;
        }
    }
  • 相关阅读:
    密码学复习
    Kafka Stream 高级应用
    Kafka Stream 流和状态
    Kafka Stream 处理器API
    SSM工作流程与原理详解
    Seata AT和XA模式
    分布式锁结合SpringCache
    使用RabbitMQ最终一致性库存解锁
    使用Springboot+SpringCloud+Seata1.3.0+Nacos1.2.1进行全局事务管理
    在微服务环境下,远程调用feign和异步线程存在请求数据丢失问题
  • 原文地址:https://www.cnblogs.com/ming-szu/p/9156318.html
Copyright © 2011-2022 走看看