`
yeshaoting
  • 浏览: 668524 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA多态与类型转化分析(域没有多态性)(转)

    博客分类:
  • J2SE
阅读更多

多态与类型转化原理分析:

一、多态性:超类(即基类或父类)引用在运行时既能代表超类本身的对象,也能代表其子类(即派生类)的对象的能力。
类的一个成员若想表现多态必须可以被覆盖:
对于成员变量而言,不会发生覆盖现象(会隐藏),在子类出现相同变量的定义时只会隐藏父类变量,因此不会表现多态。同时变量调用在编译时就会解析,不符合动态绑定的特征;
在成员方法中,静态方法和final方法(或private方法,理由:很多人说因为private方法默认是final的,但或者有疑问:请参http://blog.csdn.net/ZangXT/archive/2009/09/03/4514031.aspx)也不会发生覆盖现象(会隐藏),因此也不会表现多态性。
因此只有除静态方法和final方法以外的方法才会表现多态性。


二、向上类型转化时:
丢失添加的方法和字段,剩余的为:
基类字段
基类静态方法或final方法 //前二者为不能被覆盖的成员,因此保留,无多态性
基类其他方法(若被子类覆盖则为子类覆盖的新方法)

package test3;

class oopsuper {

static String str = "父类字段";

public void publicMethod(){System.out.println("父类public方法");}
protected void protectedMethod(){System.out.println("父类protected方法");}//(1)
private void privateMethod(){System.out.println("父类private方法");}
static void staticMethod(){System.out.println("父类静态方法"); }
}

public class oopsub extends oopsuper {

String str = "子类字段";

public void publicMethod(){System.out.println("子类public方法");}
protected void protectedMethod(){System.out.println("子类protected方法");}//(2)
private void privateMethod(){System.out.println("子类private方法");}
static void staticMethod(){System.out.println("子类静态方法"); }

public static void main(String[] args) {

oopsuper upcast = new oopsub();

System.out.println(upcast.str);//方法调用才具有多态性,而域没有多态性

// 能被覆盖的方法的行为才有多态特性
upcast.publicMethod();
upcast.protectedMethod();

// 不能被覆盖的方法[final方法(含私有方法)、静态方法]的行为不具有多态特性
// upcast.privateMethod();访问的是父类的私有方法,不能访问,不具有多态现象
upcast.staticMethod();
}
}

  

ps:关于JVM的内存机制介绍,请参见http://wenku.baidu.com/view/69d80ca1b0717fd5360cdc23.html

关于父类subobject:这东西很让人头疼,请参见《深度探索C++对象模型》

英文好的请参见http://www.csci.csusb.edu/dick/c++std/cd2/derived.html

 

本文来自: http://hi.baidu.com/zhonghuage/blog/item/87b5c4eadd9c87ded539c905.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics