作者按:虚拟函数的概念早就滚瓜烂熟了。但是今天面试发现: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
结论:
静态函数永远以当前对象名称的类为准,而不是类对象实体为准。

Java的同名属性、同名普通函数、同名静态函数,是否被覆盖的更多相关文章

  1. C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)

    4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...

  2. C# 利用反射给不同类型对象同名属性赋值

    public class ObjectReflection { public static PropertyInfo[] GetPropertyInfos(Type type) { return ty ...

  3. C# 不同类型对象同名属性赋值

    /// <summary> /// 不同类型对象同名属性赋值 /// </summary> /// <typeparam name="S">源类 ...

  4. 将DataRow赋值给model中同名属性

    /// <summary> /// 将DataRow赋值给model中同名属性 /// </summary> /// <typeparam name="T&qu ...

  5. JS中构造函数与原型对象的同名属性,实例会取哪一个

    构造函数与原型对象的同名属性,实例会取哪一个? 看了下面的过程,再回忆JS高程3里关于这部分的示意图.实例my在new的时候,本身就获得了a属性,所以my.a是1,倘若在new的时候如果没有赋予a属性 ...

  6. Java 类、属性、方法修饰符 public、private、protected、default

    Java 中修饰类修饰符:public .default (默认) Java 中修饰类中属性.方法修饰符:public.private.protected.default (默认) 通过 IDEA 创 ...

  7. 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数

      1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...

  8. java-成员变量的属性与成员函数的覆盖

    java中在多态的实现是通过类的继承或者接口的实现来完成的. 在类继承或者接口实现过程中就会涉及到成员属性以及成员函数的重写,需要注意的是,成员函数的重写是直接覆盖父类的(继承中),但是成员变量重写是 ...

  9. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

     1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...

随机推荐

  1. BZOJ 4517: [Sdoi2016]排列计数 错排 + 组合

    从 $n$ 个数中选 $m$ 个不错排,那就是说 $n-m$ 个数是错排的. 用组合数乘一下就好了. Code: #include <cstdio> #include <algori ...

  2. 详解cocos2dx 3.0的release版本在android平台的签名过程

    当您的游戏准备发布前,需要编译成为release版本,命令中需要增加 -m release,编译命令如下: cocos compile -p android -m release 在编译结束后,生成x ...

  3. es之对文档进行更新操作

    5.7.1:更新整个文档 ES中并不存在所谓的更新操作,而是用新文档替换旧文档: 在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档并建立索引.旧版本文档不会立即消失 ,但 ...

  4. HBase 集群监控系统构建

    HBase 集群监控系统构建 标签(空格分隔): Hbase 一, 集群为什么需要监控系统 总的来说是为了保证系统的稳定性,可靠性,可运维性.具体来说我认为有以下几点: 掌控集群的核心性能指标,了解集 ...

  5. sqli-lab(8)

    布尔型单引号GET盲注 发现加个单引号跟没加显示不一样,加了单引号连you are in都不显示了,没有报错,所以只能用盲注判断了 0X01爱之先了解 盲注需要掌握一些MySQL的相关函数:lengt ...

  6. Http协议:客户端提交数据给服务端和从服务端获得数据,像WebView也是向百度的服务端发出一条Http请求,服务端返回HTML页面,客户端(浏览器)解析后展示出页面

    提交数据和获得数据的方式有很多,这里介绍一种,使用HttpURLConnection来向服务器提交数据或者获得数据. 获得数据: //传入网址,获得请求网页数据(XML文件数据或JSON文件数据) p ...

  7. leetcode 回文二叉树

    C++最简单的方法,遍历存在vector<int> ivec容器中,然后头尾对应比较 O(n)时间,O(n)空间 /** * Definition for singly-linked li ...

  8. 测试-修补程序-Hotfix:百科

    ylbtech-测试-修补程序-Hotfix:百科 1.返回顶部 1. Hotfix是微软公司研发的一个程序,针对某一个具体的系统漏洞或安全问题而发布的专门解决该漏洞或安全问题,通常称为修补程序.   ...

  9. jpa多表leftjoin 查询,自定义返回结果

    sql代码 自定义返回结果 package com.cdp.ecosaas.coredb.uua.sync.vo; import java.io.Serializable; public class ...

  10. WPF DevExpress Chart控件多Y轴,指定数据参考的Y轴

    当Chart中有两个及以上的Y轴时,我们就要指明图表中的柱子或折线对应的是哪个Y轴了,这时候需要指明柱子或者折线的dxc:XYDiagram2D.SeriesAxisY属性,来设置对应的Y轴(dxc: ...