专栏首页Java小王子将内部类写为static的可以实现和外部类相同的调用方式
原创

将内部类写为static的可以实现和外部类相同的调用方式

将内部类写为static的可以实现和外部类相同的调用方式

public class StaticDispatch {

	abstract class Human {
	}

	class Man extends Human {
	}

	class Woman extends Human {
	}

	public void sayHello(Human guy) {
		System.out.println("hello,guy!");
	}

	public void sayHello(Man guy) {
		System.out.println("hello,gentleman!");
	}

	public void sayHello(Woman guy) {
		System.out.println("hello,lady!");
	}

	public static void main(String[] args) {
		StaticDispatch staticDispatch = new StaticDispatch();
		Human man = staticDispatch.new Man();
		Human woman = staticDispatch.new Woman();
		StaticDispatch sr = new StaticDispatch();
		sr.sayHello(man);
		sr.sayHello(woman);
	}
}

代码中刻意地定义了两个静态类型相同但实际类型不同的变量,但虚拟机(准确地说是编译器)在重载时是通过参数的静态类型而不是实际类型作为判定依据的。并且静态类型是编译期可知的,因此,在编译阶段,Javac编译器会根据参数的静态类型决定使用哪个重载版本,所以选择了sayHello(Human)作为调用目标,并把这个方法的符号引用写到main()方法里的两条invokevirtual指令的参数中。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 实现PHP内部的通知机制,如当一个类的属性发生变化时,另外一个类就可以收到通知设计模式:观察者模式使用场景参考链接

    设计模式:观察者模式 当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。 使用场景 一个事件发生后,要执行一连串更新操作。传统的编程方式,就是...

    Clive
  • Java 语言基础 (类和对象, 方法和封装, static 关键字和继承, 多态和特殊类)

    ReturnType methodName(DataType... args) {}

    RendaZhang
  • Java面试手册:核心基础-2

    4.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

    南风
  • Java面试手册:核心基础-2

    4.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

    南风
  • JAVA知识点总结篇(二)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    村雨遥
  • Java面向对象特性总结

    如果是对于面向过程来说,这些你都得知道。“吾生也有涯,而知也无涯”,面向对象的封装与庄子的思想遥相呼应:用有限的时间去做更适合的事情。

    Noneplus
  • java初级笔记----final、static、匿名对象、内部类

    一、final 1、final可以用来修饰类,方法,成员变量, 2、final修饰类不可以被继承,但是可以继承其他类。 3、final修饰的方法不可...

    曼路
  • Thinking in Java学习杂记(第7章)

    将一个方法调用同一个方法主体连接到一起就称为“绑定”(Binding)。若在程序运行以前执行绑定,就叫做“早期绑定”。而Java中绑定的所有方法都采用后期绑定技...

    范中豪
  • JavaSE(七)之内部类

    上一篇我们学习了接口还有访问控制,在以后的工作中接口是我们经常要碰到的,所以一定要多去回顾。接下来介绍一下内部类。很多时候我们创建类的对象的时候并不需要使用很多...

    用户1195962
  • 怎么一本正经地秀技

    修饰符怎么使用也是Java基础中比较重要的知识点,彻底理解了之后,后面学习更高深的东西才能得心应手。今天,以修饰符中比较常见的final为切入点,来谈谈fina...

    CodeVald
  • -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态

    面向对象把功能逻辑封装到类本身,用对象去调用功能 持有数据,结构更加自然,也更符合人们的思维习惯

    noteless
  • 【.Net vs Java? 】 看一看二者的类有多像?

    在Java中常用的是包(Package),较少提到NameSpace的概念。Java官方文档中这样说:

    FlyLolo
  • 【JAVA基础&高级】“面向对象篇” 知识点汇总

    由于近期需要用到基础以及底层的一些知识点,所以借此机会找来了一些学习的资料,用于对 JAVA 面向对象相关的知识点进行复盘、巩固,并且在此将一些重点的知识点做相...

    LCyee
  • Java学习笔记-全栈-Java基础-06-面向对象中的重点

    在类中使用static修饰一个代码块,会在创建类的时候执行。(相当于python对象中的init魔法方法)

    devi
  • JAVA入门学习四

    描述:有个这个关键字就是让有包的类对调用者可见,不用写全类名了; 比如我们前面在进行Scanner类示例化的对象来接收用户输入;

    WeiyiGeek
  • Kotlin学习笔记(四)-面向对象

    kotlin 中时没有static 这种方法修饰的静态方法 所以要实现 类似于java中的静态属性就要用到伴生对象 例子:

    g小志
  • 内部类, 静态内部类, 局部类, 匿名内部类的解析和区别

    众所周知,外部顶级类的类名需和类文件名相同,只能使用public和default。而内部类是指在外部类的内部再定义一个类,类名不需要和文件名相同。内部类可以是静...

    挨踢小子部落阁
  • java学习与应用(2)--面向对象

    java的为单继承、多级继承。父类有直接父类和间接父类。最上层为Object类。 类的继承使用extends关键字。public class Child ext...

    嘘、小点声
  • 赶在 520 之前给您来份 Java 的面向对象小抄

    大家好,我是多选参数的程序锅,一个正在 neng 操作系统、学数据结构和算法以及 Java 的硬核菜鸡。下面是本章的内容提纲:

    syy

扫码关注云+社区

领取腾讯云代金券