java什么是成员域成员方法,java多态中的成员绑定
多态是面向对象的三大特征之一
谈到多态,不得不提的就是,多态中的成员绑定问题.
方法绑定
将一个方法调用同一个方法主体关联起来被称为绑定.若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定.在运行时根据对象的类型进行绑定,称为后期绑定,也称为动态绑定或者运行时绑定.
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多态中的成员绑定相关推荐
- c语言中 间接成员选择运算符,c语言中-(间接成员运算符)的含义
写于2016年12月12日. "->"称为间接成员运算符. 总体注解:这个运算符与指向结构(sturct)或联合(union)的指针一起使用,用来指明结构或联合的的成员.假设 ...
- JAVA显示子类num值_JavaSE8基础 子类中的成员变量与父类重名 简单示例
os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0) 代码: //基类 class Person ...
- java 读取pdf签名域_Java 获取PDF中的数字签名信息
本文以Java代码演示如何获取PDF文档中的数字签名信息,包括签名人.签名位置.日期.原因.联系方式.签名在文档中的坐标等等. 程序环境包括: Jdk 1.8.0(版本要求>=1.6.0版本即可 ...
- python中的成员运算符_在Python中使用成员运算符的示例
下表列出了所有python语言支持的成员运算符. 例如: 试试下面的例子就明白了所有的python编程语言提供会员运算符: #!/usr/bin/python a = 10 b = 20 list = ...
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例...
JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第三个特征,何谓多态 ...
- 【Java SE】面向对象三大特性之多态
何为多态? 多态,通俗一点说就是在完成某一个行为的时候,不同的对象会产生不同的形态. 比如说:打印机在完成打印行为的时候,可以根据不同的对象打印不同的类型,有黑白,有彩色等等,打印的结果是不一样的. ...
- 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 ...
- c语言的结构体能存放函数吗,在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
- 第三次学JAVA再学不好就吃翔(part34)--多态的成员访问
学习笔记,仅供参考 文章目录 面向对象 多态 多态概述 多态的成员访问 成员变量 成员方法 静态成员方法 面向对象 多态 多态概述 多态的概述 事物存在的多种形态 多态实现的前提 要有继承关系 要有方 ...
最新文章
- MapReduce天气案例
- How to become an expert in the IP industry? Here is where you should start
- tensorflow:Multiple GPUs
- python自定义colorbar_python可视化 matplotlib画图使用colorbar工具自定义颜色
- ftp 断点续传 Android,Android使用FTP实现断点续传
- sprintf_s与_snprintf与_snprintf_s
- 1910140408安装win版
- 原型图和设计常犯错误,导致前端页面返工
- 大型企业网络配置系列课程详解(八) --VoIP的配置与相关概念的理解
- JAVA安装报1620错误_java安装错误1620
- .net函数查询_用python实现多文档查询
- crash工具解析_crash工具和x86-64汇编基础
- 格式要求_课题论文的格式要求
- synchronized工作原理剖析(二)
- Paxos算法原理与推导
- 史上最全:Mac搭建Airtest IDE +IOS 测试环境
- Copy ‘XXXX‘ to effectively final temp variable
- GCC中的编译选项“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
- 深入浅出实时数据库12.8日版
- win10无线网卡(该设备无法启动,代码10)
热门文章
- 利用逻辑回归进行简单的人群分类解决广告推荐问题
- WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED解决方法
- Adobe Flash player 10 提示:Error#2044:未处理的IOErrorEvent. text=Error#2036:加载未完成 的解决方法
- JUnit报initializationError的解决方法
- Ajax跨域请求action方法,无法传递及接收cookie信息(应用于系统登录认证及退出)解决方案
- Spring boot异常统一处理方法:@ControllerAdvice注解的使用、全局异常捕获、自定义异常捕获
- jQuery针对多个元素的相同点击事件
- 禁用Chrome缓存进行网站开发
- JavaScript中的HTTP GET请求?
- 吴恩达朋友圈宣布“喜讯”:AI专家王冬岩加入Landing AI...