一 Java主类结构
Java语言是面向对象的程序设计语言,Java程序的基本组成单元是类, 类体中又包括属性与方法两部分。
在 Eclipse下依次创建项目、 包合类。
package test.tst;
public class App
{
static String str1="Hello";
public static void main( String[] args )
{
String str2 = " world !!!";
System.out.println( str1 + str2 );
}
}
运行结果:
1.1 包声明
包声明一个Java应用程序是由若干个类组成的。
1.2 声明成员变量和局部变量
通常将类的属性称之为类的全局变量(成员变量),将方法中的属性称之为局部变量。全局变量声明在类体中,局部变量声明在方法体中。全局变量和局部变量都有各自的应用范围。
1.3 编写主方法
main()方法是类体中的主方法。该方法从“{”号开始,至“}”号结束。public、static和void分别是main()方法的权限修饰符、静态修饰符和返回值修饰符,Java程序中的main()方法必须声明为public static void。String[]args是一个字符串类型的数组,它是main()方法的参数。main()方法是程序开始执行的位置。
二 基本数据类型
基本数据类型在Java中有8种基本数据类型来存储数值、字符和布尔 值
2.1 整数类型
整数类型用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整型数据在Java程序中有3种表示形式,分别为十进制、八进制和十六进制。
十进制:十进制的表现形式大家都很熟悉,如120、0、-127。注意不能以0作为十进制数的开头(0除外)。
八进制:如0123(转换成十进制数为83)、-0123(转换成十进制数为-83)。注意八进制必须以0开头。
十六进制:如0x25(转换成十进制数为37)、0Xb01e(转换成十进制数为45086)。注意十六进制必须以0X或0x开头。
整型数据根据它所占内存大小的不同,可分为byte、short、int和long 4种类型。它们具有不同的取值范围。
在定义以上4种类型变量时,要注意变量的取值范围,超出相应范围就会出错。对于long型值,若赋给的值大于int型的最大值或小于int型的最小值,则需要在数字后加L或l,表示该数值为长整数,如longnum=2147483650L。
2.2 浮点类型
浮点类型表示有小数部分的数字。Java语言中浮点类型分为单精度浮点类型(float)和双精度浮点类型(double),它们具有不同的取值范围。
在默认情况下小数都被看作double型,若使用float型小数,则需要在小数后面添加F或f。可以使用后缀d或D来明确表明这是一个double类型数据,不加“d”不会出错,但声明float型变量时如果不加“f”,系统会认为变量是double类型而出错。如下所示:
float f1 = 13.23f;
double d1 = 4567.12d;
double d2 = 1234.1245;
2.3 字符类型
字符类型(char)用于存储单个字符,占用16位(两个字节)的内存空间。在定义字符型变量时,要以单引号表示,如“s”表示一个字符。而“s”则表示一个字符串,虽然只有一个字符,但由于使用双引号,它仍然表示字符串,而不是字符。
由于unicode编码采用无符号编码,可以存储65536个字符(0x0000~0xffff),所以Java中的字符几乎可以处理所有国家的语言文字。若想得到一个0~65536之间的数所代表的unicode表中相应位置上的字符,也必须使用char型显式转换。
2.4 转义字符
转义字符是一种特殊的字符变量,它以反斜线“\”开头,后跟一个或多个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”。
2.5 布尔类型
布尔类型又称逻辑类型,通过关键字boolean来定义布尔类型变量,只有true和false两个值,分别代表布尔逻辑中的“真”和“假”。布尔值不能与整数类型进行转换。布尔类型通常被用在流程控制中作为判断条件。
三 变量与常量
在程序执行过程中,其值不能被改变的量称为常量,常量,其值能被改变的量称为变量。变量与常量的命名都必须使用合法的标识符。
3.1 标识符和关键字
标识符
标识符可以简单地理解为一个名字,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。Java语言规定标识符由任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字。标识符不能是Java中的保留关键字。
合法标识符:
name
user_id
$test
非法标识符:
4name
String
User name
在Java语言中标识符中的字母是严格区分大小写的,如good和Good是不同的两个标识符。 Java语言使用unicode标准字符集,最多可以标识65535个字符,因此,Java语言中的字母不仅包括通常的拉丁拉丁文字a、b、c等,还包括汉字、日文以及其他许多语言中的文字。
关键字
关键字是Java语言中已经被赋予特定意义的一些单词,不可以把这些字作为标识符来使用。
3.2 声明变量
变量的使用是程序设计中一个十分重要的环节。定义变量就是要告诉编译器(compiler)这个变量的数据类型,这样编译器才知道需要配置多少空间给它,以及它能存放什么样的数据。在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量。为了便于操作,给这个空间取个名字,称为变量名。变量的命名必须是合法的标识符。内存空间内的值就是变量值。在声明变量时可以是没有赋值,也可以是直接赋给初值。
示例代码:
int age;
char char1 = 'r';
图解的方式将上例代码在内存中表现出来,如下图
由图可知,系统的内存可大略分为3个区域,即系统区(OS)、程序区(Program)和数据区(Data)。当程序执行时,程序代码会加载到内存中的程序区,数据暂时存储在数据区中。假设上述两个变量定义在方法体中,则程序加载到程序区中。当执行此行程序代码时,会在数据区配置空间给出这两个变量。
对于变量的命名并不是任意的,应遵循以下几条规则:
变量名必须是一个有效的标识符。
变量名不可以使用Java中的关键字。
变量名不能重复。
应选择有意义的单词作为变量名。
3.3 声明常量
在程序运行过程中一直不会改变的量称为常量(constant),通常也被称为“final变量”。常量在整个程序中只能被赋值一次。在为所有的对象共享值时,常量是非常有用的。
在Java语言中声明一个常量,除了要指定数据类型外,还需要通过final关键字进行限定。常量名通常使用大写字母,但这并不是必须的。
final double PI = 3.1415926D;
final boolean BOOL = true;
当定义的final变量属于“成员变量” 时,必须在定义时就设定它的初值,否则将会产生编译错误。
3.4 变量的有效范围
成员变量
在类体中所定义的变量被称为成员变量,成员变量在整个类中都有效。类的成员变量又可分为两种,即静态变量和实例变量。声明静态变量和实例变量,实例代码如下:
class var{
int x = 100;
static int y = 80;
}
其中,x为实例变量,y为静态变量(也称类变量)。如果在成员变量的类型前面加上关键字static,这样的成员变量称为静态变量。静态变量的有效范围可以跨类,甚至可达到整个应用程序之内。对于静态变量,除了能在定义它的类内存取,还能直接以“类名.静态变量”的方式在其他类内使用。
局部变量
在类的方法体中定义的变量(方法内部定义,“{”与“}”之间的代码中声明的变量)称为局部变量。局部变量只在当前代码块中有效。
在类的方法中声明的变量,包括方法的参数,都属于局部变量。局部变量只在当前定义的方法内有效,不能用于类的其他方法中。局部变量的生命周期取决于方法,当方法被调用时,Java虚拟机为方法中的局部变量分配内存空间,当该方法的调用结束后,则会释放方法中局部变量占用的内存空间,局部变量也将会销毁。
局部变量可与成员变量的名字相同,此时成员变量将被隐藏,即这个成员变量在此方法中暂时失效。
变量的有效范围:
四 运算符
4.1 赋值运算符
赋值运算符以符号“=”表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。
int a = 100;
int b = 200;
int c = a + b;
由于赋值运算符“=”处理时会先取得右方表达式处理后的结果,因此一个表达式中若含有两个以上的“=”的“=”运算符,会从最右方的“=”开始处理。
4.2 算术运算符
Java中的算术运算符主要有+(加)、-(减)、*(乘)、/(除)、%(求余),它们都是二元运算符。
4.3 自增和自减运算符
自增、自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。放在操作元前面的自增、自减运算符,会先将变量的值加1(减1),然后再使该变量参与表达式的运算。放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量加1(减1)。
++a(--a) //表示在使用变量a之前,先使a的值加(减)1
a++(a--) //表示在使用变量a之后,使a的值加(减)1
a = 10;
b = ++a; //先将a的值加1,然后赋值给b,此时a的值为11,b的值为11
b = a++; //先将a的值赋给b,再将a的值加1,此时a的值为11,b的值为10
4.4 比较运算符
比较运算符属于二元运算符,用于程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较。比较运算符的运算结果是boolean型。当运算符对应的关系成立时,运算结果为true,否则为false。
4.5 逻辑运算符
返回类型为布尔值的表达式,如比较运算符,可以被组合在一起构成一个更复杂的表达式。这是通过逻辑运算符来实现的。逻辑运算符包括&(&&)(逻辑与)、||(逻辑或)、!(逻辑非)。逻辑运算符的操作元必须是boolean型数据。在逻辑运算符中,除了“!”是一元运算符之外,其他都是二元运算符。
逻辑运算符,如下表:
使用逻辑运算符进行逻辑运行,如下表:
逻辑运算符“&&”与“&”都表示“逻辑与”,那么它们之间的区别在哪里呢?当两个表达式都为true时,“逻辑与”的结果才会是true。使用逻辑运算符“&”会判断两个表达式;而逻辑运算符“&&”则是针对boolean类型的类进行判断,当第一个表达式为false时则不去判断第二个表达式,直接输出结果从而节省计算机判断的次数。通常将这种在逻辑表达式中从左端的表达式可推断出整个表达式的值称为“短路”,而那些始终执行逻辑运算符两边的表达式称为“非短路”。“&&”属于“短路”运算符,而“&”则属于“非短路”运算符。
4.6 位运算符
位运算符除按位与和按位或运算符外,其他只能用于处理整数的操作数。位运算是完全针对位方面的操作。整型数据在内存中以二进制的形式表示,如int型变量7的二进制表示是00000000 00000000 00000000 00000111。
左边最高位是符号位,最高位是0表示正数,若为1则表示负数。负数采用补码表示,如-8的二进制表示为111111111 11111111 11111111 11111000。这样就可以对整型数据进行按位运算。
4.6.1 “按位与”运算
“按位与”运算的运算符为“&”,为双目运算符。“按位与”运算的运算法则是:如果两个整型数据a、b对应位都是1,则结果位才是1,否则为0。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同。如图所示:
4.6.2 “按位或”运算
“按位或”运算的运算符为“|”,为双目运算符。“按位或”运算的运算法则是:如果两个操作数对应位都是0,则结果位才是0,否则为1。如果两个操作数的精度不同,则结果的精度与精度高的操作数相同。如图所示。
4.6.3 “按位取反”运算
“按位取反”运算也称“按位非”运算,运算符为“~”,为单目运算符。“按位取反”就是将操作数二进制中的1修改为0,0修改为1。如图所示。
4.6.4 “按位异或”运算
“按位异或”运算的运算符是“^”,为双目运算符。“按位异或”运算的运算法则是:当两个操作数的二进制表示相同(同时为0或同时为1)时,结果为0,否则为1。若两个操作数的精度不同,则结果数的精度与精度高的操作数相同。如图所示。
4.6.5 移位操作
Java中的移位运算符有以下3种。
<<:左移。
>>:右移。
>>>:无符号右移。
左移就是将左边的操作数在内存中的二进制数据左移右边操作数指定的位数,左边移空的部分补0。右移则复杂一些。当使用“>>”符号时,如果最高位是0,左移空的位就填入0;如果最高位是1,右移空的位就填入1。如图所示(右移)。
无符号右移“>>>”,无论最高位是0还是1,左侧被移空的高位都填入0。
移位运算符适用的数据类型有byte、short、char、int和long。
移位可以实现整数除以或乘以(2的n次方)的效果。例如,y<<2与y*4的结果相同;y>>1的结果与y/2的结果相同。总之,一个数左移n位,就是将这个数乘以(2的n次方);一个数右移n位,就是将这个数除以(2的n次方)。
4.7 三元运算符
三元运算符的使用格式为:
条件式?值1:值2
三元运算符的运算规则为:若条件式的值为true,则整个表达式取值 1,否则取值2。
三元运算符等价于if… else语句。
4.8 运算符优先级
运算符的优先级决定了表达式中运算执行的先后顺序。通常优先级由高到低的顺序依次是:
增量和减量运算。
算术运算。
比较运算。
逻辑运算。
赋值运算。
运算符优先级图表如下:
如果两个运算有相同的优先级,那么左边的表达式要比右边的表达式先被处理。在编写程序时尽量使用括号“()”运算符来限定运算次序,以免产生错误的运算顺序。
五 数据类型转换
类型转换是将一个值从一种类型更改为另一种类型的过程。例如,可以将String类型数据“457”转换为一个数值型,而且可以将任意类型的数据转换转换为String类型。
如果从低精度数据类型向高精度数据类型转换,则永远不会溢出,并且总是成功的;而把高精度数据类型向低精度数据类型转换则必然会有信息丢失,有可能失败。
数据类型转换有两种方式,即隐式转换与显式转换。
5.1 隐式数据类型转换
从低级类型向高级类型的转换,系统将自动执行,程序员无须进行任何操作。这种类型的转换称为隐式转换。下列基本数据类型会涉及数据转换,不包括逻辑类型和字符类型。这些类型按精度从低到高排列的顺序为byte < short < int < long < float < double。
各种数据类型转换的一般规则,如下表:
数据类型隐式转换的列子:
public class Conver {
public static void main(String[] args) {
byte mybyte = 127;
int myint = 150;
float myfloat = 452.12f;
char mychar = 10;
double mydouble = 45.46546;
System.out.println("byte 型与 int 型数据进行运算结果为:" + (mybyte + myfloat));
System.out.println("byte 型与 char 型数据进行运算结果为:" + (mybyte / mychar));
System.out.println("double 型与 char 型数据进行运算结果为:" + (mydouble + mychar));
}
}
运算结果如下:
5.2 显示数据类型转换
当把高精度的变量的值赋给低精度的变量时,必须使用显式类型转换运算(又称强制类型转换)。语法如下:
(类型名)要转换的值
如下例所示:
int a = (int)45.22;
long b = (long)548.5F;
int b = (int)'s';
当执行显式类型转换时可能会导致精度损失。只要是boolean类型以外其他基本类型之间的转换,全部都能以显式类型转换的方法达到。
当把整数赋值给一个byte、short、int、long型变量时,不可以超出这些变量的取值范围,否则必须进行强制类型转换。例如:byteb=(byte)129;
六 代码注释与编码规范
6.1 代码注释
6.1.1 单行注释
“//”为单行注释标记,从符号“//”开始直到换行为止的所有内容均作为注释而被编译器忽略。
语法如下:
//注释内容
int user_id //定义int型变量用于保存用户ID
6.1.2 多行注释
“/**/”为多行注释标记,符号“/”与“/”之间的所有内容均为注释内容。注释中的内容可以换行。
语法如下:
/*
注释内容1
注释内容2
...
*/
在多行注释中可嵌套单行注释,但在多行注释中不可以嵌套多行注释。
6.1.3 文档注释
“/***/”为文档注释标记。符号“/**”与“*/”之间的内容均为文档注释内容。当文档注释出现在声明(如类的声明、类的成员变量的声明、类的成员方法声明等)之前时,会被Javadoc文档工具读取作为Javadoc文档内容。文档注释的格式与多行注释的格式相同。
6.2 编码规范
每条语句要单独占一行,一条命令要以分号结束。
在声明变量时,尽量使每个变量的声明单独占一行,即使是相同的数据类型也要将其放置在单独的一行上,这样有助于添加注释。对于局部变量应在声明的同时对其进行初始化。
在Java代码中,关键字与关键字间如果有多个空格,这些空格均被视作一个。
为了方便日后的维护,不要使用技术性很高、难懂、易混淆判断的语句。由于程序的开发与维护不能是同一个人,所以应尽量使用简单的技术完成程序需要的功能。
对于关键的方法要多加注释,这样有助于阅读者了解代码结构。