java继承实现的基本原理

方法调用的过程
寻找要执行的实例方法的时候,是从对象的实际类型信息开始查找的,找不到的时候,再查找父类类型信息。
动态绑定,而动态绑定实现的机制就是根据对象的实际类型查找要执行的方法,子类型中找不到的时候再查找父类。
变量访问的过程
对变量的访问是静态绑定的,无论是类变量还是实例变量。代码中演示的是类变量:b.s和c.s,通过对象访问类变量,系统会转换为直接访问类变量Base.s和Child.s。
示例代码:
package com.xc.xcspringboot.chapter4.chapter4_3_1; /**
* Created by xc on 2019/10/6
* 代码清单4-7 演示继承原理:Base类
*/
public class Base { /**
* 静态变量s
*/
public static int s;
/**
* 实例变量a
*/
private int a; // 静态初始化代码块
static {
System.out.println("基类静态代码块, s: " + s);
s = 1;
} // 实例初始化代码块
{
System.out.println("基类实例代码块, a: " + a);
a = 1;
} /**
* 构造方法
*/
public Base() {
System.out.println("基类构造方法, a: " + a);
a = 2;
} /**
* 方法step
*/
protected void step() {
System.out.println("base s: " + s + ", a: " + a);
} /**
* 方法action
*/
public void action() {
System.out.println("start");
step();
System.out.println("end");
}
}
package com.xc.xcspringboot.chapter4.chapter4_3_1; /**
* Created by xc on 2019/10/6
* 代码清单4-8 演示继承原理:Child类
*/
public class Child extends Base {
/**
* 和基类同名的静态变量s
*/
public static int s;
/**
* 和基类同名的实例变量a
*/
private int a; static {
System.out.println("子类静态代码块, s: " + s);
s = 10;
} {
System.out.println("子类实例代码块, a: " + a);
a = 10;
} public Child() {
System.out.println("子类构造方法, a: " + a);
a = 20;
} protected void step() {
System.out.println("child s: " + s + ", a: " + a);
}
}
package com.xc.xcspringboot.chapter4.chapter4_3_1; /**
* Created by xc on 2019/10/6
*/
public class Chapter4_3_1 {
public static void main(String[] args) {
System.out.println("---- new Child()");
Child c = new Child();
System.out.println("\n---- c.action()");
c.action();
Base b = c;
System.out.println("\n---- b.action()");
b.action();
System.out.println("\n---- b.s: " + b.s);
System.out.println("\n---- c.s: " + c.s);
}
}
---- new Child()
基类静态代码块, s: 0
子类静态代码块, s: 0
基类实例代码块, a: 0
基类构造方法, a: 1
子类实例代码块, a: 0
子类构造方法, a: 10 ---- c.action()
start
child s: 10, a: 20
end ---- b.action()
start
child s: 10, a: 20
end ---- b.s: 1 ---- c.s: 10
java继承实现的基本原理的更多相关文章
- Java编程的逻辑 (17) - 继承实现的基本原理
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 关于java继承的哪些事
引言 本文结合一个例子来说明继承实现的基本原理. 基类Base代码如下所示: public class Base { public static int s; private int a; stati ...
- Java继承与组合
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
- JAVA继承时构造函数的问题
今天看到java继承部分时,关于构造函数是否继承以及如何使用时遇到了点问题,后来查找相关资料解决了. 下面是我个人的总结: 先创建一个父类,里面有两个构造函数: public class Jisuan ...
- Java继承和接口
接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- Java—继承、封装、抽象、多态
类.对象和包 1) 面向对象编程(Object Oriented Programming ,简称 OOP):20世纪70年代以后开始流行. 2) 结构化编程与面向对象编程的区别: A. 在结构化编程中 ...
- java继承关系中成员变量,构造方法,成员方法的关系
Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样,这个太简单写那个名字就访问那个名字! b:子类的成员变量名称和父类中的成员变量名称一样,这个怎么访问呢? 子 ...
- JAVA继承时this和super关键字
JAVA继承时this和super关键字 本文主要讨论在方法前使用this或super关键字时,编译器在什么地方查找对应的函数. 在子类中指定this关键字.首先在本类中查找,如果本类中找不到,再在父 ...
随机推荐
- PLSQL 美化规则文件详解
PL/SQL中有个代码优化的功能,里面可以定义规则,挺好用的,跟大家分享下: 1.首先新建一个my.br文件,在文件中复制以下内容 Version=1 RightMargin=90 Indent=4 ...
- BAT脚本一键启动多个程序
最近写代码,开机要开各种环境,IDE,每次都要对着桌面图标一个个点击,感觉非常麻烦,简直浪费生命,每天开机要花好几分钟打开这些东西,于是稍微学习了一下window下的bat脚本语言,写了一个极为简单而 ...
- Flutter在iOS上的表现就是一坨屎
Flutter在iOS上的表现就是一坨屎: 用户体验差到了极点: 目前来说不值得投入大量精力去研究: 了解一下原理可以.
- iOS 应用逆向工程分析流程图
http://bbs.iosre.com/t/ios/12432
- 轻松学习之三——IMP指针的作用
http://www.jianshu.com/p/425a39d43d16 可能大家一直看到有许多朋友在Runtime相关文章中介绍IMP指针的概念,那么IMP究竟有什么实际作用呢?让我们先从一个函数 ...
- Maven下创建SSM项目的所有依赖和插件
记录下来,方便以后使用 tomcat:7 Maven:3.6.1 IDEA:2018.3 <properties> <spring.version>5.1.5.RELEASE& ...
- vuex2 mapActions 报错 `unknown action type: xxxx`
export const setBreadCrumb = ({ dispatch }, data) => { dispatch('SET_BREADCRUMB', data) } 当调用的时候报 ...
- Python列表生成式练习
''' 如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错 使用内建的isinstance函数可以判断一个变量是不是字符串: 返回True 或 Fal ...
- date -d
date -d ‘2 days ago’ //显示2天以前的时间date -d ‘60 second ago’ //显示60秒以前的时间 date -d '3 months 1 day' //显示3月 ...
- LINUX下的gdb调试方法
首先对目标文件进行编译 例如: gcc test.c -o test 这时会生成一个文件test,然后我们就可以对test进行调试了 示例: gdb test 好了以后是设定断点 示例: break ...