Skip to content

Commit 15a8ea5

Browse files
committed
继承
1 parent 1e2d89a commit 15a8ea5

12 files changed

+664
-280
lines changed

docs/.vuepress/sidebar.ts

+5-16
Original file line numberDiff line numberDiff line change
@@ -114,18 +114,11 @@ export const sidebarConfig = sidebar({
114114
"oo/interface",
115115
"oo/abstract-vs-interface",
116116
"oo/inner-class",
117-
{
118-
text: "static",
119-
link: "oo/static",
120-
},
121-
{
122-
text: "this 和 super",
123-
link: "oo/this-super",
124-
},
125-
{
126-
text: "final",
127-
link: "oo/final",
128-
},
117+
"oo/this-super",
118+
"basic-extra-meal/override-overload",
119+
"oo/static",
120+
"oo/final",
121+
"oo/bigsai",
129122
{
130123
text: "instanceof",
131124
link: "oo/instanceof",
@@ -302,10 +295,6 @@ export const sidebarConfig = sidebar({
302295
text: "重写equals时为什么要重写hashCode",
303296
link: "equals-hashcode",
304297
},
305-
{
306-
text: "重写和重载的区别",
307-
link: "override-overload",
308-
},
309298
{
310299
text: "重写时应当遵守的11条规则",
311300
link: "Overriding",

docs/basic-extra-meal/override-overload.md

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
---
2+
title: Java 方法重写 Override 和方法重载 Overload 的区别,一下子就明白了
3+
shortTitle: Java 方法重写和方法重载的区别
4+
description: Java程序员进阶之路,小白的零基础Java教程,Java 中方法重写 Override 和方法重载 Overload 的区别
25
category:
3-
- Java核心
6+
- Java 核心
47
tag:
5-
- Java
8+
- 面向对象编程
9+
head:
10+
- - meta
11+
- name: keywords
12+
content: Java,Java SE,Java 基础,Java 教程,Java 程序员进阶之路,Java 入门,Java 方法重写,Java 方法重载,Java Override,java Overload
613
---
714

8-
# Java重写(Override)与重载(Overload)
9-
10-
### 01、开篇
15+
## 01、开篇
1116

1217
入冬的夜,总是来得特别的早。我静静地站在阳台,目光所及之处,不过是若隐若现的钢筋混凝土,还有那毫无情调的灯光。
1318

@@ -29,7 +34,7 @@ tag:
2934

3035
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/core-points/21-01.png)
3136

32-
### 02、方法重载
37+
## 02、方法重载
3338

3439
“三妹,你仔细听哦。”我缓了一口气后继续说道。
3540

@@ -218,7 +223,7 @@ public class OverloadingTypePromotion2 {
218223

219224
“不明确,编译器会很为难,究竟是把第一个 20 从 int 转成 long 呢,还是把第二个 20 从 int 转成 long,智障了!所以,不能写这样让编译器左右为难的代码。”
220225

221-
### 03、方法重写
226+
## 03、方法重写
222227

223228
“三妹,累吗?我们稍微休息一下吧。”我把眼镜摘下来,放到桌子上,闭上了眼睛,开始胡思乱想起来。
224229

@@ -291,7 +296,7 @@ class Vehicle {
291296

292297
“Bike 重写了 `run()` 方法,也就意味着,Bike 可以跑出自己的风格。”
293298

294-
### 04、总结
299+
## 04、总结
295300

296301
“好了,三妹,我来简单做个总结。”我瞥了一眼电脑右上角的时钟,离三妹离开的时间不到 10 分钟了。
297302

docs/home.md

+5-5
Original file line numberDiff line numberDiff line change
@@ -135,16 +135,17 @@ head:
135135
- [Java中的变量:局部变量、成员变量、静态变量、常量](oo/var.md)
136136
- [Java中的方法:实例方法、静态方法、抽象方法](oo/method.md)
137137
- [Java中的构造方法:对象创建时的必经之路](oo/construct.md)
138-
- [聊一聊Java中的访问权限控制](oo/access-control.md)
138+
- [聊一聊Java中的访问权限修饰符](oo/access-control.md)
139139
- [Java中的代码初始化块:对成员变量进行更复杂的赋值](oo/code-init.md)
140140
- [Java抽象类,看这一篇就够了,豁然开朗](oo/abstract.md)
141141
- [Java接口,看这一篇就够了,简单易懂](oo/interface.md)
142142
- [Java 抽象类和接口的区别,看这一篇就够了](oo/abstract-vs-interface.md)
143143
- [Java内部类详解:成员内部类、局部内部类、匿名内部类、静态内部类](oo/inner-class.md)
144-
- [搞懂Java继承,提高代码复用性](oo/extends-bigsai.md)
145-
- [Java中的static关键字解析](oo/static.md)
146144
- [Java中this和super的用法总结](oo/this-super.md)
147-
- [浅析Java中的final关键字](oo/final.md)
145+
- [Java 方法重写 Override 和方法重载 Overload 的区别,一下子就明白了](basic-extra-meal/override-overload.md)
146+
- [一文彻底搞懂 Java static 关键字:静态变量、静态方法、静态代码块、静态内部类](oo/static.md)
147+
- [一文彻底搞懂 Java final 关键字](oo/final.md)
148+
- [一万字彻底搞懂 Java 继承](oo/extends-bigsai.md)
148149
- [Java instanceof关键字用法](oo/instanceof.md)
149150
- [深入理解Java中的不可变对象](basic-extra-meal/immutable.md)
150151
- [Java中可变参数的使用](basic-extra-meal/varables.md)
@@ -197,7 +198,6 @@ head:
197198
- [彻底讲明白的Java浅拷贝与深拷贝](basic-extra-meal/deep-copy.md)
198199
- [深入理解Java中的hashCode方法](basic-extra-meal/hashcode.md)
199200
- [一次性搞清楚equals和hashCode](basic-extra-meal/equals-hashcode.md)
200-
- [Java重写(Override)与重载(Overload)](basic-extra-meal/override-overload.md)
201201
- [Java重写(Overriding)时应当遵守的11条规则](basic-extra-meal/Overriding.md)
202202
- [Java到底是值传递还是引用传递?](basic-extra-meal/pass-by-value.md)
203203
- [Java不能实现真正泛型的原因是什么?](basic-extra-meal/true-generic.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
---
2+
title: Java类是如何默认继承Object的?
3+
shortTitle: Java类是如何默认继承Object的?
4+
description: 积累在平时,多了解一点细节总是好的
5+
category:
6+
- 微信公众号
7+
head:
8+
---
9+
10+
来源丨walkinger
11+
12+
https://juejin.im/post/5ca1e8ade51d454e6a300048
13+
14+
![](https://mmbiz.qpic.cn/mmbiz_jpg/xq9PqibkVAzq8bjJ7ic6W9X0HQpaf5jIoB84FptSMEPKm3xx2XYuicZQcAQ1BzOfibGgbgEiahQpU9k6R1ZL0wvt7Ng/640?wx_fmt=jpeg)
15+
16+
17+
18+
* * *
19+
20+
**前  言**
21+
22+
学过 `Java`的人都知道, `Object`是所有类的父类。但是你有没有这样的疑问,我并没有写 `extendsObject`,它是怎么默认继承 `Object`的呢?那么今天我们就来看看像 `Java`这种依赖于虚拟机的编程语言是怎样实现默认继承 `Object`的,以及 `Java`编译器和 `JVM`到底是如何做的?
23+
24+
* * *
25+
26+
**继承自Object验证**
27+
28+
首先我们来验证一下 `Object`是不是所有类的父类,随便新建一个Java类,如下图:
29+
30+
![](https://mmbiz.qpic.cn/mmbiz_png/xq9PqibkVAzq8bjJ7ic6W9X0HQpaf5jIoBeJzeArXuLfoUHHiaAEWZSakuDbszOnDRPmFQJqy8rtJXvjxP64UyaRQ/640?wx_fmt=png)
31+
32+
从上面的代码可以看出, `newMyClass()`打点之后可以选择调用的方法有很多,我们定义的 `MyClass`类里面只有一个 `main`方法,那这些方法哪来的,显然是 `Object`里声明的,故 `MyClass`类的父类就是 `Object`,因此,在 `MyClass`中可以使用 `Object`类的 `public`或 `protected`资源。
33+
34+
另外,当 `A`类继承 `MyClass`类时,通过打点也可以调到 `Object`内的方法,这是继承的传递,好比 `Object`是 `MyClass`的“父亲”, `MyClass`是A类的“父亲”, `Object`是A类的“爷爷”,间接的继承了 `Object`。因此, `Object`是超类,是所有类的父类。
35+
36+
* * *
37+
38+
**推测可能的原因**
39+
40+
> 要了解 `Java类是如何默认继承Object的?` 的原因其实并不需要知道JVM的实现细节。只需了解一下对于这种虚拟机程序的基本原理即可。一般对于这种靠虚拟机运行的语言(如 `Java`、 `C#`等)会有两种方法处理默认继承问题。
41+
42+
* **编译器处理**
43+
44+
在编译源代码时,当一个类没有显式标明继承的父类时,编译器会为其指定一个默认的父类(一般为 `Object`),而交给虚拟机处理这个类时,由于这个类已经有一个默认的父类了,因此, `VM`仍然会按照常规的方法像处理其他类一样来处理这个类。对于这种情况,从编译后的二进制角度来看,所有的类都会有一个父类(后面可以以此依据来验证)。
45+
46+
* **JVM处理**
47+
48+
编译器仍然按照实际代码进行编译,并不会做额外的处理,即如果一个类没有显式地继承于其他类时,编译后的代码仍然没有父类。然后由虚拟机运行二进制代码时,当遇到没有父类的类时,就会自动将这个类看成是 `Object`类的子类(一般这类语言的默认父类都是 `Object`)。
49+
50+
* * *
51+
52+
**验证结论**
53+
54+
从上面两种情况可以看出,**第 1种情况** 是在编译器上做的文章,也就是说,当没有父类时,由编译器在编译时自动为其指定一个父类。**第 2种情况** 是在虚拟机上做文章,也就是这个默认的父类是由虚拟机来添加的。
55+
56+
那么 `Java`是属于哪一种情况呢?其实这个答案很好得出。只需要随便找一个反编译工具,将 `.class`文件进行反编译即可得知编译器是如何编译的。
57+
58+
就以上面代码为例,如果是**第 1种情况**,就算 `MyClass`没有父类,但由于编译器已经为 `MyClass`自动添加了一个Object父类,所以,在反编译后得到的源代码中的 `MyClass`类将会继承 `Object`类的。如果不是这种情况,那么就是**第 2种情况**
59+
60+
那么实际情况是什么样的呢?现在我们就将 `MyClass.class`反编译看看到底如何。
61+
62+
* **jd-gui 反编译**
63+
64+
![](https://mmbiz.qpic.cn/mmbiz_png/xq9PqibkVAzq8bjJ7ic6W9X0HQpaf5jIoBdqoBYEHmWl3yibG3ibZyFcBGTAKFmuP1TYw0Er8Jj3jZ9SpiaZK1XePeA/640?wx_fmt=png)
65+
66+
* **使用JDK自带的工具(javap)反编译**
67+
68+
`CMD`命令行下执行: `javap MyClass>MyClass.txt`
69+
70+
![](https://mmbiz.qpic.cn/mmbiz_png/xq9PqibkVAzq8bjJ7ic6W9X0HQpaf5jIoBpxQeYtViciahfAWQztBSUiawRvXQfEv6KHAo19hjTSa02AOicT2Dk6q1ZQ/640?wx_fmt=png)
71+
72+
可以看出实际的反编译后的文件中并没有 `extendsObject`,使用排除法,因此是 **第2种情况**
73+
74+
这样来推导出的结论是 第2种情况,但事实真的如此吗?为什么网上还有说反编译后的是有 `extendsObject`字样?
75+
76+
77+
78+
* **JDK版本问题?**
79+
80+
猜想是 `JDK`版本的问题,于是把 `JDK`版本切换到7,使用 `jd-gui`和 `javap`反编译,接果和使用 `JDK8`反编译后的结果一样,也都没有 `extendsObject`
81+
82+
继续换版本,下载了半天把 `JDK 6`下载下来了,安装后把 `JDK`版本切换到 `JDK 6`
83+
84+
仍然在 `CMD`窗口执行 `javap MyClass>MyClass.txt`,得到的 `TXT`文件内容如下:
85+
86+
![](https://mmbiz.qpic.cn/mmbiz_png/xq9PqibkVAzq8bjJ7ic6W9X0HQpaf5jIoBjlspuobsW90Gcpfibb8dSCU03aPyvficgs0Ko5Ozn9lDib4aibHQ6N97kQ/640?wx_fmt=png)
87+
88+
what?竟然有 `extendsObject`, `jd-gui`反编译后的依然没有。即, `JDK 6`之前使用 `javap`反编译后的 `MyClass`类显式的继承 `Object`, `JDK 7`以后没有; `jd-gui`反编译后的不管 `JDK`版本如何始终没有。我们以 `java`自带的工具为准。
89+
90+
* * *
91+
92+
**小   结**
93+
94+
那么就是说 `JDK 6`之前是编译器处理, `JDK 7`之后是虚拟机处理。
95+
96+
但是仔细想想我们在编辑器里( `IDEA`)打点时就能列出 `Object`类下的方法,此时还没轮到编译器和 `jvm`,编辑器就已经知道 `MyClass`类的父类是 `Object`类了,这是因为编辑器为我们做了一些智能处理。
97+
98+
* * *
99+
100+
**后 记
101+
102+
**
103+
104+
> 由于能力有限,若有错误或者不当之处,还请大家批评指正,一起学习交流!
105+
106+
****个人网站:****www.codesheep.cn (程序羊)****
107+
108+
**更多热文在此:**
109+
110+
  ●  [Spring Boot 系列实战文章合集(源码已开源)](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247484006&idx=1&sn=15cf2b8a17bd6f49952f65bdc718724b&chksm=fdded4a2caa95db4b3099fa75635a7d99655e22963f9dc65446cd703a66cbc9b2a22b87b7ece&scene=21#wechat_redirect)
111+
112+
  ●  [程序员写简历时必须注意的技术词汇拼写](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247484027&idx=1&sn=1f005a4c2ec45631865429ff9ccfbe44&chksm=fdded4bfcaa95da942be42b38c7733bdf5ce322136231ca2014dc6b92c117a2fe5bea35bb6bb&scene=21#wechat_redirect)
113+
114+
  ●  [异步编程的几种方式](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247484090&idx=1&sn=90561bfbd4738f32f4cf811f7193c0b8&chksm=fdded47ecaa95d681a61983899a63a38cae03e9440777e474198753c02ac8c6dc4528c71e912&scene=21#wechat_redirect)
115+
116+
  ●  [从一份配置清单详解Nginx服务器配置](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247483807&idx=1&sn=e3a164701c2f6e0f3cf91bd25d595479&chksm=fdded75bcaa95e4d857e5f4e040f37b7c3d8f3b301856493419498b6e54d8a43addfc25e7505&scene=21#wechat_redirect)
117+
118+
  ●  [一文上手 Elasticsearch常用可视化管理工具](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247483913&idx=1&sn=254e99832da662cd5dc7af57bfb0081b&chksm=fdded4cdcaa95ddbf867ce83b2a4c48aa497d6b61b087ba9111b040dfcfaab1f8c9aa34f2d53&scene=21#wechat_redirect)
119+
120+
  ●  [Docker容器可视化监控中心搭建](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247483763&idx=1&sn=6ceb9e73540b5016dadfb212636b3855&chksm=fdded7b7caa95ea1165b507397c39267d3bf7522c83cc8ed10eae4ee4a13db831eb58a3dc167&scene=21#wechat_redirect)
121+
122+
  ●  [利用ELK搭建Docker容器化应用日志中心](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247483768&idx=1&sn=df06fd3fc033ef8120a14677db388d9a&chksm=fdded7bccaa95eaaac9ff046c1c7fad0d3489ec7af546d829175af6106340e053f570e8c927c&scene=21#wechat_redirect)
123+
124+
  ●  [RPC框架实践之:Google gRPC](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247483780&idx=1&sn=e04264df80209244f8e263ef0931d134&chksm=fdded740caa95e56190918108985795439a277a88e054c119b3cb63a92a8e0899943d9f3e02b&scene=21#wechat_redirect)
125+
126+
  ●  [一文详解 Linux系统常用监控工具](http://mp.weixin.qq.com/s?__biz=MzU4ODI1MjA3NQ==&mid=2247483877&idx=1&sn=113867c83c0cecf5781a9e1a7f91bdd1&chksm=fdded721caa95e37f757660e7f14775ac55e4a72f9c24b119af7ef83ca7587ceb53f22298c99&scene=21#wechat_redirect)
127+
128+
* * *
129+
130+
作者更多 **务实、能看懂、可复现的** 技术文章尽在公众号 **CodeSheep**,欢迎扫码订阅,第一时间获取更新 ⬇️⬇️⬇️
131+
132+
![](https://mmbiz.qpic.cn/mmbiz_gif/xq9PqibkVAzr3Ax6dwjysCZ8Zsom5kkKicbdS1tYartkx9YyCm5qtynaUicLDXjYcZaQbXVIFjBETA7RJJEYvkiciaA/640?)
133+
134+
****欲进群交流,可在公众号内回复「****进群****」,我邀请您!****
135+
136+
******让我“****好看****” ************
137+
138+
![](https://mmbiz.qpic.cn/mmbiz_gif/kw2nrMk65scprt048NlNbq4wEMicKRhkt63RdNGIiaNLqIzDKYz5hXvVsfibs6WsaoNr1P5PhD0sBHwujeQDMaZeg/640?wx_fmt=gif)
139+
140+
******
141+
142+
>转载链接:[https://mp.weixin.qq.com/s/OVlSeJEWgpKv_pKQgrP9mw](https://mp.weixin.qq.com/s/OVlSeJEWgpKv_pKQgrP9mw),出处:CodeSheep,整理:沉默王二

docs/oo/access-control.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
---
2-
title: 聊一聊Java中的访问权限控制
3-
shortTitle: 聊一聊Java中的访问权限控制
4-
description: Java程序员进阶之路,小白的零基础Java教程,聊一聊Java中的访问权限控制
2+
title: 聊一聊Java中的访问权限修饰符
3+
shortTitle: 聊一聊Java中的访问权限修饰符
4+
description: Java程序员进阶之路,小白的零基础Java教程,聊一聊Java中的访问权限修饰符
55
category:
66
- Java 核心
77
tag:
88
- 面向对象编程
99
head:
1010
- - meta
1111
- name: keywords
12-
content: Java,Java SE,Java 基础,Java 教程,Java 程序员进阶之路,Java 入门,Java 访问权限控制
12+
content: Java,Java SE,Java 基础,Java 教程,Java 程序员进阶之路,Java 入门,Java 访问权限修饰符,java public,java private,java protected
1313
---
1414

1515

0 commit comments

Comments
 (0)