Java的同名属性、同名普通函数、同名静态函数,是否被覆盖
来源:互联网 发布:js图片放大弹出效果 编辑:程序博客网 时间:2024/04/30 01:29
作者按:虚拟函数的概念早就滚瓜烂熟了。但是今天面试发现: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);
}
}
输出:
in A: 1
in A: 2.1
in B: 1
in A: 2.1
in B: 1
in A: 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的同名属性、同名普通函数、同名静态函数,是否被覆盖
- 同名Cookie是可以被覆盖的
- 关于如何在派生类的虚函数中调用被覆盖掉的同名基类的虚函数
- 同名函数的调用问题
- JavaScript同名函数的调用
- js中同名函数和同名变量的执行问题
- c 处理同名函数
- javascript 中的同名函数
- JS同名函数加载
- 同名函数覆盖
- 函数的同名变量实现可变函数
- Java 继承接口同名函数问题
- 警惕:函数同名引起的问题
- 用字符串调用同名的函数
- x264中同名的宏和函数
- 多重继承(不同的父类中有同名函数)
- 函数的参量不能和变量同名
- 类的同名覆盖和函数重载
- 初识JS作用域
- 如何快速看懂一个Android项目
- ubuntu16.04 jdk环境变量配置和安装android studio
- bzoj 1030: [JSOI2007]文本生成器
- 大数相乘
- Java的同名属性、同名普通函数、同名静态函数,是否被覆盖
- 从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)
- 欢迎使用CSDN-markdown编辑器
- 数据库的隔离级别介绍
- Activity的使用
- 递归
- 设计模式六大原则简单介绍
- C++实现动态多维数组
- 【day0404】C++ main命令行选项