重写和重载的理解



[code="java"]public class Extendc {
 class A { 
        public String show(D obj){ 
               return ("A and D"); 
        }  
        public String show(A obj){ 
               return ("A and A"); 
        }  
    }  
   class B extends A{ 
        public String show(B obj){ 
               return ("B and B"); 
        } 
        public String show(A obj){ 
               return ("B and A"); 
        }  
   } 
   class C extends B{}  
   class D extends B{}
   class E{}
    public static void main(String[] args){
     Extendc et=new Extendc();
        Extendc.A a1= et.new A();
        A a2 = et.new B(); 
        B b = et.new B(); 
        C c = et.new C();  
        D d = et.new D();
        System.out.println(a1.show(b));  
        System.out.println(a1.show(c));  
        System.out.println(a1.show(d));  
        System.out.println(a2.show(b));   
        System.out.println(a2.show(c));    
        System.out.println(a2.show(d));    
        System.out.println(b.show(b));     
        System.out.println(b.show(c));     
        System.out.println(b.show(d));       
    }
}[/code]
如上所示例程1,输出结果如下:
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D

理解各个输出,关键理解点在继承与多态,我们知道,对一个引用变量而言,编译时,变量与其所声明的类型绑定,而运行环境中,其和实际引用类型绑定,所以上述例程中,引用变量a2编译时是和A绑定,但在运行时引用的是B的对象,依据如此理解,或许有人觉得a2.show(b)理当输出“B and B”才对,但实际输出的却是“B and A”,也就是说a2.show(b)实际上调用的是class B的show (A obj)方法,为什么不调用class B的show (B obj)方法呢,细揣摩之,如此理解,未知确否。

所谓编译时和声明类型绑定,编译器在编译a2.show(B)时,认为该方法调用的是A的show(A)方法,因为A类里只有两个方法,参数b是B的实例,B继承自A,所以理应在类A的两个方法里决定调用show(A);那么实际运行的时候,java虚拟机运行环境究竟决定怎么调用这个方法呢,这就用到了重载和重写的概念,a2实际上是B的一个实例,B从A继承了show(A)的方法,虚拟机判断B对方法show(A)进行了重写,所以就调用被重写了的show(A)方法,于是输出“B and A”。

我们对上面的程序稍作修改,进一步验证一下我们的推论。

如下例程2,更换了一行代码
[code="java"]public class Extendc {
 class A { 
        public String show(D obj){ 
               return ("A and D"); 
        }  
        public String show(Object obj){ 
               return ("O and A"); 
        }
    }  
   class B extends A{ 
        public String show(B obj){ 
               return ("B and B"); 
        } 
        public String show(A obj){ 
               return ("B and A"); 
        }  
   } 
   class C extends B{}  
   class D extends B{}
    public static void main(String[] args){
     Extendc et=new Extendc();
        Extendc.A a1= et.new A();
        A a2 = et.new B(); 
        B b = et.new B(); 
        C c = et.new C();  
        D d = et.new D();
        System.out.println(a1.show(b));  
        System.out.println(a1.show(c));  
        System.out.println(a1.show(d));  
        System.out.println(a2.show(b));   
        System.out.println(a2.show(c));    
        System.out.println(a2.show(d));    
        System.out.println(b.show(b));     
        System.out.println(b.show(c));     
        System.out.println(b.show(d));       
    }
}[/code]
输出:
O and A
O and A
A and D
O and A
O and A
A and D
B and B
B and B
A and D
依据上述原理,验证通过。

这里又发现一个值得注意的问题,编译器在根据参数决定调用那个方法的时候,编译器总是将和参数声明类型最相近的那一个方法作为调用方法。比如例程2的最后一个,b.show(d),在B的方法中(包含继承自父类的),四个方法均参数符合调用要求,编译器选择的是A类中的show(D d)。我们不妨称之为“就近原则”。


[color=red][b]欢迎指正学习。[/b][/color]

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值