多态与方法调用

1 多态(ploymorphism)指一个程序中相同的名字表示不同的含义的情况

1.1 编译时多态:函数重载(overload),多个同名的不同方法

e.g.  p.sayhallo()   p.sayhallo("wang")

1.2 运行时多态

  • 覆盖(override):子类对父类方法的覆盖
  • 动态绑定:---即虚方法调用
  • 调用时程序会根据context自动正确的决定调用子类对象的方法

2 方法调用

注意:上溯造型(upcasting)----把派生类型当做基本类型处理

2.1 虚方法调用----可以实现运行时的多态

  • 子类重载了父类的方法
  • 运行时,系统根据调用该方法的实际类型来决定选择调用哪个方法
  • 所有非final的方法调用时都会自动选择动态绑定(dynamic binding)

2.2 instanceOf

if(实例名  instanceOf 类型名)

public class DrawShape {
    public static void main(String[] arg){
        Shape t = new Triangle();
        Shape r = new Rectangle();
        Shape q = new Quadrangle();
        drawStuff(t);
        drawStuff(r);
        drawStuff(q);

    }

    static void drawStuff(Shape shape){
        shape.draw();
    }
}

 class  Shape{
    public  void draw(){
        System.out.println("Draw a shape;");
    };
}

class Triangle extends Shape{
    public void draw(){
        System.out.println("Draw a triangle;");
    }
}

class Rectangle extends Shape{
    public void draw(){
        System.out.println("Draw a Rectangle;");
    }
}

class Quadrangle extends Shape{
    public void draw(){
        System.out.println("Draw a Quadrangle;");
    }
}

2.3 三种非虚方法调用

  • static方法,以申明的类型为准,与实例无关
  • private方法,子类看不见,也不会被虚化
  • final方法,子类不能够覆盖,不存在虚化问题
时间: 2024-10-21 23:48:09

多态与方法调用的相关文章

多态方法调用的解析和分派

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作,Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在类加载期间,甚至到运行期间才能确定目标方法

JVM方法调用

当我们站在JVM实现的角度去看方法调用的时候,我们自然会想到一种分类: 1.编译代码的时候就知道是哪个方法,永远不会产生歧义,例如静态方法,private方法,构造方法,super方法. 2.运行时才能确定是哪个方法,这也正是多态的实现原理. 对于第一种方法的调用,有2个字节码指令:invokestatic,invokespecial invokestatic:调用static方法(不需要通过类的实例就可以调用),这很好理解.静态方法属于整个类型,就一份,没有歧义. invokespecial:

java多态/重载方法——一个疑难代码引发的讨论

直接上代码,看这个代码发现自己的基础有多差了.参考 http://www.cnblogs.com/lyp3314/archive/2013/01/26/2877205.html和http://hxraid.iteye.com/blog/428891 以及 <深入Java虚拟机> 这个问题是java获取动态绑定最终的方法?涉及的知识有继承.多态.重载.方法调用的整合. public class Poly { public static void main(String[] args) { A a

练习目标:继承、多态、方法的重写。

练习目标:继承.多态.方法的重写. 在本练习中,将在银行项目中创建Account的两个子类:SavingAccount 和 CheckingAccount. 创建 Account类的两个子类:SavingAccount(存款账户) 和 CheckingAccount(透支账户)子类 1.修改Account类:将balance属性的访问方式改为protected2.创建 SavingAccount 类,该类继承Account类3.该类必须包含一个类型为double的interestRate(利率)

深入理解Java虚拟机笔记---方法调用

方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程.在程序运行时,进行方法调用是最普遍.最频繁的操作.在Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用).这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法的调用过程变得相对复杂,需要在类加载期间甚至到运行期间才能确定目标方法的直接引用.

java虚拟机之方法调用(上)

前言 我们都知道,面象对象的几大特性:封装,继承,多态. 其实在面试过程中也是经常被问到这个问题的.那么问题来了,java虚拟机是如何实现多态的? 其实在java虚拟机中,说到多态的实现,就不得不说说方法调用了. 方法调用概念 方法调用并不等于方法执行,方法调用阶段唯一的任务是确定被调用方法的版本(其实就是调用哪一个方法).我们都知道,Class文件的编译过程中不包含c语言编译中的连接步骤,一切方法调用在Class文件里面都是符号引用,并不是java运行时的入口地址(这里也侧面印证了上一篇文章里

关于JVM中方法调用的相关指令,以及解析(Resolution)和分派(Dispatch)的解释——重载的实现原理与重写的实现原理

JVM中相关方法的调用的指令 invokestatic 调用静态方法. invokespecial 用于调用构造器方法<init>.私有方法.父类方法. invokevirtual 用于调用类的所有虚方法. invokeinterface 用于调用接口方法. 解析(resolution)与分派(dispatch) 解析 解析调用一定是个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变 为可确定的直接引用,不会延迟到运行期再去完成. 下面我们看一段代码: /**

面向对象解释,命名习惯,方法调用丶覆盖

面向对象:面向过程: 程序设计,软件开发解决的本质问题?就是抽象. 抽象需要抽象什么? (数据,业务逻辑) 以什么抽象作为导向(面向)?  面向对象:以数据抽象为导向  面向过程:以业务逻辑抽象为导向 类: 1,静态属性 --属性 2,动态行为 --方法  属性,方法 统称为类的成员  --方法  1,修饰符 返回值类型 方法名 (形参表){    方法体 } public void move(){  System.out.println(name +"Moving"); }  pub

深入理解多态与方法的绑定

话不多说,先上源码 public class olymorphism { public static void main(String[] args) { Shap circle = new Circle(); Painter painter = new Painter(); painter.paint(circle); } } class Shap{ void draw(){ System.out.println("shap.draw()"); } } class Circle ex