摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!

目录

  1. 父子类变量名相同会咋样?
  2. 为啥强制子类、父类变量名不同?
  3. 可落地项目小思考

一、父子类变量名相同会咋样?

有个小故事,今天群里面有个人问下面如图输出什么?

我回答: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 :

如果您对这些感兴趣,欢迎 star、follow、收藏、转发给予支持!

参考资料

  • 阿里 Java 手册系列教程:https://www.bysocket.com/archives/2100
  • 《阿里巴巴 Java 开发手册》

以下专题教程也许您会有兴趣

 
(关注微信公众号,领取 Java 精选干货学习资料)

阿里 Java 手册系列教程:为啥强制子类、父类变量名不同?的更多相关文章

  1. 点评阿里JAVA手册之编程规约(OOP 规约 、集合处理 、并发处理 、其他)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文难度系数为三星(★★★) 本文为第二篇 第一篇 点评阿里JAVA手 ...

  2. Java NIO系列教程(二) Channel通道介绍及FileChannel详解

    目录: <Java NIO系列教程(二) Channel> <Java NIO系列教程(三) Channel之Socket通道> Channel是一个通道,可以通过它读取和写入 ...

  3. 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:MySQL数据库 (建表规约.索引规约.SQL语句.ORM映 ...

  4. 点评阿里JAVA手册之异常日志(异常处理 日志规约 )

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...

  5. Java NIO系列教程(三-十二) Buffer

    原文链接     作者:Jakob Jenkov     译者:airu     校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...

  6. 推介一个学习JAVA的系列教程-狗鱼IT教程

    介绍一个学JAVA的零基础学习JAVA的网站,推介一个学习JAVA的系列教程-狗鱼IT教程 下面是java的系教程: 1、[java教程]Java 教程 2、[java教程]Java 简介 3、[ja ...

  7. Java NIO系列教程(八)JDK AIO编程

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  8. Java NIO系列教程(七) selector原理 Epoll版的Selector

    目录: Reactor(反应堆)和Proactor(前摄器) <I/O模型之三:两种高性能 I/O 设计模式 Reactor 和 Proactor> <[转]第8章 前摄器(Proa ...

  9. Java NIO系列教程(三) Channel之Socket通道

    目录: <Java NIO系列教程(二) Channel> <Java NIO系列教程(三) Channel之Socket通道> 在<Java NIO系列教程(二) Ch ...

随机推荐

  1. bzoj 2759一个动态树好题

    真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子 ...

  2. 深入浅出Git教程(转载)

    目录 一.版本控制概要 1.1.什么是版本控制 1.2.常用术语 1.3.常见的版本控制器 1.4.版本控制分类 1.4.1.本地版本控制 1.4.2.集中版本控制 1.4.3.分布式版本控制 1.5 ...

  3. solr6.6 导入索引数据

    1.什么是core core是solr的一个索引库,可以理解为一个数据库,core可以根据需要,创建多个. 2.创建core 例如,创建一个core,名字叫mycore,就可以用一下命令: E:\so ...

  4. 深入理解数据库磁盘存储(Disk Storage)

    数据库管理系统将数据存储在磁盘.磁带以及其他的裸设备上,虽然这些设备的访问速度相比内存慢很多,但其非易失性和大容量的特点使他们成为数据存储的不二之选. 本文主要讨论大型数据库产品的磁盘存储内部结构,这 ...

  5. 原型模式--java代码实现

    原型模式 原型模式,属于对象创建型模式中的一种.通过复制原型对象的方法来创建一个对象实例,且该对象与原对象有相同的数据结构和值.类似我们在备份数据库信息的时候,将数据库中表的结构和数据的一同备份,生成 ...

  6. MediatR 知多少

    引言 首先不用查字典了,词典查无此词.猜测是作者笔误将Mediator写成MediatR了.废话少说,转入正题. 先来简单了解下这个开源项目MediatR(作者Jimmy Bogard,也是开源项目A ...

  7. “崩溃了?不可能,我全 Catch 住了” | Java 异常处理

    前言 今天我们来讨论一下,程序中的错误处理. 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeEx ...

  8. Mybatis增删改查,Demo整合

    第一步:MyBatis的Jar包引入mybatis-3.2.7.jarmysql-connector-java-5.1.8.jar MyBatis的pom.xml依赖 <dependencies ...

  9. javascript入门篇(四)

    Break 和 Continue 语句 break 它常用于跳出 switch() 语句, break 语句也可用于跳出循环.break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话) co ...

  10. asp.net core 系列之并发冲突

    本文介绍如何处理多个用户并发更新同一实体(同时)时出现的冲突 . 主要是两种:一种,检查属性并发冲突,使用 [ConcurrencyCheck] ;另一种,检测行的并发冲突,使用 rowversion ...