阿里 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 ...
随机推荐
- 一类SG函数递推性质的深入分析——2018ACM陕西邀请赛H题
题目描述 定义一种有根二叉树\(T(n)\)如下: (1)\(T(1)\)是一条长度为\(p\)的链: (2)\(T(2)\)是一条长度为\(q\)的链: (3)\(T(i)\)是一棵二叉树,它的左子 ...
- [SDOI2011]染色 BZOJ2243 树链剖分+线段树
分析: 区间合并,lcol是左端点的颜色编号,rcol是右端点的颜色编号,那么我们向上合并的时候,如果左儿子的rcol等于右儿子的lcol那么区间的sum--. 另外,如果重链顶的颜色等于重链顶的父节 ...
- Matlab实现画柱状图坐标标签旋转
引言: 在用matlab画柱状图或者其他图的时候,你是否碰到下图这种情况: 乍一看这个柱状图画的有馍有洋的,but,仔细一看你会发现,横坐标标签如果再长一点就不好看啦,甚至会重叠,就像这样: 这样的图 ...
- GT工具中用到的英文词解释
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p2 ...
- 使用CompletableFuture实现异步编程
在开发中会碰到一种场景,如下 Object result1 = service1.func1();//执行80ms Object result2 =service2.func2();//执行50ms ...
- [Swift]LeetCode1033. 移动石子直到连续 | Moving Stones Until Consecutive
Three stones are on a number line at positions a, b, and c. Each turn, let's say the stones are curr ...
- 【.NET异步编程系列2】掌控SynchronizationContext避免deadlock
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/async异步编程语法糖简化了异步编程方式. 相信很多开发者都看到如下异步编程实践原 ...
- ASP.NET Core 项目实战(持续更新~~~)
一.前言 准备写这个系列文章的设想开始于今年9月,毫无意外,期间又又又又拖了很长时间,文章主要是为了记录自己学习使用 ASP.NET Core Web API 与 Vue 创建一个前后端分离的项目的整 ...
- 理解 Node.js 的 Event loop
问题 考察如下代码,脑回路中运行并输出结果: console.log("1"); setTimeout(function setTimeout1() { console.log(& ...
- ACM入门之OJ~
所谓OJ,顾名思义Online Judge,一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等.用户程序执行的结果将被Online ...