目录java
有个小故事,今天群里面有我的问下面如图输出什么?git
我回答:60。但这是错的,答案结果是 40 。我知错能改,而后说了下父子类变量不建议同一个名称。github
可见,父子变量名相同会使人 “Confusing”。再举个例子,新建 ParentClass 类:spring
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
下如图:springboot
debug 后,答案显然:微信
son
和 parent
两个 String 的对应指针数同样,一个为 440/一个为 439这就引出了变量的知识点,如手工画的图:socket
阿里巴巴 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 :
若是您对这些感兴趣,欢迎 star、follow、收藏、转发给予支持!