Java编程基础
Java代码的基本格式
类的定义
所有的Java程序都是由类或者说是类的定义组成的。
一个Java源程序可以定义多个类(Class),但最多只能有一个类可以使用public来声明。
类定义的一般格式:
修饰符 class 类名{
成员变量声明;
方法定义;
}
package语句:包声明
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包的作用
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
Java自身提供了一些预先定义的包,下面列出一些常用包,其余可查看Java的API信息:
包 | 功能 |
---|---|
java.lang | 提供基本数据类型及操作 |
java.util | 提供高级数据类型及操作 |
java.io | 提供输入/输出流控制 |
java.awt | 提供图形窗口界面控制 |
java.net | 提供支持Internet协议的功能 |
java.applet | 提供实现浏览器环境中Applet的有关类和方法 |
java.sql | 提供与数据库连接的接口 |
java.rmi | 提供远程连接与载入的支持 |
java.security | 提供安全性方面的有关支持 |
创建包的一般格式:
package 包名
命名要注意唯一性,可使用WWW域名
如果package未指定,则所有的class都被组合到一个未命名的缺省package中,不能被其他包中的类引用。
package说明必须是非注释非空行的第一行
一个文件中最多只能有一条package语句。
包的名字有层次关系,各层之间以点分隔。包层次必须与Java开发系统的文件系统结构相同。通常包名中全部用小写字母。
例如:package java.awt.image
在Window系统下,则此文件必须存放在java\awt\image目录下
(3)import语句:使用其他包中的class,需要导入包
使用import关键字导入包,语法如下:
import 包名.类名;
如:import java.util.*;
import java.util.Date;
用import 语句将此包中的某些或所有class加载入当前程序(此时导入的是包中的public类,而不是所有类,所以一般包内的允许被包外部使用的类应定义为public的)
Java可有零个或多个import语句,若有,该类语句必须位于所有类定义之前。
当源程序使用了除java.lang包以外的类时,无论是系统类还是自定义包中的类,都必须用import语句导入,以通知编译器在编译时找到相应的类文件。
(4)Java中的注释:
对程序的某个功能或者某行代码的解释说明,只在Java源文件中有效,编译程序时,编译器忽略这些注释,不将其编译到class字节码文件中。
单行注释:// 注释一行
多行注释:/* 一行或多行注释 */
文档注释:/** 文档注释 */
文档注释是对一段代码概括性的解释说明,一般出现在声明(如类的声明、类的成员变量的声明、类的成员方法的声明等)之前,会被Javadoc文档工具读取作为Javadoc文档内容。
(5)关键点:
Java中的程序代码可分为两种:
结构定义语句:用于声明一个类或一个方法
功能执行语句:用于实现具体功能,必须用英文半角分号结束
Java语言严格区分大小写。
Java程序中一个连续的字符串不能分开在两行中书写。
System.out.println(“这是第一个”+
“Java程序”);
编写时,建议采用一种良好的格式进行排版:缩进
Java中的变量
应用程序将程序运行期间产生的数据保存在一些内存单元中,每个内存单元用一个标识符来标识。这些内存单元称为变量,定义的标识符就是变量名,内存单元中存储的数据即为变量的值。
int x=0,y;
y=x+3;
先声明,后使用
变量声明的语法形式如下:
变量数据类型 变量名1[=变量值1] [, 变量名2[=变量值2]…];
如: double area,r;
Java中的数据类型

基本数据类型
类型 | 所占字节数 | 描述 | 初始值 |
---|---|---|---|
byte | 1 | 8位有符号整数,取值范围:-128~127 | (byte)0 |
short | 2 | 16位有符号整数,取值范围:-32768~32767 | (short)0 |
int | 4 | 32位有符号整数,取值范围:-2147,483,648~2147,483,647 | 0 |
long | 8 | 64位有符号整数,取值范围:-9.22E18~9.22E18 | 0 |
float | 4 | 32位单精度浮点数,取值范围:1.4E-45~3.4E38 | 0.0 |
double | 8 | 64位双精度浮点数,取值范围:4.9E-324~1.8E308 | 0.0 |
boolean | 1 | 布尔数,只有两个值:true、false | false |
char | 2 | 16位字符,取值范围:’\U0000’~’\Uffff’ | ‘\u0000’ |
Java中的关键字
具有特定含义和用途,不能用作其他用途的字符序列

注意:
- 所有的关键字都是小写的
- 程序中的标识符不能以关键字命名
- const和goto是保留关键字,不能用作自定义的标识符
- true、false和null不属于关键字,是一种单独标识类型,不能直接使用
Java中的标识符
所谓标识符就是用来标识包名、类名、接口名、变量名、方法名、等的有效字符序列。
由字母、下划线、美元符号和数字组成,并且第一个字符不能是数字,不能是Java中的关键字。
一般标识符按照以下规则命名:
标识符尽量采用有意义的字符序列,便于从标识符识别出所代表的基本含义。
- 包名:是全小写的名词,中间可以由点分隔开,例如:java.awt.event。
- 类名:首字母大写,通常由多个单词合成一个类名,要求每个单词的首字母也要大写,例如class HelloWorldApp。
- 接口名:命名规则与类名相同,例如interface Collection。
- 方法名:往往由多个单词合成,第一个单词通常为动词,首字母小写,中间的每个单词的首字母都要大写,例如: isButtonPressed。
- 变量名:全小写,一般为名词,例如使用area表示面积变量,length表示程度变量,等等。
- 常量名:基本数据类型的常量名为全大写,如果是由多个单词构成,可以用下划线隔开,例如:int YEAR, int MAX_VALUE;如果是对象类型的常量,则是大小写混合,由大写字母把单词隔开。
- 对变量和方法而言,其名称不宜以’_’和’$’为第一个字符,因为这两个字符对于内部有特殊含义。
Java中的常量值
(1)整型常量:整数类型的数据
二进制:由数字0 和1 组成的数字序列,如:00110101。
八进制:以0开头并且其后由0 ~7范围(包括0和7)内的整数组成的数字序列,如:0342。
十进制:由数字0~9范围(包括0和9)内的整数组成的数字序列。如:198。整数以十进制表示时,第一位不能是0,0本身除外 。
十六进制:以0x或者0X开头并且其后由0~9、A~F(包括0和9、A和F)组成的数字序列,如0x25AF。
整型数字值的默认类型为int型,对超过int型范围的long型数字值后面必须加l或L。
如:long x=2147483649L;
(2)浮点数常量:
单精度浮点数:float,浮点数后面以F或f结尾
双精度浮点数:double,浮点数则以D或d结尾,或省略
可以使用后缀d或D明确表明一个double类型数据,不加“d/D”不会出错,但声明float型变量时若不加“f/F”,系统会认为变量是double类型而出错。
如:
double d1=2.6587d;
double d2=563.7;
float f1=3.5f;
(3)字符常量:
字符常量用于表示一个字符,一个字符常量要用一对英文半角格式的单引号(' ') 引起来,它可以是英文字母、数字、标点符号、以及由转义序列来表示的特殊字符。
引用方法 | 对应Unicode码 | 意义 |
---|---|---|
‘\b’ | ‘\u0008’ | 回退 |
‘\t’ | ‘\u0009’ | 水平制表符tab |
‘\n’ | ‘\u000a’ | 换行 |
‘\r’ | ‘\u000d’ | 回车 |
‘\”’ | ‘\u0022’ | 双引号 |
‘\’’ | ‘\u0027’ | 单引号 |
‘\’ | ‘\u005c’ | 反斜线 |
空白字符,Java采用Unicode字符集,以“\u”开头。
'\u0000'
(4)字符串常量:
用于表示一串连续的字符,一个字符串常量要用一对英文半角格式的双引号(" ") 引起来
一个字符串可以包含一个字符或多个字符,也可以不包含任何字符,即长度为零。
(5)布尔常量:
布尔常量即布尔型的两个值true和false,该常量用于区分一个事物的真与假。
(6)null常量:
null常量只有一个值null,表示对象的引用为空。
Java变量的类型转换
所谓类型转换就是将一种数据类型变量转变成另一种类型变量。
Java语言是一种强类型语言(类似于C++,而不是C语言)。当表达式中的数据类型不一致时,就需要进行数据类型转换。
①隐式类型转换:
编译程序在编译时可以自动执行类型转换;
低精度值可以直接赋给高精度变量,进行隐式类型转换。
数据精度从“低”到“高”为:
byte->short(char)->int->long->float->double
如:
int i=100;
double x=i+10;
②显式类型转换:
必须在程序中显式地执行强制转换,强制转换的格式为:
(类型)表达式
高精度值则需要使用强制类型转换后赋给低精度变量,此时可能会导致数据精度的损失,也有可能导致结果出现较大错误。
如:int x=(int)34.89;
Java语言可以把字符作为整数对待,若想得到一个0~65536之间的数所代表的的Unicode表中的相应位置的字符,必须使用char型显式转换。
char word='d';
int p=23045;
System.out.println("d在Unicode表中的顺序位置是:"+(int)word);//100
System.out.println(“Unicode表中的第23045位是:"+(char)p);//娅
布尔类型不允许进行任何数据类型转换。
变量的作用域
- 成员变量:在类中声明,它的作用域是整个类,是作用域范围最大的变量。
- 局部变量:在方法内部或者一个块语句的内部声明。如果在一个方法内部声明,它的作用域就是整个方法;如果在一个块语句的内部声明,它的作用域就只限于这个块语句内部。块语句就是括在一对大括号“{}”内的一组代码。
- 方法的形式参数:方法或者构造方法的参数,它的作用域是整个方法或者构造方法之内。
Java中的运算符
算术运算符:

注意:
- /运算符的两个操作数均为整数时,结果是整数,若一个操作数为浮点数,结果为浮点数。
- %运算符不但可以对整型数据进行运算,还可以对浮点型数据进行运算,%的运算结果的正负取决于被模数(%左边的数)。如:3.6%2.5的值等于1.1,(-5)%3=-2,5%(-3)=2。
- +既可用于数值型数据运算,还用于字符串连接。
java将按运算符两边操作元的最高精度保留结果。
执行任何算术运算或按位运算,“比int小”的数据(char、byte、short)在正式执行运算之前,那些值会自动转换成int;
整型、实型、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级。
例如:若将一个float值与一个double值相乘,结果就是double;如将一个int值和一个long值相加,则结果为long。
关系运算符:

逻辑运算符:

赋值运算符:
赋值运算符“=”是双目运算符,左面的操作元必须是变量,结合性从右到左(运算顺序从右向左,将右边表达式的结果赋值给左边的变量)
赋值表达式:变量=表达式
复合赋值运算符:+=、-=、*=、/=、%=
等
位运算符:
运算符 | 表达式 | 描述 |
---|---|---|
& | op1&op2 | 二元运算,逻辑与,若两个操作数对应位都为1(true),则该位的结果为1(或true),否则为0(或false) |
| | op1 | op2 | 二元运算,逻辑或,若两个操作数对应位都为0(false),则该位的结果为0(或false),否则为1(或true) |
^ | op1^op2 | 二元运算,逻辑异或,若两个操作数对应位的值相反,则该位的结果为1(或true),否则为0(或false) |
~ | ~op1 | 一元运算,对数据的每个二进制位按位取反 |
<< | op1<<op2 | 左移,二元运算,操作数op1按位左移op2位,每左移一位,左边的高阶位上的0或1被移除丢弃,并用0填充右边的低位 |
>> | op1>>op2 | 右移,二元运算,操作数op1按位右移op2位,每右移一位,右边低阶位上的0或1被移除,如果最高位是0,用0填充左边的高位,如果最高位是1,用1填充左边的高位 |
>>> | op1>>>op2 | 无符号右移,二元运算,操作数op1按位右移op2位,无论最高位是0还是1,左侧被移空的高位都填入0 |
条件运算符:
条件运算符是一个3目运算符,符号是:" ? : "
。
条件表达式格式:op1?op2:op3
要求第一个操作元op1的值必须是boolean型数据。
运算法则是:当op1的值是true时,运算的结果是op2的值;当op1的值是false时,运算的结果是op3的值。
Java要求:op2与op3必须同类型 。
例如,12>8?100:200的结果是100;12<8?100:200的结果是200。
instanceof运算符:
该运算符是双目运算符,左面的操作元是一个对象,右面是一个类。当左面的对象是右面的类创建的对象时,该运算的结果是true,否则是false。
Java中的流程控制语句
结构化程序设计的三种基本控制语句
- 顺序:按语句书写的先后顺序执行
- 分支:在若干路径中有条件地择一执行
- 循环:当某条件成立时,反复执行一段代码
顺序
(1)输出语句:
System类:在其提供的设施中,有标准输入、标准输出和错误输出流。


(2)输入语句:
Scanner类:一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
一般应用格式:
Scanner sc=new Scanner(参数);
sc.nextXXX();

分支语句


Switch开关语句:

- 表达式的值和常量值1~n必须是整型(byte/short/int)、字符型(char)或字符串(String)
- Switch语句首先计算表达式的值,然后通过比较表达式的值和常量值1~n,找到入口位置,即从此入口位置开始执行,直到碰到break语句或switch块末尾为止。如果没有遇到break语句,则继续执行后面case所指示的若干语句。因此,case后的常量值起到标签作用,并不是判断语句。
- 一般一个case分支对应一个break语句,break语句使得程序在执行完对应case分支语句后跳出switch语句,即终止switch语句的执行(在一些特殊情况下,多个不同的case值要执行一组相同的操作,这时可以不用break)。
- 若没有任何常量值与表达式的值相同,则从default处开始执行其后面的若干个语句,直到碰到break语句或switch块末尾为止。因此,为了避免错误,一般default位于最后面,可有可无。
- 正确使用break可以使得多个case分支之间以及default之间的先后次序不影响程序的结果。
- case后的常量值必须互不相同。
循环语句
1.while循环
while(表达式)
{ 若干语句 }
while、do…while的“表达式”必须是一个求值为boolean型数据的表达式
2.do while循环
do while
{ 若干语句
} (表达式);
3.for循环
for (表达式1;表达式2;表达式3)
{ 若干语句 }
“表达式2”必须是一个求值为boolean型数据的表达式
跳转语句
(1)break语句:
在switch语中,break语句用来终止switch语句的执行。使程序从switch语句后的第一个语句开始执行。
跳出所指定的循环,并从紧跟该循环的第一条语句处执行。
跳出它所指定的代码块,并从紧跟该代码块的第一条语句处执行。
说明:一个代码块通常是用大括号{}括起来的一段代码。加标号的格式如下:
BlockLabel: { 代码块 }
break在循环中的使用形式:
break; //不带标签,使程序跳出它所在的那一层循环结构
break Label; //带标签,使程序跳出标签所指示的循环结构,标签必须紧挨着所要跳出循环的开始部分。
(2)continue语句:
只能在循环体中使用,用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。
continue语句的使用格式为:
continue; //不带标签,终止当前循环结构的本轮循环而直接开始下一轮循环。
continue Lable; //带标签,把程序直接转到标签所指的循环结构的下一次循环,而不管被它嵌套的以及continue语句所在的循环结构运行到了哪个环节。
continue标号语句和break标号语句的比较
相同点:
都必须用在循环中,用于流程控制;
执行这两个语句时,若后面还有其他语句,将不再继续执行。
不同点:
continue语句的标号必须位于封闭的循环语句的前面
break语句的标号只需位于封闭语句的前面,但不一定是循环语句
return语句:
作用:return语句从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续程序的执行。
使用格式:
return expression ; //退出方法并返回值
return; //退出方法
return语句通常用在一个方法体的最后,否则会产生编译错误,除非用在if-else语句中