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
结论:
静态函数永远以当前对象名称的类为准,而不是类对象实体为准。
Java的同名属性、同名普通函数、同名静态函数,是否被覆盖的更多相关文章
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...
- C# 利用反射给不同类型对象同名属性赋值
public class ObjectReflection { public static PropertyInfo[] GetPropertyInfos(Type type) { return ty ...
- C# 不同类型对象同名属性赋值
/// <summary> /// 不同类型对象同名属性赋值 /// </summary> /// <typeparam name="S">源类 ...
- 将DataRow赋值给model中同名属性
/// <summary> /// 将DataRow赋值给model中同名属性 /// </summary> /// <typeparam name="T&qu ...
- JS中构造函数与原型对象的同名属性,实例会取哪一个
构造函数与原型对象的同名属性,实例会取哪一个? 看了下面的过程,再回忆JS高程3里关于这部分的示意图.实例my在new的时候,本身就获得了a属性,所以my.a是1,倘若在new的时候如果没有赋予a属性 ...
- Java 类、属性、方法修饰符 public、private、protected、default
Java 中修饰类修饰符:public .default (默认) Java 中修饰类中属性.方法修饰符:public.private.protected.default (默认) 通过 IDEA 创 ...
- 24、jQuery常用AJAX-API/Java调用MySQL / Oracle过程与函数
1)掌握jQuery常用AJAX-API 2)掌握Java调用MySQL / Oracle过程与函数 一)jQuery常用AJAX-API 目的:简化客户端与服务端进行局部刷新的异步通讯 (1)取 ...
- java-成员变量的属性与成员函数的覆盖
java中在多态的实现是通过类的继承或者接口的实现来完成的. 在类继承或者接口实现过程中就会涉及到成员属性以及成员函数的重写,需要注意的是,成员函数的重写是直接覆盖父类的(继承中),但是成员变量重写是 ...
- python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解
1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过google和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
随机推荐
- mysql jdbcTemplate访问
String sql = "select * from xxx_photo_info where user_id in (:userIds)"; userIds从dao传过来时必须 ...
- Python 爬虫十六式 - 第七式:正则的艺术
RE:用匹配来演绎编程的艺术 学习一时爽,一直学习一直爽 Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 pyquery 今天我们将迎来我们数据匹配部分的最后一位 ...
- 【BZOJ3876】 [Ahoi2014]支线剧情
Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...
- 关于viewpager的滑动问题
今天碰到很诡异的问题,viewpager中放置至少三张图片的时候能够正常实现循环滑动,只放置一张或者两张的时候就不行. 后来发现问题症结:viewpager需要保证既可以向左滑动,又可以向右滑动,因此 ...
- php 的路由简介 (一个简单的路由模式)
<?php $_SERVER['REQUEST_URI'] = '/post/edit/1024?foo=bar'; $uri = explode('/', parse_url($_SERVER ...
- 【转】UNITY中相机空间,投影空间的正向问题
原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...
- 【洛谷P2016战略游戏】
树形dp的经典例题 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的 ...
- 字符串在PHP比较运算中的变化
由于PHP的弱类型性质,你可以做一些奇怪的事情,其中一些是好的,其中一些将使你掉到坑里面去.比如: ; if ( $a == true && $b == false & ...
- 2、electron进程
electron核心我们可以分成2个部分,主进程和渲染进程. 主进程: 主进程连接着操作系统和渲染进程,可以把她看做页面和计算机沟通的桥梁. Electron 运行 package.json 的 ma ...
- Linux_LVM、RAID_RHEL7
目录 目录 LVM逻辑卷管理 把物理分区初始化为物理卷 创建卷组 建立逻辑卷 格式化 挂载 vg拓展操作 lv扩展操作 RAID RAID 类型 RAID0条带化 RAID1镜像 RAID5条带冗余 ...