Java多态与类型转化分析

发表于:2011-9-09 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:jiafu1115    来源:51Testing软件测试网采编

  对于成员变量而言,不会发生覆盖现象(会隐藏),在子类出现相同变量的定义时只会隐藏父类变量,因此不会表现多态。同时变量调用在编译时就会解析……

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

  一、多态性:超类引用在运行时既能代表超类本身的对象,也能代表其子类的对象的能力。

  类的一个成员若想表现多态必须可以被覆盖:

  对于成员变量而言,不会发生覆盖现象(会隐藏),在子类出现相同变量的定义时只会隐藏父类变量,因此不会表现多态。同时变量调用在编译时就会解析,不符合动态绑定的特征;

  在成员方法中,静态方法和final方法(private方法)也不会发生覆盖现象(会隐藏),因此也不会表现多态性。

  因此只有除静态方法和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();//若注释掉(1)则有错误;若注释掉(2)则输出:子类protected方法
  // 不能被覆盖的方法[final方法(含私有方法)、静态方法]的行为不具有多态特性
  // upcast.privateMethod();访问的是父类的私有方法,不能访问,不具有多态现象
  upcast.staticMethod();
  }
  }

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号