阿里 Java 手册系列教程:为啥强制子类、父类变量名不同?
目录
- 父子类变量名相同会咋样?
- 为啥强制子类、父类变量名不同?
- 可落地项目小思考
一、父子类变量名相同会咋样?
有个小故事,今天群里面有个人问下面如图输出什么?

我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变量不建议同一个名称。
可见,父子变量名相同会令人 “Confusing”。再举个例子,新建 ParentClass 类:
public class ParentClass {
public String name = "parent";
public static void main(String[] args) {
ParentClass parentClass = new SonClass();
SonClass sonClass = new SonClass();
System.out.println("parentClass.name = " + parentClass.name);
System.out.println("sonClass.name = " + sonClass.name);
System.out.println("debug...");
}
}
class SonClass extends ParentClass {
public String name = "son";
}
上面如果答对的,这个肯定知道结果。运行程序打印如下:
parentClass.name = parent
sonClass.name = son
debug...
断点到 System.out.println("debug..."); 该行,debug 下如图:

debug 后,答案显然:
- 前面两行,new 出来两个不同 SonClass 实例
- 每个实例都会有子类的成员变量以及父类的成员变量,这个叫做实例变量
- 如果是 String 的值,都会指向 JVM 常量池。所以看出
son和parent两个 String 的对应指针数一样,一个为 440/一个为 439
这就引出了变量的知识点,如手工画的图:

二、为啥强制子类、父类变量名不同?
阿里巴巴 Java 手册是这样写的:
【强制】避免在子父类的成员变量之间或者不同代码块的局部变量之间采用完全相同的命名方式,那会导致代码可读性降低。
说明:子类、父类成员变量名相同,即使属性是 public 也是能通过编译,虽然局部变量不在同一方法内的不同代码中同名也是合法的,但避免使用。 setter / getter 的参数名称也避免成员变量名相同。
具体的反例我也不写了。为啥强制,显而易见有几点:
- 可以提高代码可读性
- 减少新人看代码时不必要的困惑
- 减少重构时不必要的困惑
- ...
- 多次使用能值出同源
正确的例子 ParentClass 类:
public class ParentClass {
public String parentName = "parent";
public static void main(String[] args) {
ParentClass parentClass = new SonClass();
SonClass sonClass = new SonClass();
System.out.println("parentClass.parentName = " + parentClass.parentName);
System.out.println("sonClass.sonName = " + sonClass.sonName);
System.out.println("debug...");
}
}
class SonClass extends ParentClass {
public String sonName = "son";
}
两种写法的优缺点,一目了然。
三、可落地小总结
这里是说了一种代码风格,类似味道。本身不影响程序运行,没有所谓的潜在故障和错误。那么味道的好处总会能体验到。
* 比如这里谈到继承,OOP 讲究:高内聚,低耦合;多组合,少继承。比如控制语句,推荐多层嵌套不超过 3 层。那继承也一样:推荐继承关系不超过 3 层。
* 还有 Boolean 成员变量定义,命名不要加 is 前缀。不然 getter 方法会少了 is,部分解析会引起序列化问题。我的做法:在设计数据库表字段的时候,不考虑 Boolean ,用 Byte 类型去处理。这样 is 不 is 就不 care 了。
* ...
好的命名规约,好的编码风格,简捷清爽,引出无限风光
代码示例
本文示例读者可以通过查看下面仓库的中的 alibaba/java/ParentClass.java :
- Github:https://github.com/JeffLi1993/java-core-learning-example
- Gitee:https://gitee.com/jeff1993/java-core-learning-example
如果您对这些感兴趣,欢迎 star、follow、收藏、转发给予支持!
参考资料
- 阿里 Java 手册系列教程:https://www.bysocket.com/archives/2100
- 《阿里巴巴 Java 开发手册》
以下专题教程也许您会有兴趣
(关注微信公众号,领取 Java 精选干货学习资料)
阿里 Java 手册系列教程:为啥强制子类、父类变量名不同?的更多相关文章
- 点评阿里JAVA手册之编程规约(OOP 规约 、集合处理 、并发处理 、其他)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文难度系数为三星(★★★) 本文为第二篇 第一篇 点评阿里JAVA手 ...
- Java NIO系列教程(二) Channel通道介绍及FileChannel详解
目录: <Java NIO系列教程(二) Channel> <Java NIO系列教程(三) Channel之Socket通道> Channel是一个通道,可以通过它读取和写入 ...
- 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...
- 点评阿里JAVA手册之异常日志(异常处理 日志规约 )
下载原版阿里JAVA开发手册 [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...
- Java NIO系列教程(三-十二) Buffer
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...
- 推介一个学习JAVA的系列教程-狗鱼IT教程
介绍一个学JAVA的零基础学习JAVA的网站,推介一个学习JAVA的系列教程-狗鱼IT教程 下面是java的系教程: 1、[java教程]Java 教程 2、[java教程]Java 简介 3、[ja ...
- Java NIO系列教程(八)JDK AIO编程
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- Java NIO系列教程(七) selector原理 Epoll版的Selector
目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...
- Java NIO系列教程(三) Channel之Socket通道
目录: <Java NIO系列教程(二) Channel> <Java NIO系列教程(三) Channel之Socket通道> 在<Java NIO系列教程(二) Ch ...
随机推荐
- http.go
) } if name != cfgName { continue } return val.FieldByNa ...
- 记录一波由会话堵塞导致tomcat应用故障事件
一.故障基本信息 发生时间 消除时间 故障历时 故障类别 影响 2018-5-17 18:14:30 2018-05-18 08:58:15 16小时 应用故障 业务瘫痪,用户投诉 二.故障现象 AP ...
- 【codeforces 698C】LRU
题目链接: http://codeforces.com/problemset/problem/698/C 题目大意: n个物品,k个格子,第i个物品每次被选取的概率为$p_{i}$,如果格子里没有该物 ...
- BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图
BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4873 分析:我们发现分数正负 ...
- APP版本更新通知流程测试要点
一.APP版本更新通知流程图如下: 二.测试注意点: 1.Android更新直接下载APK,IOS引导至APP Store更新页面: 强制更新------只有"立即更新" 1.一般 ...
- python的知识统计笔记
python的发展
- SpringBoot之旅第六篇-启动原理及自定义starter
一.引言 SpringBoot的一大优势就是Starter,由于SpringBoot有很多开箱即用的Starter依赖,使得我们开发变得简单,我们不需要过多的关注框架的配置. 在日常开发中,我们也会自 ...
- [Objective-C语言教程]简介(1)
中文名:扩充C的面向对象编程语言 外文名:Objective-C 简 写:ObjC&OC 创始人:布莱德·考克斯 创始时间:1980年代 Objective-C,通常写作ObjC或OC和较少用 ...
- Zabbix-server 3.4 安装详细和修改web界面中文出现的乱码(一)
1. 老套路先来个Zabbix简介: Zabbix是一个企业级的.开源的.分布式的监控套件: Zabbix可以监控网络和服务的监控状况. Zabbix利用灵活的告警机制,允许用户对事件发送Email. ...
- HTTPS和TCP协议三次握手设计
1. 我们的TCP 三次握手大概是长这样 2.那么为什么 TCP 要采取三次握手,而不是两次或其他 首先我们要知道握手的目的: 为了保证通讯双方建立的连接是可靠的. 同时,为了保证性能,握手的次数要求 ...