JAVA语言编程开发分派问题解析
小标 2018-10-12 来源 : 阅读 1183 评论 0

摘要:本文主要向大家介绍了JAVA语言编程开发分派问题解析,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言编程开发分派问题解析,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


多态


多态是面向对象的重要特征之一,多态主要体现在重写和重载上的。


分派涉及到的概念


变量被声明时的类型叫做变量的静态类型(Static Type) 又叫明显类型(Apparent Type)。 变量所引用的对象的真实类型又叫做变量的实际类型(Actual Type)。 根据对象的类型而对方法进行的选择,就是分派(Dispatch)。

根据分派发生的时期,可以将分派分为两种,即分派分静态分派和动态分派。


静态分派(Static Dispatch)发生在编译时期,分派根据静态类型信息发生。方法重载(Overload)就是静态分派。(所谓的:编译时多态) 动态分派(Dynamic Dispatch)发生在运行时期,动态分派动态地置换掉某个方法。面向对象的语言利用动态分派来实现方法置换产生的多态性。(所谓的:运行时多态)

基于静态分配的例子


  public static void main(String[] args) {

Human h = new Human(); 

h.sayHello(h);

Human m = new Man(); 

h.sayHello(m);

Human w = new Woman(); 

h.sayHello(w);

 

/*

 * Human称为变量的静态类型,或者叫做外观类型,

 * 后面的Man被称为变量的实际类型。 方法的重载

 * 是通过参数的静态类型作为判断的 ,并且静态类

 * 型是编译器可知的,因此在编译阶段编译器会根

 * 据参数的静态类型决定使用哪个重载版本。

 */

 

/*

 * 依赖静态类型来定位方法执行版本的分派动作称为静态

 * 分派。静态分派的典型应用就是方法重载。

 * 

 */

 

/*

 * 另一个问题,是编译器虽然能确定出

 * 方法的重载版本,但是在很多情况下

 * 这个重载版本并不是唯一的,只能确

 * 定一个更加合适的版本。例如,重载

 * 的方法中,参数列表除了参数类型不

 * 一样,其他都一样,例接收的参数有ch

 * ar\int\long等,传入参数‘a’,则会调用

 * 需要char类型参数的方法,去掉需要char类型

 * 参数的方法,则会调用需要int类型参数的方

 * 法。这时发生了一次自动类型转换。同样,去掉需要

 * int类型参数的方法,则会调用需要long类

 * 型参数的方法。这里再次发生类型转换,会按照

 * char->int->long->float->double转换类型。

 * 

 */

 

  }

  public void sayHello(Human h) {

System.out.println("Human");

  }

  public void sayHello(Man m) {

System.out.println("man");

  }

  public void sayHello(Woman w) {

System.out.println("woman");

}

}

 class Man extends Human{

}

 class Woman extends Human{

}

   


基于动态分派的例子


这里写代码片public class Human1 {

public static void main(String[] args) {

  Human1 h1 = new Human1();

  h1.say();

  Human1 h2 = new Woman1();

  h2.say();

  Human1 h3 = new Man1();

  h3.say();

 

  /*

* 动态分派和重写联系密切

* Java是通过变量的实际类型在运行期确定执行哪个版本 。

* 上面3个变量的实际类型不同,会调用各自的方法。

*/

  }

 

public void say() {

 System.out.println("human");

}

}

 

class Man1 extends Human1{

 @Override

 public void say() {

  // TODO Auto-generated method stub

  System.out.println("man");

 }

}

 

class Woman1 extends Human1{

 @Override

 public void say() {

  // TODO Auto-generated method stub

  System.out.println("woman");

 }

 

}

   


基于动态分配的在接口中也同样适用:


public interface Tech {

 void tech();

}


public class  TechMath implements Tech{

 @Override

 public void tech() {

  // TODO Auto-generated method stub

  System.out.println("我教数学");

 }

}


public class TechChinese implements Tech{

 @Override

 public void tech() {

  // TODO Auto-generated method stub

  System.out.println("我是教语文");

 }

 public static void main(String[] args) {

Tech t = new TechChinese();

t.tech();

Tech t1 = new TechMath();

t1.tech();

 }

}

   


面试题


最后看一个例子:


public class Test276 {

  public static void main(String[] args) {

 Collection<!--?-->[] collections = {new HashSet<string>(),new ArrayList<string>(),new HashMap<string,string>().values()};

 Super s = new sub();

 for(Collection<!--?--> c:collections) {

  System.out.println(s.getType(c));

 }

  }

 

  abstract static class Super{

public static String getType(Collection<!--?--> c) {

 return "super collection";

}

 

public static String getType(List<!--?--> c) {

 return "super list";

}

 

public static String getType(ArrayList<!--?--> c) {

 return "super arraylist";

}

 

public static String getType(Set<!--?--> c) {

 return "super set";

}

public static String getType(HashSet<!--?--> c) {

 return "super hashset";

}

 

  }

  static class sub extends Super{

public static String getType(Collection<!--?--> collection) {

 return "Sub"; }

}

}</string,string></string></string>

   


执行结果:super collection 打印3次


本例中,如果去掉static,那么本例就是打印子类的方法。如果子类参数类型不符合,就往父类找,就近找,父类找不到,就报错。


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved