java基础和规范一
- 由类加载器(Class Loader)负责把类文件加载到Java虚拟机中(.class),在这个过程需要校验该类文件是否符合类文件规范
- 字节码校验器(Bytecode Verifier)检查该类文件的代码中是否存在着某些非法操作
- 如果字节码校验器校验通过,就由Java解释器负责把该类文件解释成机器码进行执行
- 检查class文件的内部结构是否正确,主要是检查该文件是否以某个内存地址打头一般为0xCAFEBABE,但是可能32bit和64bit存在一定的差异,通过这样的检查可以使得被损坏的class文件或者伪装的class文件不能够被加载,可以标记为不安全的。第一趟扫描的主要目的是保证这个字节序列正确的定义了一个类型,它必须遵从java class文件的固定格式,这样它才能被编译成在方法区中的(基于实现的)内部数据结构。
- 检查是否符合JVM语言特性里面的编译规则,因为Java里面所有的Class都是从Object类继承过来的,一旦发现这种不安全的类存在,就直接抛异常。这次检查,class文件检验器不需要查看字节码,也不需要查看和装载任何其他类型。在这趟扫描中,检验器查看每个组成部分,确认它们是否是其所属类型的实例,它们结构是否正确。比如,方法描述符(它的返回类型,以及参数的类型和个数)在class文件中被存储为一个字符串,这个字符串必须符合特定的上下文无关文法。另外,还会检查这个类本身是否符合特定的条件,它们是由java编程语言规定的。比如,除Object外,所有类都必须要有一个超类,final的类不能被子类化,final方法也没有被覆盖,检查常量池中的条目是合法的,而且常量池的所有索引必须指向正确类型的常量池条目。
- 检查字节码是否导致JVM崩溃掉,这里存在一个JVM中断的问题,编程过程无法捕捉Error,同样的没有办法判断程序是否因为执行的class字节码中断或者崩溃。字节码流代表了java的方法,它是由被称为操作码的单字节指令组成的序列,每一个操作码后都跟着一个或多个操作数。执行字节码时,依次执行操作码,这就在java虚拟机内构成了执行的线程,每一个线程被授予自己的java栈,这个栈是由不同的栈帧构成的,每一个方法调用将获得一个自己的栈帧——栈帧其实就是一个内存片段,其中存储着局部变量和计算的中间结果,用于存储中间结果的部分被称为操作数栈。字节码检验器要进行大量的检查,以确保采用任何路径在字节码流中都得到一个确定的操作码,确保操作数栈总是包含正确的数值以及正确的类型。它必须保证局部变量在赋予合适的值以前不能被访问,而且类的字段中必须总是被赋予正确类型的值,类的方法被调用时总是传递正确数值和类型的参数。字节码检验器还必须保证每个操作码都是合法的,即都有合法的操作数,以及对每一个操作码,合适类型的数值位于局部变量中或是在操作数栈中。这些仅仅是字节码检验器所做的大量检验工作中的一小部分,在整个检验过程通过后,它就能保证这个字节码流可以被java虚拟机安全的执行。
- 检查符号引用验证,一个类文件,它会包含它引用的其他类的全名和描述符,并跟他们建立符号引用(一种虚拟的,非物理连接的方式)。当程序第一次执行到需要符号引用的位置时,JVM会检查这个符号链接的正确性,然后建立真正的物理引用(直接引用)。java虚拟机将追踪那些引用——从被验证的class文件到被引用的class文件,以确保这个引用是正确的。这次扫描可能要装载新的类。考虑到虚拟机实现上的差别,第四趟扫描可能紧随第三趟扫描发生,也有可能在第三趟扫描之后很久,当字节码被执行时才执行。动态连接是一个将符号引用解析为直接引用的过程。当java虚拟机执行字节码时,如果它遇到一个操作码,这个操作码第一次使用一个指向另一个类的符号引用,那么虚拟机就必须解析这个符号引用。在解析时,虚拟机执行两个基本任务:
——查找被引用的类(如果必要的话就装载它)——将符号引用替换为直接引用,例如指向一个类、字段或方法的指针或偏移量虚拟机必须记住这个直接引用,这样当它以后再次遇到同样的引用时,就可以直接使用,而不需要重新解析该符号引用了。
- 类型安全的引用转化
- 结构化的内存访问(非指针算法)
- GC
- 数组边界检查
- 空引用检查(NullPointer)
字节码检查的局限就是对于那些不经过字节码检查的方法(如本地方法:native method)无法验证其安全性,所以这里采用的是对动态链接库的访问控制,对于那些足有足够可信度的代码才被允许访问本地方法。具体的实现是,由安全管理器来决定代码是否有调用动态链接库的权限,因为调用本地方法必须调用动态链接库。这样一来,不可信的代码将无法通过调用本地方法来绕过字节码检查。
- 默认安全管理器:java.lang.SecurityManager
- 代码签名和认证
- 策略:java.security.Policy
- 权限:java.security.Permission
- 策略文件
- 保护域:CodeSource,PersimissionCollection,ProtectionDomain
- 访问控制器:java.security.AccessController
- JVM解释器:即这个虚拟机处理字段码的CPU。
- JVM指令系统:该系统与计算机很相似,一条指令由操作码和操作数两部分组成。操作码为8位二进制数,主要是为了说明一条指令的功能,操作数可以根据需要而定,JVM有多达256种不同的操作指令。
- 寄存器:JVM有自己的虚拟寄存器,这样就可以快速地与JVM的解释器进行数据交换。为了功能的需要,JVM设置了4个常用的32位寄存器:pc(程序计数器)、optop(操作数栈顶指针)、frame(当前执行环境指针)和vars(指向当前执行环境中第一个局部变量的指针)。
- JVM栈:指令执行时数据和信息存储的场所和控制中心,它提供给JVM解释器运算所需要的信息。
- 存储区:JVM存储区用于存储编译过后的字节码等信息。
- 碎片回收区:JVM碎片回收是指将使用过的Java类的具体实例从内存进行回收,这就使得开发人员免去了自己编程控制内存的麻烦和危险。随着JVM的不断升级,其碎片回收的技术和算法也更加合理。JVM 1.4.1版后产生了一种叫分代收集技术,简单来说就是利用对象在程序中生存的时间划分成代,以此为标准进行碎片回收。
- 用来编译、运行、监视、调试应用程序以及简历应用程序文档的开发工具
- 用来部署应用程序的标准机制
- 用来创建复杂的图形用户界面(GUI)的用户界面工具包
- 用来启用数据库访问和操作远程对象的集成库
- Java SE中的规范:
JavaBeans Component Architecture【JavaBeans】:一个为Java平台定义可重用软件组件的框架,可以在图形化构建工具中对这些组件进行设计
Java Foundation Classes(Swing)【JFC】:一套Java的类库,支持为基于Java的客户端应用程序构建GUI和图形化功能
JavaHelp:一个独立于平台的可扩展帮助系统,开发人员和做着可以使用它将在线帮助集成到Applet、组件、应用程序、操作系统和设备中,还可以提供Web的在线文档
Java Native Interface【JNI】:使JVM中运行的Java代码可以与用其他编程语言编写的应用程序和库进行互操作,很多时候实现部分用C来写,有兴趣的读者可以写一个简单的Java版任务管理器,嘿嘿,写这个可以收获很多哦!
Java Platform Debugger Architecture【JPDA】:用于Java SE的调试支持的基础结构
Java 2D API【Java 2D】:是一套用于高级2D图形和图像的类、一套提供了精确控制颜色空间定义和转换的类以及一套面向显示图像的操作符
Java Web Start:允许用户通过一次点击下载并启动特性完整的网络应用程序,而不需要安装,从而简化了Java的部署工作
Certification Path API:提供了一套用于创建、构建和检验认证路径(也称为 “认证链”)的 API,可以安全地建立公共密钥到主体的映射。
Java Advanced Imaging【JAI】:提供一套面向对象的接口,这些接口支持一个简单的高级编程模型,使开发人员能够轻松地操作图像。
Java Cryptography Extension【JCE】:提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现,它提供对对称、不对称、块和流密码的加密支持,它还支持安全流和密封的对象。
Java Data Objects【JDO】:是一种基于标准接口的持久化 Java 模型抽象,使程序员能够将 Java 领域模型实例直接存储进持久化存储(数据库)中,这可以替代直接文件 I/O、串行化、JDBC 以及 EJB Bean Managed Persistence(BMP)或 Container Managed Persistence(CMP)实体 bean 等方法。
Java Management Extensions【JMX】提供了用于构建分布式、基于 Web、模块化且动态的应用程序的工具,这些应用程序可以用来管理和监视设备、应用程序和服务驱动的网络。
Java Media Framework【JMF】:可以将音频、视频和其他基于时间的媒体添加到 Java 应用程序和 applet 中。
Java Secure Socket Extensions【JSSE】:支持安全的互联网通信,实现了 SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)的 Java 版本,包含数据加密、服务器身份验证、消息完整性和可选的客户机身份验证等功能。
Java Speech API【JSAPI】:包含 Grammar Format【JSGF】和 Markup Language【JSML】规范,使 Java 应用程序能够将语音技术集成到用户界面中。JSAPI 定义一个跨平台的 API,支持命令和控制识别器、听写系统和语音识别器。
Java 3D API【Java 3D】:它提供一套面向对象的接口,这些接口支持一个简单的高级编程模型,开发人员可以使用这个 API 轻松地将可伸缩的独立于平台的 3D 图形集成到 Java 应用程序中。
Metadata Facility【JMI】:允许给类、接口、字段和方法标上特定的属性,从而使开发工具、部署工具和运行时库能够以特殊方式处理它们,Java元数据接口(使用Annotation实现)
Java Content Repository API:用于访问 Java SE 中独立于实现的内容存储库的 API。内容存储库是一个高级信息管理系统,它是传统数据存储库的超集。
Concurrency Utilities:一套中级实用程序,提供了并发程序中常用的功能。
Juxtapose【JXTA】:一个用来解决P2P计算的开放的网络计算平台。JXTA P2P平台使开发者在其上建立PtoP的应用。 - Java EE中的规范:
Java Database Connectivity【JDBC】:使用户能够从 Java 代码中访问大多数表格式数据源,提供了对许多 SQL 数据库的跨 DBMS 连接能力,并可以访问其他表格式数据源,比如电子表格或平面文件。
Java Naming and Directory Interface【JNDI】:为 Java 应用程序提供一个连接到企业中的多个命名和目录服务的统一接口,可以无缝地连接结构不同的企业命名和目录服务。
Enterprise JavaBeans【EJB】: J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑,由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务,例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是,EJB并不是实现J2EE的唯一途径。正是由于J2EE的开放性,使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。
Remote Method Invoke【RMI】: 正如其名字所表示的那样,RMI协议调用远程对象上方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。
Java IDL/CORBA:在Java IDL的支持下,开发人员可以将Java和CORBA集成在一起。 他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径,通过它Java可以被用于将你的新的应用和旧的系统相集成。
Portlet Specification:定义了一套用于 Java 门户计算的 API,可以解决聚合、个人化、表示和安全性方面的问题。
JavaMail:提供了一套对邮件系统进行建模的抽象类。
Java Message Service【JMS】:为所有与 JMS 技术兼容的消息传递系统定义一套通用的消息概念和编程策略,从而支持开发可移植的基于消息的 Java 应用程序。
JavaServer Faces【JSF】:提供一个编程模型,帮助开发人员将可重用 UI 组件组合在页面中,将这些组件连接到应用程序数据源,将客户机生成的事件连接到服务器端事件处理程序,从而轻松地组建 Web 应用程序。
JavaServer Pages【JSP】:允许 Web 开发人员快速地开发和轻松地维护动态的独立于平台的 Web 页面,并将用户界面和内容生成隔离开,这样设计人员就能够修改页面布局而不必修改动态内容。这种技术使用类似 XML 的标记来封装为页面生成内容的逻辑。
Java Servlets:提供一种基于组件的独立于平台的方法,可以构建基于 Web 的应用程序,同时避免 CGI 程序的性能限制,从而扩展并增强 Web 服务器的功能。
J2EE Connector Architecture【JCA】:为将 J2EE 平台连接到各种结构的 Enterprise Information Systems(EIS)定义了一个标准的体系结构,它定义了一套可伸缩的安全的事务性机制,使 EIS 厂商能够提供标准的资源适配器,可以将这些资源适配器插入应用服务器中。
J2EE Management Specification【JMX】:为 J2EE 平台定义了一个信息管理模型。根据其设计,J2EE Management Model 可与多种管理系统和协议进行互操作;包含模型到 Common Information Model(CIM)的标准映射,CIM 是一个 SNMP Management Information Base(MIB);还可以通过一个驻留在服务器上的 EJB 组件 —— J2EE Management EJB Component【MEJB】 —— 映射到 Java 对象模型。
Java Transaction API【JTA】:是一个独立于实现和协议的高级 API,它使应用程序和应用服务器可以访问事务。
Java Transaction Service【JTS】:JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范,并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务……
Java Authentication and Authorization Service【JAAS】:实现了标准的 Pluggable Authentication Module(PAM)框架的 Java 版本并支持基于用户的授权,使服务能够对用户进行身份验证和访问控制。
JavaBeans Activation Framework【JAF】:JavaMail利用JAF来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象,或者转换自Java对象。大多数应用都可以不需要直接使用JAF。
Java API for XML Web Service【JAX-WS】:一组XML web services的JAVA API。JAX-WS允许开发者可以选择RPC-oriented或者message-oriented 来实现自己的web services。
Java API for XML Processing【JAXP】:允许 Java 应用程序独立于特定的 XML 处理实现对 XML 文档进行解析和转换,允许灵活地在 XML 处理程序之间进行切换,而不需要修改应用程序代码。
Java API for XML Binding【JAXB】:允许在 XML 文档和 Java 对象之间进行自动的映射。
SOAP with Attachments API for Java【SAAJ】:使开发人员能够按照 SOAP 1.1 规范和 SOAP with Attachments note 生成和消费消息。
Streaming API for XML【StAX】:就提供了两种方法来处理 XML:文档对象模型(DOM)方法是用标准的对象模型表示 XML 文档;Simple API for XML (SAX) 方法使用应用程序提供的事件处理程序来处理 XML。JSR-173 提出了一种面向流的新方法:Streaming API for XML (StAX)。其最终版本于 2004 年 3 月发布,并成为了 JAXP 1.4(将包含在即将发布的 Java 6 中)的一部分。
Java API for XML Registries【JAXR】:提供了一种统一和标准的Java API,用于访问不同类型的基于XML的元数据注册中心。JAXR目前实现支持ebXML Registry2.0版和UDDI2.0版。未来可以支持更多的类似的注册中心。JAXR为客户端提供了API,与XML注册中心进行交互,同时为服务中心提供者提供了服务提供者接口(SPI),这样,注册中心的实现是可插拔的。JAXR API将应用代码与下层的注册中心机制相隔离。当编写基于JAXR的客户端浏览和操作注册中心时,当注册中心更换时,比如从UDDI更换为ebXML,代码不需要进行修改。
Java Persistence API【JPA】:通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中,一个标准的ORM框架。
Java Authorization Service Provider Contract for Containers【JACC】:在J2EE应用服务器和特定的授权认证服务器之间定义了一个连接的协约,以便将各种授权认证服务器插入到J2EE产品中去。
Java API for RESTful Web Services【JAX-RS】:定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架。同时,JAX-RS 使用 POJO 编程模型和基于标注的配置,并集成了 JAXB,从而可以有效缩短 REST 应用的开发周期。 - Java ME中的规范:
Connected Limited Device Configuration【CLDC】:是组成资源有限的移动信息设备的 Java 运行时环境的两种配置之一。CLDC 描述最基本的库和虚拟机特性,所有包含 K 虚拟机(K virtual machine,KVM)的 J2ME 环境实现中都必须提供这些库和特性。
Mobile Information Device Profile【MIDP】:是组成资源有限的移动信息设备的 Java 运行时环境的两种配置之一。MIDP 提供核心应用程序功能,包括用户界面、网络连接、本地数据存储和应用程序生命周期管理。
Connected Device Configuration【CDC】:是一个基于标准的框架,用来构建和交付可以跨许多连接网络的消费类设备和嵌入式设备共享的应用程序。
Mobile 3D Graphics API for J2ME【M3G】:是一种轻量的交互式 3D 图形 API,它作为可选的包与 J2ME 和 MIDP 结合使用。
步骤一:书写.java源代码
步骤二:使用javac命令编译.java源代码,将该代码编译成.class字节码
步骤三:使用java命令运行.class字节码
- 使用javac命令的时候:如果.java里面没有public的class,直接针对class的定义进行编译操作,这种情况下,.java源文件的文件名只要和里面的任何一个类的类名一致就可以了;如果.java里面定义了一个类是public的,这种情况下,.java源文件的名称只能和这个类的类名保持一致,否则编译不会通过。
- 使用java命令的时候:在使用java命令的时候,后边敲入命令不需要填写文件全名【不需要java ClassName.class格式】,只是需要填写类名就可以了,这种情况下,JVM会在ClassName对应的类定义里面去寻找主函数入口,如果找不到就会抛出异常,找到过后就可以执行,也可以这样讲,包含主函数的类不一定在一个public的类里面可以是非public的。
- Java应用程序在执行的时候,必须有一个主函数的入口【*:这里不包括Applet的运行,因为Applet里面有特殊的入口以及特殊的运行机制】,而且该主函数的入口必须定义为:public static void main(String args[])
- 这里还有一点需要说明:main函数是可以抛异常的,JVM在检查方法签名的时候,不会检查main后边带的异常定义,比如下边这种方式也是定义函数入口的正确方式,也就是说带异常抛出的时候仅仅检测方法签名就可以了:
public static void main(String args[]) throws Exception - 注意主函数传入参数的使用,args参数实际上就是在使用java命令的时候传入的参数的值的使用,这些使用可以通过写几个简单的程序来实现,在参数使用的过程里面,一般情况下在编写程序的时候针对参数进行一定的检测,上边使用参数的代码实际上是会抛异常的,因为会存在数组越界的问题,为了保证数据不会越界,一般可以通过代码if( args.length > 0 )来对传入的参数进行判断,而且把使用参数的代码放在try-catch块里面进行数组越界异常的捕捉。
生成的文档是HTML格式的,而这些HTML格式的标识符并不是javadoc加的,而是我们在写注释的时候写上去的。因此在格式化文档的时候需要适当地加入HTML标签,例如:
/**
*This is first line.<br/>
*This is second line.<br/>
*This is third line.<br/>
**/
[2]文档注释的三部分:
根据在文档中显示的效果,文档注释可以分为三个部分,这里举个例子:
/**
*testDoc方法的简单描述
*<p>testDoc方法的详细说明</p>
*@param testInput String 打印输入的字符串
*@return 没有任何返回值
**/
public void testDoc(String testInput)
{
System.out.println(testInput);
}
简述:文档中,对于属性和方法都是现有一个列表,然后才在后面一个一个的详细说明,列表中属性名或者方法名后面那段说明都是简述。
详细说明:该部门对属性或者方法进行了详细说明,在格式上不需要特殊的要求,可以写成前边讲的HTML的格式,如同上边第二行的内容。【*:这里有个技巧就是简述和详细说明尽量不要重复,在简述中出现过的内容不需要在详细说明中进行第二次描述,可以理解为详细说明是简述的一种扩展。后边章节的概念说明代码大部分我都没有写注释,也请各位读者见谅!】
特殊说明:除开上边的两部分,最后一个部分就是特殊说明部分,特殊说明部分使用JavaDoc标记进行,这些都是JavaDoc工具能够解析的特殊标记,这一点下边章节将会讲到
[3]使用javadoc标记:
javadoc标记是java插入文档注释中的特殊标记,它们用于识别代码中的特殊引用。javadoc标记由“@”以及其后跟着的标记类型和专用注释引用组成。它的格式包含了三个部分:
@、标记类型、专用注释引用
有时候我们也可以直接理解为两个方面:@和标记类型、专用注释引用;Javadoc工具可以解析Java文档注释中嵌入的特殊标记,这些文档标记可以帮助自动从源代码生成完整的格式化API,标记用“@”符号开头,区分大小写,必须按照正确的大小写字母输入。标记必须从一行的开头开始,否则会被视为普通文本,而且按照规定应将相同名字的标记放一起,比如所有的@see标记应该放到一起,接下来看一看每一种标记的含义。
- 对于Javadoc 1.2,使用{@link}标记,这将在需要的地方创建内嵌链接,如:
/**
*@deprecated 在JDK X.X中,被{@link #methodName(paramList)}取代
**/
【*:在上边的标记里面X.X指代JDK的版本,后边的链接链接的是方法的签名,methodName为方法名,paramList为参数列表】 - 对于Javadoc 1.1,标准格式是为每个@deprecated标记创建@see标记(它不可内嵌)
- @see “string” 注:该形式在JDK 1.2中没有用,它不打印引用文本
为string添加文本项,不产生链接,string是通过该URL不可用的书籍或者其他信息引用,Javadoc通过查找第一个字符为双引号(")的情形来区分它前边的情况,比如:
@see "这是Java教材,主要是提供给初学者"
上边的注释将会生成:
参见:
“这是Java教材,主要是提供给初学者” - @see <a href="page.html#section">Java某章节</a>
添加URL#value定义的链接,其中URL#value是相对URL或者绝对URL,JavaDoc工具通过查找第一个字符小写符号(<)区分它与其他情况,比如:
@see <a href="page.html#section">测试规范</a>
上边的注释将会生成:
参见:
测试规范 - @see package.class#member label【比较常用的一种格式】
添加带可见文本label的链接,它指向Java语言中指定名字的文档。其中label是可选的,如果省略,则名字作为可见文本出现,而且嵌在<code>HTML标记中,当想要缩写可见文本或不同于名字的可见文本的时候,可以使用label。
——package.class#member是Java语言中的任何有效名字——包名、类名、接口名、构造函数名、方法名或域名——除了用hash字符(#)取代成员名前面的点之外,如果该名字位于带文档的类中,则Javadoc将自动创建到它的链接,要创建到外部的引用链接,可使用-link选项,使用另外两种@see形式中的任何一种引用不属于引用类的名字的文档。
——label是可选文本,它是链接的可见标签,label可包含空白,如果省略label,则将显示package.class.member,并相对于当前类和包适当缩短
——空格是package.class#member和label之间的分界符,括号内的空格不表示标签的开始,因此在方法各参数之间可使用空格@see package.class#member的典型形式 引用当前类的成员
@see #field
@see #method(Type,Type,...)
@see #method(Type argname,Type argname,...)引用当前包或导入包中的其他类
@see Class#field
@see Class#method(Type,Type,...)
@see Class#method(Type argname,Type argname,...)
@see Class引用其他包(全限定)
@see package.Class#field
@see package.Class#method(Type,Type,...)
@see package.Class#method(Type argname,Type argname,...)
@see package.Class
@see package简单说明一下:
——第一套形式(没有类和包)将导致 Javadoc 仅搜索当前类层次。它将查找当前类或接口、其父类或超接口、或其包含类或接口的成员。它不会搜索当前包的其余部分或其他包(搜索步骤 4-5)。
——如果任何方法或构造函数输入为不带括号的名字,例如 getValue,且如果没有具有相同名字的域,则 Javadoc 将正确创建到它的链接,但是将显示警告信息,提示添加括号和参数。如果该方法被重载,则 Javadoc 将链接到它搜索到的第一个未指定方法。
——对于所有形式,内部类必须指定为 outer.inner,而不是简单的 inner。
——如上所述,hash 字符(#)而不是点(.)用于分隔类和成员。这使 Javadoc 可正确解析,因为点还用于分隔类、内部类、包和子包。当 hash 字符(#)是第一个字符时,它是绝对不可少的。但是,在其他情况下,Javadoc 通常不严格,并允许在不产生歧义时使用点号,但是它将显示警告。
- 当前类或接口
- 任何包含类和接口,先搜索最近的
- 任何父类和超接口,先搜索最近的
- 当前包
- 任何导入包、类和接口,按导入语句的次序搜索
/**
- 在一个方法的主要描述块,在这种情况下,主要描述是整个继承树结构里面的类和接口的一个拷贝。
- 在文本参数返回的@return @param和@throws等方法标记,在这种情况下,文本标记是整个层次结构里面标签的拷贝。
标识符的选择并不是任意的,Java语言规定标识符由字母、数字、下划线和美元符号($)组成,并且第一个字符不能是数字,例如以下都是合法的标识符:
num、user3、price$、book_name、MIN_VALUE
Java标识符中的字符是区分大小写的,如name和Name是两个不同的标识符。Java中所谓的字母并不只包含英文字母、数字及一些常用符号。Java语言使用的是Unicode标准字符集中的字符,Unicode字符集最多可以识别65536个字符,其前128个字符与ASCII码表中的字符对应。其余的字符中就包含了世界上大部分语言中的“字母表”中的字母,大部分国家“字母表”中的字母都是Unicode字符集中的一个字符,如汉字中的“礼”字就是Unicode字符集中的第31036个字符。因此,Java可使用的字符不仅可以是英文字母等,也可以是汉字、朝鲜文、俄文、希腊字母以及其他许多语言中的文字。
数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。接触每种语言的时候,都会存在数据类型的认识,有复杂的、简单的。各种数据类型都需要在学习初期去了解,Java是强类型语言,所以Java对于数据类型的规范相对严格。数据类型是语言的抽象原子概念,可以说是语言中最基本的单元定义,在Java里面,本质上数据类型分为两种:简单类型和复杂类型。
简单类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。
复杂类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
i.Java中的基本类型:
1)概念:
Java中的简单类型从概念上分为四种:实数、整数、字符、布尔值。但是有一点需要说明的是,Java里面有八种原始类型,其列表如下:
实数:double、float
整数:byte、short、int、long
字符:char
布尔值:boolean
复杂类型和基本类型的内存模型本质上不一样,简单数据类型的存储原理:所有的简单数据类型不存在“引用”概念,简单数据类型直接存储在内存中的内存栈上,数据本身的值存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其他的只要是继承于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。
2)原始类型特征:
Java的简单数据讲解列表如下:
int:int为整数类型,在存储的时候,用4个字节存储,范围为-2,147,483,648到2,147,483,647,在变量初始化的时候,int类型的默认值为0。
short:short也属于整数类型,在存储的时候,用2个字节存储,范围为-32,768到32,767,在变量初始化的时候,short类型的默认值为0,一般情况下,因为Java本身转型的原因,可以直接写为0。
long:long也属于整数类型,在存储的时候,用8个字节存储,范围为-9,223,372,036,854,775,808到9,223,372,036, 854,775,807,在变量初始化的时候,long类型的默认值为0L或0l,也可直接写为0。
byte:byte同样属于整数类型,在存储的时候,用1个字节来存储,范围为-128到127,在变量初始化的时候,byte类型的默认值也为0。
float:float属于实数类型,在存储的时候,用4个字节来存储,范围为32位IEEEE 754单精度范围,在变量初始化的时候,float的默认值为0.0f或0.0F,在初始化的时候可以写0.0。
double:double同样属于实数类型,在存储的时候,用8个字节来存储,范围为64位IEEE 754双精度范围,在变量初始化的时候,double的默认值为0.0。
char:char属于字符类型,在存储的时候用2个字节来存储,因为Java本身的字符集不是用ASCII码来进行存储,是使用的16位Unicode字符集,它的字符范围即是Unicode的字符范围,在变量初始化的时候,char类型的默认值为'u0000'。
boolean:boolean属于布尔类型,在存储的时候不使用字节,仅仅使用1位来存储,范围仅仅为0和1,其字面量为true和false,而boolean变量在初始化的时候变量的默认值为false。
——[$]提供一个字面量赋值的例子——
3)自动拆箱(AutoBox):
Java里面,每一种原始类型都对应着相应的包装类型,在JDK1.5之前(不包含JDK1.5),当包装类和原始类型进行相互转换的时候,需要调用包装类型的方法进行转换,不能通过操作符进行直接的计算。下边是一个原始类型和包装类型的一个对应表:
原始类型 | 对应的包装类型 | 默认值 | 存储格式 | 数据范围 |
short | java.lang.Short | 0 | 2个字节 | -32,768到32767 |
int | java.lang.Integer | 0 | 4个字节 | -2,147,483,648到2,147,483,647 |
byte | java.lang.Byte | 0 | 1个字节 | -128到127 |
char | java.lang.Character | /u0000 | 2个字节 | Unicode的字符范围 |
long | java.lang.Long | 0L或0l | 8个字节 | -9,223,372,036,854,775,808到9,223,372,036, 854,775,807 |
float | java.lang.Float | 0.0F或0.0f | 4个字节 | 32位IEEEE 754单精度范围 |
double | java.lang.Double | 0.0或0.0D(d) | 8个字节 | 64位IEEE 754双精度范围 |
boolean | java.lang.Boolean | false | 1位 | true(1)或false(0) |
简单看看下边这段代码:
(target-type)value
[3]关于类型的自动提升,遵循下边的规则:
所有的byte、short、char类型的值将提升为int类型;
如果有一个操作数是long类型,计算结果是long类型;
如果有一个操作数是float类型,计算结果是float类型;
如果有一个操作数是double类型,计算结果是double类型;
自动类型转换图如下:
byte->short(char)->int->long->float->double
如果是强制转换的时候,就将上边的图反过来
[4]转换附加:
当两个类型进行自动转换的时候,需要满足条件:【1】这两种类型是兼容的,【2】目的类型的数值范围应该比源转换值的范围要大。(上边已经讲过了)而拓展范围就遵循上边的自动类型转换树,当这两个条件都满足的时候,拓展转换才会发生,而对于几个原始类型转换过程,根据兼容性boolean和char应该是独立的,而其他六种类型是可以兼容的,在强制转换过程,唯独可能特殊的是char和int是可以转换的,不过会使用char的ASCII码值比如:
int a = (int)'a';
a的值在转换过后输出的话,值为97;
[5]基础类型的几个常见的代码例子:
——[$]附加转换和精度丢失——
package org.susan.java.basic;
package org.susan.java.basic;
java基础和规范一相关推荐
- 黑马程序员:Java基础总结----Java语言编程规范
黑马程序员:Java基础总结 Java语言编程规范:参考自SUN公司文档 ASP.Net+Android+IO开发..Net培训.期待与您交流! I. 排版规范 A. 规 ...
- java代码规范插件_「Java基础知识」代码规范插件怎么用
原标题:「Java基础知识」代码规范插件怎么用 在开发中,好的编程风格可以提升团队合作能力,提升开发的效率,但是每个人都有自己的编程习惯,如何能够将大家的编程风格统一,这个在团队中也很重要; 在Jav ...
- java 字符串转骆驼命名_程序员必知的Java基础:5条命名规范和8种数据类型归纳...
原标题:程序员必知的Java基础:5条命名规范和8种数据类型归纳 一.Java命名规范 任何一种语言都有一套针对于语言自身的命名的规范,java也不例外.接下来,我就列举一下java对命名的规范. 下 ...
- Java笔记整理-02.Java基础语法
1,标识符 由英文字母.数字._(下划线)和$组成,长度不限.其中英文字母包含大写字母(A-Z)和小写字母(a-z),数字包含0到9. 标识符的第一个字符不能是数字(即标识符不能以数字开头). 标识符 ...
- Java基础概念性的知识总结
属于个人的所学的知识总结,不是全面的 1.JDK.JRE和JVM三者的区别 01.JDK:(Java Development ToolKit)Java开发工具包,是整个Java的核心.包括了Java的 ...
- 我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!...
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:hsm_computer www.cnblogs.com/J ...
- Java基础、多线程、JVM、集合八股文自述(持续更新)
Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...
- Java基础教程,第三讲,运算符 变量定义 数据类型转换
2019独角兽企业重金招聘Python工程师标准>>> 学完此次课程,我能做什么? 学完此次课程我们可以学会Java的运算符,以及数据类型的自动转换和强制转换. 学习此次课程,需要多 ...
- Java基础看jvm,JAVA基础知识|java虚拟机(JVM)
一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...
最新文章
- java生成函数excel_java实现在excel中创建及读取公式
- Android如何客制化adb shell进去后显示shell@xxxx的标识
- python 获取中文文件名的输出
- 深度解密Go语言之scheduler
- Electron使用NodeJS扩展模块调用DLL
- 也说电影《魔比斯环》
- 一个数据包的旅程_数据科学语言的个人旅程
- iPhone5捣鼓mobile terminal
- Java中native方法的使用
- 刚接触Linux服务器,如何变成可视化的操作界面?
- 饼图-图例标记及文字的设置
- (视频分辨率介绍)混淆的概念:SIF与CIF、4CIF与D1
- 登录服务器时显示 IE COOKIE阻止,[IE问题]IE相关设置-智明协同
- 2017会考计算机知识点,【高考备考】2017高二化学会考知识点汇总高中化学会考知识点...
- 用python语言怎么打出菱形的*号_Python打印“菱形”星号代码方法
- CSS 3种渐变效果(线性渐变,径向渐变,圆锥型渐变)
- 计算机ppt2007考试试题,全国计算机等级考试二级officeppt演示文稿题目
- AVPro Video 插件在unity中动态播放视频
- CFgym:Outer space invaders(区间dp)
- 软件测试梳理 第九节 缺陷和缺陷报告
热门文章
- python 命名管道_详解Python进程间通信之命名管道
- 进入元宇宙的大门会在何处打开?
- Android 接入银联支付
- 如何让计算机听懂指令,4个方法,让自闭症孩子听懂你的话
- CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版
- Android Studio3.xx新的依赖方式 implementation、api、compileOnly详解
- 民用建筑工程给水排水设计深度图样_给水排水工程中几种设计流量的取值
- oozie调度shell脚本
- 电信管理系统的操作思路
- springdatajpa配置多数据源