作者按:虚拟函数的概念早就滚瓜烂熟了。但是今天面试发现: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. docker小知识

    1,docker 使用普通用户 添加用户组: sudo groupadd docker 加入docker 组 sudo gpasswd -a ${USER} docker 或 usermod -aG ...

  2. 手写ORM

    利用ORM把mysql中的数据封装成对象,通过对象点语法来获取mysql中的数据,所以自己手写一个ORM,方便我们操作数据 一.ORM:对象关系映射 类 >>> 数据库的一张表 对象 ...

  3. week4 作业

    week4 作业 1.定义一个对所有用户都生效的命令别名,例如:lftps='lftp 172.168.0.1 /pub' 在 ~/.bashrc中添加命令: alias = 'rm -i' 2.显示 ...

  4. 采用.bat批处理命令快速设置Java环境变量

    背景: java课程培训,每次到机房需要重新安装JDK,每次都采用图形界面进行操作比较麻烦(慢),于是在网上查了一下CMD命令设置系统环境变量的方法,再次记录下来. 设置方法: 1.找到JDK安装路径 ...

  5. 模板引擎ejs的include方法

    html无法include header.ejs footer.ejs 最后用 user.ejs在首尾include

  6. spring boot: Whitelabel Error Page的解决方案

    http://blog.csdn.net/u014788227/article/details/53670112

  7. 如何在maven项目中引用领一个项目

    1 有两个项目 maven01  和maven 02,想在maven 02中引用maven01的方法,该如何操作呢 maven01中Factory类中的方法 public class Factory ...

  8. python 整数转字节 char

    把10进制整数30,转换为字节 方法一 chr(30).encode() 结果 方法二 struct.pack('B', 30) 结果 准确地讲,Python没有专门处理字节的数据类型.但由于str既 ...

  9. 【flask_sqlalchemy】动态CURD类

    环境: flask_sqlalchemy mysql from app import db class Curd(object): def __init__(self,modelName): self ...

  10. 2018 icpc 沈阳

    https://codeforces.com/gym/101955 J 签到 #include<iostream> #include<cstring> #include< ...