多态是面向对象的三大特征之一

谈到多态,不得不提的就是,多态中的成员绑定问题.

方法绑定

将一个方法调用同一个方法主体关联起来被称为绑定.若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定.在运行时根据对象的类型进行绑定,称为后期绑定,也称为动态绑定或者运行时绑定.

Java中除了static方法和final方法(private方法属于final方法)之外,其他所有的方法都是后期绑定.

public class Shape {

public void draw() {

System.out.println("Shape draw.");

}

public void erase() {

System.out.println("Shape erase");

}

}

public class Circle extends Shape {

public void draw() {

System.out.println("Circle draw.");

}

public void erase() {

System.out.println("Circle erase.");

}

}

public class Shapes {

public static void main(String[] args) {

Shape shape = new Circle();

shape.draw();

}

}

//output

Circle draw.

缺陷:"覆盖"私有方法

public class PrivateOverride {

private void f(){

System.out.println("private f()");

}

public static void main(String[] args){

PrivateOverride privateOverride = new Derived();

privateOverride.f();

}

}

class Derived extends PrivateOverride{

public void f(){

System.out.println("public f()");

}

}

//output

private f()

我们期望的输出是public f(),但是由于private方法被自动认为是final方法,而且对导出类(子类)是屏蔽的.因此,在这种情况下,Derived类中的f()方法就是一个全新的方法,既然基类中的f()方法在子类Derived中不可见,因此甚至也不能被重载.

缺陷:域与静态方法

如果你直接访问某个域,这个访问就将在编译期进行解析,就像下面的示例所演示的:

class Super {

public int field = 0;

public int getField() {

return field;

}

}

class Sub extends Super {

public int field = 1;

public int getField() {

return field;

}

public int getSuperField() {

return super.field;

}

}

public class FieldAccess {

public static void main(String[] args) {

Super sup = new Sub();

System.out.println("sup.field = " + sup.field + ", sup.getField() = " + sup.getField());

Sub sub = new Sub();

System.out.println("sub.field = " + sub.field + ", sub.getField() = " + sub.getField());

System.out.println("sub.getSuperField() = " + sub.getSuperField());

}

}

//output

sup.field = 0, sup.getField() = 1

sub.field = 1, sub.getField() = 1

sub.getSuperField() = 0

当Sub对象转型为Super引用时,任何域访问操作都将由编译器解析,因此不是多态的.在本例中,为Super.field和Sub.field分配了不同的存储空间.这样,Sub实际上包含了两个称为field的域:它自己的和它从Super处得到的.然而,在引用Sub中的field时产生的默认域并非Super版本的field域.

如果某个方法是静态的,它的行为就不具有多态性:

class StaticSuper {

public static String staticGet() {

return "Base staticGet()";

}

public String dynamicGet() {

return "Base dynamicGet()";

}

}

class StaticSub extends StaticSuper {

public static String staticGet() {

return "Derived staticGet()";

}

public String dynamicGet() {

return "Derived dynamicGet()";

}

}

public class StaticPolymorphism {

public static void main(String[] args) {

StaticSuper sup = new StaticSub();

System.out.println(sup.staticGet());

System.out.println(sup.dynamicGet());

}

}

//outp

Base staticGet()

Derived dynamicGet()

java什么是成员域成员方法,java多态中的成员绑定相关推荐

  1. c语言中 间接成员选择运算符,c语言中-(间接成员运算符)的含义

    写于2016年12月12日. "->"称为间接成员运算符. 总体注解:这个运算符与指向结构(sturct)或联合(union)的指针一起使用,用来指明结构或联合的的成员.假设 ...

  2. JAVA显示子类num值_JavaSE8基础 子类中的成员变量与父类重名 简单示例

    os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0) 代码: //基类 class Person ...

  3. java 读取pdf签名域_Java 获取PDF中的数字签名信息

    本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人.签名位置.日期.原因.联系方式.签名在文档中的坐标等等. 程序环境包括: Jdk 1.8.0(版本要求>=1.6.0版本即可 ...

  4. python中的成员运算符_在Python中使用成员运算符的示例

    下表列出了所有python语言支持的成员运算符. 例如: 试试下面的例子就明白了所有的python编程语言提供会员运算符: #!/usr/bin/python a = 10 b = 20 list = ...

  5. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例...

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第三个特征,何谓多态 ...

  6. 【Java SE】面向对象三大特性之多态

    何为多态? 多态,通俗一点说就是在完成某一个行为的时候,不同的对象会产生不同的形态. 比如说:打印机在完成打印行为的时候,可以根据不同的对象打印不同的类型,有黑白,有彩色等等,打印的结果是不一样的. ...

  7. Java相关课程系列笔记之一Java学习笔记

    目 录 一. Java技术基础 1 1.1编程语言 1 1.2 Java的特点 1 1.3 Java开发环境 1 1.4 Java开发环境配置 2 1.5 Linux命令与相关知识 2 1.6 Ecl ...

  8. c语言的结构体能存放函数吗,在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  9. 第三次学JAVA再学不好就吃翔(part34)--多态的成员访问

    学习笔记,仅供参考 文章目录 面向对象 多态 多态概述 多态的成员访问 成员变量 成员方法 静态成员方法 面向对象 多态 多态概述 多态的概述 事物存在的多种形态 多态实现的前提 要有继承关系 要有方 ...

最新文章

  1. MapReduce天气案例
  2. How to become an expert in the IP industry? Here is where you should start
  3. tensorflow:Multiple GPUs
  4. python自定义colorbar_python可视化 matplotlib画图使用colorbar工具自定义颜色
  5. ftp 断点续传 Android,Android使用FTP实现断点续传
  6. sprintf_s与_snprintf与_snprintf_s
  7. 1910140408安装win版
  8. 原型图和设计常犯错误,导致前端页面返工
  9. 大型企业网络配置系列课程详解(八) --VoIP的配置与相关概念的理解
  10. JAVA安装报1620错误_java安装错误1620
  11. .net函数查询_用python实现多文档查询
  12. crash工具解析_crash工具和x86-64汇编基础
  13. 格式要求_课题论文的格式要求
  14. synchronized工作原理剖析(二)
  15. Paxos算法原理与推导
  16. 史上最全:Mac搭建Airtest IDE +IOS 测试环境
  17. Copy ‘XXXX‘ to effectively final temp variable
  18. GCC中的编译选项“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
  19. 深入浅出实时数据库12.8日版
  20. win10无线网卡(该设备无法启动,代码10)

热门文章

  1. 利用逻辑回归进行简单的人群分类解决广告推荐问题
  2. WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED解决方法
  3. Adobe Flash player 10 提示:Error#2044:未处理的IOErrorEvent. text=Error#2036:加载未完成 的解决方法
  4. JUnit报initializationError的解决方法
  5. Ajax跨域请求action方法,无法传递及接收cookie信息(应用于系统登录认证及退出)解决方案
  6. Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
  7. jQuery针对多个元素的相同点击事件
  8. 禁用Chrome缓存进行网站开发
  9. JavaScript中的HTTP GET请求?
  10. 吴恩达朋友圈宣布“喜讯”:AI专家王冬岩加入Landing AI...