数据库班级字段怎么定义名称

在Java中,每个类都有一个名称。 类位于包中,这使我们程序员可以一起工作,避免名称冲突。 我可以命名我的班级A ,也可以命名您的班级A ,只要它们位于不同的程序包中,它们可以很好地协同工作。

如果您查看Class的API,您肯定会注意到有三种不同的方法为您提供类的名称:

  • getSimpleName()为您提供不带包的类的名称。
  • getName()为您提供类的名称,其全包名称位于前面。
  • getCanonicalName()为您提供类的规范名称。

简单吗? 好吧,第一个很简单,第二个也很有意义,除非存在令人不安的规范名称。 这还不是很明显。 而且,如果您不知道规范名称是什么,那么您可能还会感到Java技能的力量受到干扰。 两者有什么区别?

如果您想进行准确的解释,请访问Java语言规范6.7章 。 在这里,我们进行一些更简单,更简单的理解,尽管不够全面。

让我们看一些例子:

package pakage.subpackage.evensubberpackage;
import org.junit.Assert;
import org.junit.Test;public class WhatIsMyName {@Testpublic void classHasName() {final Class<?> klass = WhatIsMyName.class;final String simpleNameExpected = "WhatIsMyName";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName";Assert.assertEquals(nameExpected, klass.getName());Assert.assertEquals(nameExpected, klass.getCanonicalName());        }
...

这种“单元测试”运行得很好。 但是正如您所看到的,在这种情况下,名称和规范名称没有区别。 (请注意,程序包的名称是pakage而不是package 。要测试您的Java词汇技巧,请回答为什么?)

让我们看一下来自同一junit测试文件的下一个示例:

@Testpublic void arrayHasName() {final Class<?> klass = WhatIsMyName[].class;final String simpleNameExpected = "WhatIsMyName[]";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "[Lpakage.subpackage.evensubberpackage.WhatIsMyName;";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName[]";Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());        }

现在有区别。 当我们谈论数组时,简单的名称会发出信号,即在其后面加上了括号,就像在Java源代码中所做的那样。 “正常”名称看起来有点怪异。 它以L开头并附加分号。 这反映了JVM中类名的内部表示。 规范名称的更改与简单名称类似:对于以前的类,其类具有所有包名称作为前缀并附加了方括号。 似乎getName()更像是该类的JVM名称,而getCanonicalName()更像是Java源代码级别的完全限定名称。

让我们继续其他示例(我们仍在同一文件中):

class NestedClass{}@Testpublic void nestedClassHasName() {final Class<?> klass = NestedClass.class;final String simpleNameExpected = "NestedClass";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName$NestedClass";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName.NestedClass";Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());        }

区别在于类名称中的美元符号。 同样,“名称”更多是JVM使用的名称,而规范名称是Java源代码之类的名称。 如果编译此代码,则Java编译器将生成以下文件:

  • WhatIsMyName.class
  • WhatIsMyName$NestedClass.class

即使该类被命名为嵌套类,它实际上也是一个内部类。 但是在命名上没有什么区别:另一个类中的静态或非静态类仅被命名为相同。 现在,让我们看一些更有趣的东西:

@Testpublic void methodClassHasName() {class MethodClass{};final Class<?> klass = MethodClass.class;final String simpleNameExpected = "MethodClass";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName$1MethodClass";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = null;Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());}

这次我们在方法内部有一个类。 这不是通常的情况,但是从Java语言的角度来看是有效的。 类的简单名称就是这样:类的简单名称。 没什么奇怪的。

但是,“正常”名称很有趣。 Java编译器为该类生成一个JVM名称,并且该名称中包含一个数字。 为什么? 因为没有什么可以阻止我在测试类的另一个方法中拥有一个具有相同名称的类,并插入数字是防止JVM名称冲突的方法。 JVM不了解或不关心内部和嵌套类或方法内部定义的类。 一课就是一课。 如果编译代码,则可能会看到javac生成的文件WhatIsMyName$1MethodClass.class 。 我必须添加“可能”不是因为我计算出您可能会盲目,而是因为该名称实际上是Java编译器的内部问题。 它可能会选择其他避免名称冲突的策略,尽管我不知道有什么不同于上面的编译器。

规范名称是最有趣的。 它不存在! 它为空。 为什么? 因为您不能从定义它的方法之外访问此类。 它没有规范名称。 我们继续。

匿名类呢? 他们不应该有名字。 毕竟,这就是为什么它们被称为匿名的原因。

@Testpublic void anonymousClassHasName() {final Class<?> klass = new Object(){}.getClass();final String simpleNameExpected = "";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "pakage.subpackage.evensubberpackage.WhatIsMyName$1";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = null;Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());}

实际上,它们没有简单的名称。 简单名称是空字符串。 它们确实具有名称,但由编译器组成。 较差的javac没有其他选择。 它甚至必须为未命名的类组成一些名称。 它必须为JVM生成代码,并且必须将其保存到某个文件中。 规范名称再次为null。

我们已经准备好示例了吗? 否。最后我们有一些简单的东西(又称原始)。 Java基元。

@Testpublic void intClassHasName() {final Class<?> klass = int.class;final String intNameExpected = "int";Assert.assertEquals(intNameExpected, klass.getSimpleName());Assert.assertEquals(intNameExpected, klass.getName());Assert.assertEquals(intNameExpected, klass.getCanonicalName());}

如果该类表示一个原语,例如int (什么比int还要简单?),则简单名称,“ the”名称和规范名称全都是int该原语的名称。

就像原始数组一样非常简单吗?

@Testpublic void intArrayClassHasName() {final Class<?> klass = int[].class;final String simpleNameExpected = "int[]";Assert.assertEquals(simpleNameExpected, klass.getSimpleName());final String nameExpected = "[I";Assert.assertEquals(nameExpected, klass.getName());final String canonicalNameExpected = "int[]";Assert.assertEquals(canonicalNameExpected, klass.getCanonicalName());}

好吧,这并不简单。 名称为[I ,这有点神秘,除非您阅读JVM规范的相应章节 。 也许我再说一次。

结论

类的简单名称很简单。 对于JVM级别的事情, getName()返回的“名称”是一个有趣的东西。 getCanonicalName()是最像Java源代码的那个。

  • 您可以从GitHub的g789 e789d700d3c9abc6afa0获得上述示例的完整源代码。

翻译自: https://www.javacodegeeks.com/2014/09/name-of-the-class.html

数据库班级字段怎么定义名称

数据库班级字段怎么定义名称_班级名称相关推荐

  1. 列出所有班级名称_班级名称

    列出所有班级名称 在Java中,每个类都有一个名称. 类位于包中,这使我们程序员可以一起工作,避免名称冲突. 我可以为班级A命名,也可以为班级A命名,只要它们位于不同的程序包中,它们可以很好地协同工作 ...

  2. C++_二维数组_定义方式_数组名称的作用_案例考试成绩统计---C++语言工作笔记021

    然后我们来看二维数组,这个跟java有一定区别.

  3. 第三方开源项目名称_开源名称中有什么?

    第三方开源项目名称 GNOME,Java,Jupyter,Python. 如果您的朋友或家人曾经窃听您的工作对话,他们可能会认为您从事文艺复兴时期的民间文学艺术,咖啡烘焙,天文学或动物学工作. 这些开 ...

  4. Java工作小组名称_小组名称和口号

    无论是在工作中还是学校中,都是会划分成为小组的,并且每一个小组都会有属于自己小组的小组名称和口号,下面就让我们来欣赏一下吧. 1.火箭小组.我参与我喜欢 2.团结号.团结就是力量! 3.给力小组.给力 ...

  5. 定义mysql字段的编码模式_在 mysql 中 定义 数据库,表,列时,设定的各个的编码格式。...

    最近看了一下KIGG框架,发现在用EF + MYSQL数据库时,数据出现了乱码,用工具(Navicat )查看一下表category的结构发现 KIGG 数据库的默认情况是用latin1编码的(DEF ...

  6. mysql写出总分最高的学生姓名_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...

    这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据, 有以下两张表, Class表 classid classname 1 高三 ...

  7. sql查询每科成绩的最高分_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...

    这个问题是在csdn上一位朋友写的,但是答案有点复杂,而且查询使用的效率也不是很好,于是自己也写了一个.以下是表结构和数据, 有以下两张表, Class表 classid classname 1 高三 ...

  8. python输入姓名专业班级口号_班级名称和班级口号

    自发起"班级名称和班级口号征集"活动以来,经过班委和家委的精心组织,小伙伴们积极参与,现将收集到的作品公布出来,后续将由班委组织讨论,确定最终的班级名称后口号,感谢大家的配合和支持 ...

  9. mysql2000名称_[转载]编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...

    有以下两张表, Class表 classid classname 1 高三(一)班 2 高三(二)班 3 高三(三)班 Student表 studentid   studentName classid ...

最新文章

  1. F#探险之旅(三):命令式编程(上)
  2. Pyinstaller封装exe-TypeError: expected str, bytes or os.PathLike object, not NoneType
  3. Windows10系统安装 .NET Framework 3.5
  4. 一直都很喜欢的软件--基于平台
  5. 安卓逆向_15( 一 ) --- JNI 和 NDK
  6. C++ 中export 关键字的尴尬处境
  7. 有了这个运维方案,让IT信息化人员头疼的系统宕机再也没出现
  8. Java线程面试题 Top 50 (转载)
  9. 系统学习机器学习之神经网络(十一) --TDNN
  10. 链表在libnet中的实现
  11. Java设计模式笔记------设计原则完结
  12. Struts+HIbernate+Spring
  13. nginx+Git 404 error 错误处理
  14. 分分钟搞定 OpenV2X 开发环境
  15. 激光测距传感器原理与应用介绍
  16. matepadpro升级鸿蒙,鸿蒙OS下月推出!MatePad Pro升级EMUI 11,提前预演
  17. 向量叉积和点积混合运算_向量点积叉积及其几何意义
  18. linux怎么进tmp目录,关于linux下tmp文件夹
  19. vue-meta 设置页面 <meta>
  20. 中国5G毫米波小基站市场行业运行动态与发展趋势预测报告

热门文章

  1. ssl提高组周六备考赛【2018.10.20】
  2. ssl1626-花店橱窗布置【日常dp】
  3. codeforces82 D. Two out of Three(记忆化搜索)
  4. codeforces1451 C. String Equality
  5. 图书管理员【2017年普及组第二题】
  6. 算法面试,如何在100 亿URL中判断某个URL是否存在
  7. Oracle入门(五F)之11g show spparameter 命令的使用
  8. Hibernate注解(二)之映射简单的属性
  9. Maven精选系列--eclipse各种操作
  10. 四足爬行机器人运动_有自我意识机器人横空出世,还能自我复制,专家表示需警惕其失控...