Java SE 是什么,包括哪些内容(一)?
本文内容参考自Java8标准
备注:Java SE的内容个人觉得需要从两方面来理解,一方面是与代码运行机制相关,一方面是与代码编写规范相关:
一、代码运行机制相关的内容:
- 1、Java语言优势(“比其他语言好在哪里,有什么优势?”):
- ⑴、Java的指导思想:Java语言是基于类的,面向对象的,语言的设计非常简单。 –学习起来也确实非常简单
- ⑵、Java语言与C和C ++相关,但组织方式有所不同,省略了C和C ++的许多方面,并包含了其他语言的一些想法,避免包括新的和未经测试的功能:
举例:- ①、Java语言包括了编译期和运行期,编译期是将.java文件转换为与机器无关(提示:编写一次,到处运行)的字节代码表示,也就是.class文件。运行期首先是加载和链接执行程序所需的类(Java基础类库,比如Java.lang包中的类、import关键字导入的类等),其次是动态优化程序和机器代码的生成(此内容是Java虚拟机自动操作),最后是实际的字节代码(.class文件)执行。由此Java语言明确了编译期错误和运行时错误,编译期错误是指在编译期间(由.java文件变成.class文件期间).java文件中不允许存在哪些内容(一旦存在,就是错误),运行时错误是指在运行期间(Java虚拟机运行.class文件字节码期间).class字节码文件中不允许存在哪些内容(一旦存在,就是错误),最经典的就是除0错误。 –你用任何编辑器,比如记事本,IDE[Eclipse,MyEclipse,Idea]等编写好的Java代码都是一个XXX.java文件,都需要通过"Javac"命令编译生成.class文件,然后Java虚拟机再通过"Java"命令运行.class文件,得到结果。如果你使用的是记事本,你可以在Windows的经典黑窗口中运行"Javac"命令,然后找到编译好的.class文件。如果你使用的是IDE,你仅需要操作它的运行按钮,它会自动帮你进行编译然后再运行。
- ②、Java新增了垃圾收集器,它能动态监测Java代码运行过程中所有对象的状态,并实时判断这些对象是否处于"不再使用"的状态,如果是,则及时将这些对象所占的内存空间释放,从而避免了C和C++中显式释放的安全问题。 –C和C++中是没有垃圾收集器的,程序员只要有一个开辟内存空间的操作,就一定需要一个释放内存空间的操作与之对应,否则就会造成内存泄漏的安全问题,最终导致内存爆满,程序无法继续执行,从实际情况来看,C和C++程序员很容易忘记进行显示释放内存,还有一个比较显著的问题是:Java中的垃圾收集器完美解决了回收对象的时机,无论是小型系统还是大型系统,而C和 C++程序员往往很难判断一个内存空间在何时释放,尤其是在大型系统中,各个对象之间相互依赖,一旦提前释放,会造成一系列不可预知的错误。
- 2、Java虚拟机进行编译时使用的编码以及注意事项(“使用时可能存在的误区”)
- ⑴、Java代码使用的是Unicode编码字符集(高级编程语言都会有编码字符集)),也就是说,虽然你编写代码的时候使用的是a-z,A-Z的字母以及其他的一些诸如"@#¥%……&*()“等符号形式,但是转换成机器码的时候使用的是Unicode规则。目前使用最广泛的Unicode编码规则是"UTF-8” –Java代码中需要使用Unicode编码的内容包括注释中的文字内容,标识符中的文字内容,字符以及字符串中的文字内容,除此以外,代码中的其他内容仅ASCII(美国信息交换标准码)编码就足够了。碰巧的是Unicode-16编码的前128个字符是ASCII字符。
- ⑵、Unicode编码字符集的注意事项有很多,其中有两点需要强调一下,一是编码字符集涉及转义的处理,比如你想在字符串里面包括" “,你如果直接这么表示:String a =“qwert"yui"o”;,是无法得到输出结果:qwert"yui"o的,Java编译器会报错,表示无法同时分辨两对” "。
//想在代码中实现一个" "中包含一个" ",需要将被包含的" "进行转义 //处理,因为声明String类型的时候就需要一对" ",例如: String a = "qwertyuio"; //这个时候如果直接通过System.out.println(a);将a输出在控制台的话 //结果是qwertyuio。如果想输出qwert"yui"o的效果应该怎么处理? //应该对被包含的" "进行转义处理: String a = "qwert\"yui\"o"; 这样处理了以后,\"输出的时候就是"了。 还有其他需要转义的字符,我们后期再了解。
二是Unicode编码字符集中对空格的认定:你在实际的代码编写过程中,代码与代码之间的空格无论有多少,都不会影响最终的执行结果:
二、代码编写规范相关的内容:
-
1、Java代码上下文风格以及Java词汇语法、句式语法(“总体上看它长的什么样子”):
- ⑴、Java代码上下文风格自己找标准规范的代码实例进行参考体会。 –代码实例最好是一个完整的类代码,完整的类代码包括变量声明、方法声明、main方法等,主要是需要注意代码的缩进,保证代码具有层次感。
- ⑵、词汇语法一般是指如何命名Java代码中的类名称、方法名称、变量名称等,因为这些名称即可以是一个单词组成,也可以是多个单词组成,有小写字母,也有大写字母,大小写字母混合也行。甚至是$、下划线、数字、中文、其他字符等。Java中词汇命名的通用规则是:首字母小写,如果名称由多个单词组成,则第二个单词首字母大写,第三个单词首字母又是小写,以此交替。业界称之为"驼峰"命名法。
// 驼峰命名法:名称'adminLogin' public class adminLogin{ //驼峰命名法:名称'adminNumber' public int adminNumber; //驼峰命名法:名称'adminName' public String adminName; //驼峰命名法:名称'adminAddress' public String adminAddress; };
- ⑶、句式语法包括两项内容:一是Java中基础内容的句式,比如如何声明一个类,如何声明一个变量,如何声明一个方法。二是Java中固有的一些句式,比如if…else循环语句、while循环语句、do…while循环语句等 –这里实际上就是说明了Java都有些什么"零件",后期开发你需要在"零件"库里进行取舍,各种搭配,组装自己想要的东西,所以,这些"零件"的功用,你需要完全吃透。
- ①、声明一个类的句式语法:
//声明一个类 public class adminLogin{ };
- ②、声明一个变量的句式语法:
//声明一个变量 public String adminName;
- ③、声明一个方法的句式语法:
//声明一个方法(不带参数) public void add(){ }; //声明一个方法(带一个int类型的参数) public void add(int id){ } //声明一个方法(带一个String类型的返回值) public String add(){ }
- ④、声明一个if…else条件语句:
//声明一个最简if...else语句,只有两种情况 if(条件){ //如果if()中的条件成立,则执行这里的代码,else{}中的代码不会执行 }else{ //如果if中的条件不成立,则执行这里,则if(){}中的代码不会执行 }; //如果存在多种情况,else后面可以继续添加if...else,满足条件的执行, //不满足条件的直接跳过,不执行。 if(条件1){ //如果满足条件1,执行这里的代码 }else if(条件2){ //如果满足条件2,执行这里的代码 }else if(条件3){ //如果满足条件3,执行这里的代码 }else{ //如果条件1、条件2、条件3都不满足,执行这里的代码 }
- ⑤、声明一个switch条件语句:
//声明一个switch条件语句: switch(值){ //如果这个case的值与switch的标的值完全相同,则执行 //它的"执行代码",其他case则不执行 case 值 : 执行代码; break; //如果这个case的值与switch的标的值完全相同,则执行 //它的"执行代码",其他case则不执行 case 值 : 执行代码; break; ... //如果以上所有的case值都与switch的值不相同,则执行 //default的"执行代码",也就是说,default始终是默认执行的代码 default: 执行的代码; }
- ⑥、声明一个while循环语句:
//声明一个while语句,while循环在循环次数上灵活性较大: while(条件){ //当条件成立的时候立即执行,如果条件不成立,则继续进行循环, //或者跳出循环。 }
- ⑦、声明一个for循环语句:
//声明一个for语句,for循环在循环次数上灵活性有限: for(int i=0;i<x;i++){ //i为循环时的初始值,x为循环的次数,i++表示i自增,当i的值自增导致 //i<x不成立时,则循环自动退出。 }
- ⑧、声明一个do…while循环语句:
//声明一个do...while循环语句,do...while循环语句与while循环语句 //唯一的不同就是,do...while循环语句一定会执行一次循环体代码 //再判断循环条件是否成立: do{ //循环内容在这里,一定会执行一次。执行之后判断条是否成立,成立则继续循环 //不成立则推出循环。 }while(条件)
- ①、声明一个类的句式语法:
-
2、Java语言的注释(从程序员角度考虑,额外的人性化配置)
- ⑴、在编写Java代码时,提供了两种注释方法(注释是为了后期回味自己代码的魅力时及时提醒当时的思路是什么,提高工作效率,所以写代码时是极力提倡多写注释的):一是单行注释(//),注释内容不能换行。
二是多行注释(/* */),注释内容可以进行换行,适合注释内容较多时使用
- ⑴、在编写Java代码时,提供了两种注释方法(注释是为了后期回味自己代码的魅力时及时提醒当时的思路是什么,提高工作效率,所以写代码时是极力提倡多写注释的):一是单行注释(//),注释内容不能换行。
-
3、Java语言的核心基础内容
-
⑴、关键字:关键字是Java代码专有的,比如关键字"class"表示声明一个类,关键字"public "、“private”、"protected"表示代码的权限级别,“int”、“float”、“byte”、“double”、“long”、“char”、"boolean"表示声明Java的数据类型 你所编写的代码全部都是英文字母组合成的词组,那么Java编译器在编译的时候如何区分代码里的内容呢?比如,类,方法,变量,参数,静态域,代码执行入口?这就需要通过关键字来区分了,只要代码中出现了"class",就表示一个类,只要出现了"main()",就表示这是代码的执行入口,所以这些内容在代码中都起着关键的识别作用,你在声明一个变量名称或者是类名称或者是方法名称的时候切记不可使用关键字,否则会造成代码混乱,编译器无法识别。
以下为Java的所有关键字:
关键字”const"和"goto"保留(保留的意思就是,虽然现在他们暂时还不是Java关键字,但是你在编写Java代码的时候还是不能随意使用它们,因为很可能突然某一天,他们就成为了Java关键字)。
"true"和"false"看起来像是关键字,但是实际上他们是"boolean"类型的两个值,最好也不要随意使用。同样,虽然"null"看起来像是一个关键字,但是它实际上也是一个值,它表示一个空对象(博文后续会提到它的作用)。 -
⑵、基本变量类型及取值范围 Java是强类型的语言,你在使用一个变量的时候,必须要声明它是什么类型(Java中除了8种基本类型以外,还有一种类型叫做引用类型,所有的引用类型都是对象!),也就是告诉编译器这个变量的类型是什么,它需要多大的空间,也就是取值范围。
- ①、整数类型
整数类型有四种(实际上是有四个关键字,byte、short、int和long),一种是byte类型,一种是short类型,一种是int类型,一种是long类型。
以上四种类型从声明的值本身来说,都是55,没有任何区别,但是从存储这个值的内存空间来说,就有区别了,byte类型是8位1字节存储(也就是55转换成二进制以后,不足8位,需要用0补足:0011 0111),short类型是16位2字节存储(也就是55转换成二进制以后,不足16位,需要用0补足:0000 0000 0011 0111),int类型是32位4字节存储(也就是55转换成2进制表示以后,不足32位,需要用0补足:0000 0000 0000 0000 0000 0000 0011 0111),long类型是64位8字节(也就是55转换成2进制表示以后,不足64位,需要用0补足:0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0011 0111)、所以byte类型的范围是-28–28-1,short类型的范围是-216–216-1,int类型的范围是-231–231-1,long类型的范围是-263–263-1(有一位充当了符号位,0表示正数,1表示,负数),可以预估程序后期的数据范围情况进行byte、short、int和long四种类型间的取舍,以节约内存空间,有关负数以及为什么范围在正数这边需要进行减一,请关注后续博文中有关类型转换的说明。//声明一个byte类型 public byte Number = 55; //声明一个short类型 public short Number = 55; //声明一个int类型: public int Number = 55; //声明一个long类型,有两种方法,后缀是"L"或者是"l"都行,如果 //不带后缀,Java编译器默认就是Int类型,也就意味着存储空间和 //取值范围全部都以int类型为准: public long Number = 55L; public long Number1 = 55l;
- ②、浮点数类型
浮点数类型有两种(实际上是有两个关键字,float和double),一种是float类型,一种是double类型。//声明一个double类型: public double Number = 55.3; //声明一个float类型,有两种方法,后缀是"F"或者是"f"都行,如果 //不带后缀,Java编译器默认就是double类型,也就意味着存储空间和 //取值范围全部都以double类型为准: public float Number = 55.3F; public float Number1 = 55.3f; //如果不带后缀直接声明,编译器会报错,因为Java编译器默认 //的浮点数类型就是double,你如果不带后缀,那么一个double类型 //是不能赋值给一个float类型变量的。 public float Number = 55.3(这种不带后缀的float类型 是不能通过编译的);
以上两种类型从声明的值本身来说,都是55.3,没有任何区别,但是从存储这个值的内存空间来说,就有区别了。float是32位,double是64位,但是这里的32位和64位与整数的32位和64位又有区别,不是单纯的二进制位数表示,因为浮点数的组成较整数复杂,有整数部分,有一个".",还有一小数部分,所以在业界为了规范浮点数的表示,有一个叫做"IEEE 754"的标准("IEEE 754"可自行了解),float类型使用的是"IEEE 754"的32位表示法表示,取值范围是1.40e-45–3.4028235e38。double使用的是"IEEE 754"的64位表示法表示,取值范围是4.9e-324–1.7976931348623157e308,这里提一个题外话,后期博文会单独重点说明,就是浮点数的字面量计算不是很精确,Java通过实现专门的类解决了浮点数运算的精度问题。举一个例子:浮点数是没有办法精确的表示0.1的(至于为什么,可以自行百度),所以你用0.1去乘以或者是除以任何其他整数或者是浮点数,得出的结果都不精确,会有一定的偏差。
浮点数运算正确的编程方式(通过类和方法解决,这里只是提以下,详细的解释请继续关注后期更新的博文):
- ③、布尔类型(布尔是一个科学家的名字):
布尔类型(关键字为:boolean)的特殊之处在于它的取值范围只有两个值:一个是"true",一个是"false",说白了就是要么是真,要么就是假。它的存储空间按照官方文档的解释是4字节(因为处理器处理的单位就是4个字节,所以就定义为4字节,也就是32位,但是如果将boolean类型存储在数组中,则每个boolean类型就是用1个字节存储了,就是8位,实际上Java虚拟机还是会将boolean类型转换为int类型来存储的,但是表现在计算机屏幕上,你看到的就是"true"和"false"两种形式),个人觉得布尔类型主要运用于两个方面:一是程序流程的控制:如果条件为真(成立),走哪个流程,如果条件为假(不成立),走哪个流程,代码实际运用就是if…else语句的判断选择。二是循环与否的选择,如果条件为真(成立),则进入循环体循环,如果条件为假(不成立),则跳出循环,不再运行循环体内的代码。代码实际运用就是for和while循环的判断选择,因为for和while循环前都需要进行条件真假的判断。//声明一个boolean类型: public boolean flag = true; public boolean flag = false;
- ④、字符类型
字符类型(关键字为:char)是用来表示单个字符的(一定是单个的,
但是C和C++中允许多个):
比如:
单个字符声明可以通过编译://声明一个char类型,char类型是用单引号(' ')括起来的单个字符: public char a = 'a'; public char b = 'b'; public char c = '5';
多个字符声明不能通过编译,多个字符应该声明为字符串(一般编程中都是使用字符串,字符串不是基本类型,是一个对象,后续博文中会详细解读)。
字符串类型的关键字是"String",多个字符声明为字符串类型可以通过编译:
字符类型在编程中是用来表示单个字符的,比如’a’、‘b’、’#’、’@’、’%’、因为在某些编程领域,你是需要用到这些字符的,如果没有char类型,那么你无法用其他类型来表示这些字符。这里需要强调一个问题:就是编程中经常会涉及到char类型和int类型之间的相互转换(通过转换我们可以知道,char类型的取值范围用字符来说就是’\u0000’ to ‘\uffff’,用short来表示就是0-65535,它没有负数表示。),这里,我们需要了解一下char类型的本质,虽然说char类型是用来表示一些字母,特殊符号等,但是这些字母,特殊符号你是不能随意写的,而是有一张专门的表来管理的,表中的所有字符都会有一个相应的编号,而这个编号是用一个short类型的变量保存的,你如果在代码中直接声明char a = ‘a’;那么Java编译器会在表中查找’a’的编号是多少,然后将这个编号的值放进char a 这个变量中保存(而不是直接保存’a’),所以char类型实际上是16位,与short类型一致,唯一与short类型不一致的就是char类型在电脑屏幕上面的表现形式,比如97,short类型在电脑屏幕上的表现形式就是97,但是char类型在电脑屏幕上的表现形式就是’a’,说明了’a’在字符表中的编号就是97,而’A’在字符表中的编号是65,有兴趣的话,可以去了解一下字符表(字符在编程中比较常用的情况出现在I/O输入输出流中,用read方法(不带任何缓冲的原始方法)从流中读取出来的都是一个一个数字形式,你如果想在电脑屏幕上显示出它是什么字符,需要通过类型强制转换成char类型才能显示出相应的字符)。
直接在控制台打印输出十六进制的Unicode码:
- ①、整数类型
-
⑶、分隔符以及运算符
- ①、分隔符比较好理解,一般是划分程序代码中范围的符号,比如类方法、循环体等范围是用"{ }“区分,所以”{“和”}“一定是成对出现的、方法参数、强制类型转换是用”()"、所以"(“和”)“也是成对出现的、数组是用”[ ]“表示、一行程序代码的结束是用”;“表示、多个相同变量的声明是用”,"分隔表示。这些在平常的编写代码过程中需要注意积累,主要避免因错误使用分而导致编译期错误。
- ②、运算符:Java官方文档总共有38个运算符。
分别是:
具体每个运算符如何使用,请关注后续博文更新。
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正!
-