zoukankan      html  css  js  c++  java
  • Java的同名属性、同名普通函数、同名静态函数,是否被覆盖

    作者按:虚拟函数的概念早就滚瓜烂熟了。但是今天面试发现:1.同名属性,2.同名普通函数,3.同名静态函数,是否被覆盖的问题。请看下面三个例子:

    例子1:测试父类的属性是否存在和被完全覆盖
    class A
    {
    public int i;
    A() { i=1; }
    }
    class B extends A
    {
    public int i;
    B() { i=2; }
    }
    class C extends B
    {
    public int i;
    C() { i=3; }
    }
    public class xx
    {
    public static void main(String[] args)
    {
    A a = new C();
    System.out.println(a.i);
    System.out.println(((B)a).i);
    System.out.println(((C)a).i);
    }
    }
    输出:
    1
    2
    3

    结论:
    1)估计内存里存在三个i属性,只是一般情况下只能看到当前类的那个i,看不到另外两个i,但是通过转换可以取到另外两个属性i的值。
    2)属性虽然也会被覆盖,但是严格按照对象名称的类走。对象名称是哪个类,就采用哪个类的属性。


    例子2:测试函数覆盖是一个函数覆盖父类的全面同名还是,还是只覆盖同签名的函数
    class A
    {
    public void get(int i) { System.out.println("in A: "+i); }
    public void get(double d) { System.out.println("in A: "+d); }
    }
    class B extends A
    {
    public void get(int i) { System.out.println("in B: "+i); }
    }
    public class xx
    {
    public static void main(String[] args)
    {
    A a1 = new A();
    a1.get(1);
    a1.get(2.1);

    A a2 = new B();
    a2.get(1);
    a2.get(2.1);

    B b1 = new B();
    b1.get(1);
    b1.get(2.1);
    }
    }

    结论:子类只覆盖父类相同函数签名的那个函数。对于参数不同的同名参数完全不影响。


    例子3:测试静态函数是否被覆盖
    class A
    {
    static void s() { System.out.println("static s in A"); }
    public void get(int i) { System.out.println("in A: "+i); }
    }
    class B extends A
    {
    static void s() { System.out.println("static s in B"); }
    public void get(int i) { System.out.println("in B: "+i); }
    }
    public class xx
    {
    public static void main(String[] args)
    {
    A a1 = new A();
    a1.get(1);
    a1.s(); // 正常,简单

    A a2 = new B();
    a2.get(1);
    a2.s(); // 注意,调用A类的静态函数,因为对象名称是A类型的。
    ((B)a2).s(); // 注意,转换后调用B类的静态函数

    B b1 = new B();
    b1.get(1);
    b1.s(); // 正常,简单
    ((A)b1).s(); // 注意,转换以后就调用A类的静态函数了,以对象名称的类型为准!严格区分于其它virtual函数!
    }
    }
    输出:
    in A: 1
    static s in A
    in B: 1
    static s in A
    static s in B
    in B: 1
    static s in B
    static s in A
    结论:
    静态函数永远以当前对象名称的类为准,而不是类对象实体为准。

  • 相关阅读:
    Swift高级语法学习总结(转)
    Swift基础语法学习总结(转)
    Go语言语法汇总(转)
    IOS8解决获取位置坐标信息出错(Error Domain=kCLErrorDomain Code=0)(转)
    修正iOS从照相机和相册中获取的图片方向(转)
    解决小米、红米及其他 Android 手机无法在 Mac 下进行真机调试的问题(转)
    mac os 禁止apache httpd自动启动(转)
    rethinkdb的dataexplorer查询使用
    中文 iOS/Mac 开发博客列表(转)
    mac上eclipse用gdb调试(转)
  • 原文地址:https://www.cnblogs.com/findumars/p/3297958.html
Copyright © 2011-2022 走看看