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和阅读源码,现将自己的理解和心得记录下来,也为正在为了该问题 ...
随机推荐
- maven项目解决pom.xml头部 http://maven.apache.org/xsd/maven-4.0.0.xsd报错的问题
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36611526/article/d ...
- 上传200G文件
最近遇见一个需要上传百G大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- win7如何设置以管理员身份运行
一.对所有程序以管理员身份运行 1.右键单击桌面“计算机”,选择“管理” 2.在页面左侧,依此打开“计算机管理(本地)→ 系统工具→本地用户和组→用户”,在右侧找到“Administrator”,双击 ...
- ASP.NET MVC Ajax下载文件(使用NPOI向现有的excel模板文件里面添加数据)
View Html.DevExpress().Button(DevExpressButtonHelper.AddButton(ViewBag.Form, "Export", &qu ...
- navicat安装与激活
原文网址:https://www.jianshu.com/p/5f693b4c9468?mType=Group 一.Navicat Premium 12下载 Navicat Premium 12是一套 ...
- Window7下安装Eclipse C/C++ Developer
觉得自己写这个是有点脑残的.哈哈. 毕业之后,看的多的是Java.大多忘记C和C++的东西.虽说大学第一门计算机语言就是学的C.惭愧. 重温一下C的知识. 正题: 1.在Windows下安装Eclip ...
- HDU1429--胜利大逃亡(续)(BFS+状态压缩)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- sqli--labs(25)
过滤了 or and 的get注入 0X01测试阶段 ’报错 ” 不报错 那么就是'闭合 好的我们知道闭合后来#闭合后面 ?id= 语法不正确 发现过滤了 or and 那么我们继续构造 ?id= 0 ...
- PTA编程总结三
7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块 ...
- AI工程师职业规划和学习路线完整版
AI工程师职业规划和学习路线完整版 如何成为一名机器学习算法工程师 成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能 力,这些能力中的每一项掌握起来都需要足够的努力 ...