java 同名函数_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

结论:

静态函数永远以当前对象名称的类为准,而不是类对象实体为准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值