SCJP多态题二
来源: 互联网 发布时间:2015-03-25
本文导语: 这是另外一道,还是要请各位高手详细给说说,谢谢了 public class Poly { public static void main(String args[]) { PolyA ref1 = new PolyC(); PolyB ref2 = (PolyB)ref1; ...
这是另外一道,还是要请各位高手详细给说说,谢谢了
public class Poly
{
public static void main(String args[])
{
PolyA ref1 = new PolyC();
PolyB ref2 = (PolyB)ref1;
System.out.println(ref2.g());
// This prints 1
// If f() is not private in PolyB, then prints 2
}
}
class PolyA
{
private int f()
{
return 0;
}
public int g()
{
return 3;
}
}
class PolyB extends PolyA
{
private int f()
{
return 1;
}
public int g()
{
return f();
}
}
class PolyC extends PolyB
{
public int f()
{
return 2;
}
}
public class Poly
{
public static void main(String args[])
{
PolyA ref1 = new PolyC();
PolyB ref2 = (PolyB)ref1;
System.out.println(ref2.g());
// This prints 1
// If f() is not private in PolyB, then prints 2
}
}
class PolyA
{
private int f()
{
return 0;
}
public int g()
{
return 3;
}
}
class PolyB extends PolyA
{
private int f()
{
return 1;
}
public int g()
{
return f();
}
}
class PolyC extends PolyB
{
public int f()
{
return 2;
}
}
|
有理有理!哈哈哈哈哈 我叙述一下,大家看对不对,嘻嘻
- private方法不能被override
- static方法可以被override
- 但是这种对于static方法的override不能被“多态式后期绑定”(所以也就部份
失去了override对于OO多态的意义)
例子如下:
- private方法不能被override
class Father{
private void m0() throws java.io.IOException {}
}
class Son extends Father{
void m0() throws java.lang.Exception {}
}
这是可以编译的(注意这里子类掷出了“更宽”的异常,但是通过了编译)
所以可以等效地认为这时子类中的m0()没有override父类中的m0()。
- static方法可以被override
class Father{
static void m1() throws java.io.IOException {}
}
class Son extends Father{
static void m1() throws java.lang.Exception {}
}
是不能编译的:出错提示“mi() in Son cannot override m1() in Father。。。”
- 但是这种对于static方法的override不能被“多态式后期绑定”(所以也就部份
失去了override对于OO多态的意义)
class Father{
static void m1(){
System.out.println("Father");
}
}
class Son extends Father{
static void m1(){
System.out.println("Son");
}
}
public class Test {
public static void main(String[] args){
Father.m1();
Son.m1();
Son x = new Son();
((Father)x).m1();
((Son)x).m1();
}
}
输出:
Father
Son
Father
Son
这个结果说明:static方法可以被override,但不能被“多态式后期绑定”,所以也就
部份失去了override对于OO多态的意义。因为override在OO中的一个重要作用就是支持
多态。也可以这样认为:Java中的static方法在被override时不支持OO多态。
- private方法不能被override
- static方法可以被override
- 但是这种对于static方法的override不能被“多态式后期绑定”(所以也就部份
失去了override对于OO多态的意义)
例子如下:
- private方法不能被override
class Father{
private void m0() throws java.io.IOException {}
}
class Son extends Father{
void m0() throws java.lang.Exception {}
}
这是可以编译的(注意这里子类掷出了“更宽”的异常,但是通过了编译)
所以可以等效地认为这时子类中的m0()没有override父类中的m0()。
- static方法可以被override
class Father{
static void m1() throws java.io.IOException {}
}
class Son extends Father{
static void m1() throws java.lang.Exception {}
}
是不能编译的:出错提示“mi() in Son cannot override m1() in Father。。。”
- 但是这种对于static方法的override不能被“多态式后期绑定”(所以也就部份
失去了override对于OO多态的意义)
class Father{
static void m1(){
System.out.println("Father");
}
}
class Son extends Father{
static void m1(){
System.out.println("Son");
}
}
public class Test {
public static void main(String[] args){
Father.m1();
Son.m1();
Son x = new Son();
((Father)x).m1();
((Son)x).m1();
}
}
输出:
Father
Son
Father
Son
这个结果说明:static方法可以被override,但不能被“多态式后期绑定”,所以也就
部份失去了override对于OO多态的意义。因为override在OO中的一个重要作用就是支持
多态。也可以这样认为:Java中的static方法在被override时不支持OO多态。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。