第 3章
语法入门
– 第一个 Java程序
– 文本模式下与程序互动
– 数据、运算
– 流程控制第一个 Java程序
定义类别( Class)
定义区块 ( Block)
定义 main()方法( Method)
撰写语句( Statement)
public class HelloJava {
public static void main(String[] args) {
System.out.println("嗨!我的第一个 Java程序! ");
}
}
code\ch03\HelloJava.java
给 C使用者的第一個 Java程序
给了 C使用者类似 printf()的功能
public class HelloJavaForC {
public static void main(String[] args) {
System.out.printf("%s! 这是您的第一个 Java程序! \n",
"C语言 Fan");
}
}
System.out.printf("%s! 这是您的第二个 Java程序! ",
"C语言 Fan").println();
System.out.printf("%s! 这是您的第 %d 个 Java程序! \n",
"C语言 Fan",3);
code\ch03\HelloJavaForC.java code\ch03\ThirdJavaForC.java
为程序加入批注
原始码档案中被标注为批注的文字,编译程序不会去处理它
/*作者:良葛格 * 功能:示范 printf()方法 * 日期,2005/4/30 */
public class ThirdJavaForC {
public static void main(String[] args) {
// printf()是 J2SE5.0的新功能,必须安 裝 JDK5.0才能编译
System.out.printf("%s! 这是您的第 %d个 Java程序! \n",
"C语言 Fan",3);
}
} code\ch03\ThirdJavaForC.java
为程序加入批注
不能用嵌套方式来撰写多行批注
多行批注可以包括单行批注
/*批注文字 1…… bla… bla
/*
批注文字 2…… bla… bla
*/
*/
/*批注文字 1…… bla… bla
//批注文字 2…… bla… bla
*/
JavaDoc,code\HelloDate.java
http://java.sun.com/j2se/javadoc/
谜题 15
使用 Scanner取得输入
在 J2SE 5.0中,可以使用 java.util.Scanner
类别取得使用者的输入
可以使用这个工具的 next()功能,来取得用户的输入字符串
Scanner scanner = new Scanner(System.in);
System.out.print("请输入您的名字,");
System.out.printf("哈啰! %s!\n",scanner.next());
System.out.print("请输入一个数字,");
System.out.printf("您输入了 %d! \n",
scanner.nextInt());
code\ch03\ScannerDemo.java code\ch03\ScannerDemo2.java
使用 BufferedReader取得输入
BufferedReader建构时接受 java.io.Reader
物件
– 可使用 java.io.InputStreamReader
BufferedReader bufferedReader =
new BufferedReader(
new InputStreamReader(System.in));
System.out.print("请输入一列文字,可包括 空白,");
String text = bufferedReader.readLine();
System.out.println("您输入的文字," + text);
code\ch03\BufferedReaderDemo.java
标准输入输出串流
System类别中的静态 物件 out
– 提供标准输出串流( Stream)输出
– 通常对应至显示输出(终端机输出)
– 可以将输出重新导向至一个档案
– java HelloJava > HelloJavaResult.txt
System标准输入串流 in
– 在程序开始之后它会自动开启,对应至键盘或其它的输入来源标准输入输出串流
标准错误输出串 流 err
– 在程序执行后自动开启,将指定的字符串输出至显示设备或其它指定的装置
– err会立即显示错误讯息
– err输出串流的讯息不会被重新导向
System.out.println("使用 out输出讯息 ");
System.err.println("使用 err输出讯息 ");
java ErrDemo > ErrDemoResult.txt
使用 err输出讯息
code\ch03\ErrDemo.java
输出格式控制控制字符 作用
\\ 反斜杠
\' 单引号 '
\" 双引号 "
\uxxxx 以 16进位数指定 Unicode字符输出
\xxx 以 8进位数指定 Unicode字符输出
\b 倒退一个字符
\f 换页
\n 换行
\r 游标移至行首
\t 跳格 (一个 Tab键 )
System.out.println("\u0048\u0065\u006C\u006C\u006F");
输出格式控制
若是使用 J2SE5.0或更高的版本
//输出 19的十进制表示
System.out.printf("%d%n",19);
//输出 19的八进制表示
System.out.printf("%o%n",19);
//输出 19的十六进制表示
System.out.printf("%x%n",19);
toXXX() code\ch03\NumberDemo.java
code\ch03\TigerNumberDemo.java
格式字符 作 用
%% 在字符串中显示 %
%d 以 10进位整数方式输出,提供的数必须是 Byte,Short,Integer,Long、
或 BigInteger
%f 将浮点数以 10进位方式输出,提供的数必须是 Float,Double或
BigDecimal
%e,%E 将浮点数以 10进位方式输出,并使用科学记号,提供的数必须是 Float、
Double或 BigDecimal
%a,%A 使用科学记号输出浮点数,以 16进位输出整数部份,以 10进位输出指数部份,提供的数必须是 Float,Double,BigDecimal
%o 以 8进位整数方式输出,提供的数必须是 Byte,Short,Integer,Long、
或 BigInteger
%x,%X 将浮点数以 16进位方式输出,提供的数必须是 Byte,Short,Integer、
Long、或 BigInteger
%s,%S 将字符串格式化输出
%c,%C 以字符方式输出,提供的数必须是 Byte,Short,Character或 Integer
%b,%B 将 "true"或 "false"输出(或 "TRUE","FALSE",使用 %B)。另外,非 null
值输出是 "true",null值输出是 "false"
%t,%T 输出日期 /时间的前置,详请看在线 API文件输出格式控制
可以在输出浮点数时指定精度
– System.out.printf("example:%.2f%n",19.234);
– example:19.23
可以指定输出时,至少要预留的字符宽度
– System.out.printf("example:%6.2f%n",19.234);
– example,19.23
– 补上一个空白在前端基本的数据类型 ( Primitive type)
整数
– 短整数( short)(占 2个字节)
– 整数( int)(占 4个字节)
– 长整数( long)(占 8个字节)
字节
– 专门储存位数据
– 占一个字节
浮点数
– 浮点数( float)(占 4个字节)
– 倍精度浮点数( double)(占 8个字节)
基本的数据类型 ( Primitive type)
字符
– 采 Unicode编码
– 前 128个字符编码与 ASCII编码兼容
– 每个字符数据类型占 两个字节
– 可储存的字符范围由 '\u0000'到 '\uFFFF'
布尔数
– 占内存 2个字节
– 可储存 true与 false两个数值基本的数据类型 ( Primitivetype)
System.out.printf("short \t数值范围,%d ~ %d\n",
Short.MAX_VALUE,Short.MIN_VALUE);
System.out.printf("int \t数值范围,%d ~ %d\n",
Integer.MAX_VALUE,Integer.MIN_VALUE);
System.out.printf("long \t数值范围,%d ~ %d\n",
Long.MAX_VALUE,Long.MIN_VALUE);
System.out.printf("byte \t数值范围,%d ~ %d\n",
Byte.MAX_VALUE,Byte.MIN_VALUE);
System.out.printf("float \t数值范围,%e ~ %e\n",
Float.MAX_VALUE,Float.MIN_VALUE);
System.out.printf("double \t数值范围,%e ~ %e\n",
Double.MAX_VALUE,Double.MIN_VALUE);
code\ch03\DataRange.java
变量、常量
在 Java中要使用变量,必须先声明变量名称与数据类型
使用 int,float,double,char等关键词来声明变量名称并指定其数据类型
– 不可以使用数字作为开头
– 不可以使用一些特殊字符,像是 *&^%之类
– 不可以與 Java内定的关键词同名
int age; //声明一个整数变量
double scope; //声明一个倍精度浮点数变量变量、常量
鼓励用清楚的名称来表明变量的作用
不可以声明变量后,而在未指定任何值给它之前就使用它
编译程序在编译时会回报这个错误
int ageOfStudent;
int ageOfTeacher;
variable var might not have been initialized
变量、常量
使用「赋值运算符」 '='来指定变量的值
int ageOfStudent = 5;
double scoreOfStudent = 80.0;
char levelOfStudent = 'B';
System.out.println("年級 \t得分 \t等級 ");
System.out.printf("%4d\t %4.1f\t %4c",
ageOfStudent,scoreOfStudent,levelOfStudent);
code\ch03\VariableDemo.java
变量、常量
声明变量名称的同时,加上,final”关键词来限定
这个变量一但指定了值,就不可以再改变它的值
final int maxNum = 10;
maxNum = 20;
cannot assign a value to final variable maxNum
算术运算
加( +)、减( -)、乘( *)、除( /)、余除运算符( %)
– System.out.println(1 + 2 * 3);
– System.out.println(1+2+3 / 4);
– System.out.println((double)(1+2+3) / 4);
算术运算
这段程序会印出什么结果?
使用下面的方法
int testNumber = 10;
System.out.println(testNumber / 3);
int testNumber = 10;
System.out.println(testNumber / 3.0);
System.out.println((double) testNumber / 3);
算术运算
将精确度大的值指定给精确度小的变量时,
由于在精确度上会有遗失,编译程序会认定这是一个错误
int testInteger = 0;
double testDouble = 3.14;
testInteger = testDouble;
System.out.println(testInteger);
possible loss of precision
found,double
required,int
testInteger = testDouble
^
1 error
算术运算
必须明确加上转换的限定字,编译程序才不会回报错误
'%'运算符是余除运算符
testInteger =(int) testDouble;
count = (count + 1) % 360;
谜题 9
谜题 1
比较、条件运算
大于( >)、不小于( >=)、小于( <)、
不大于( <=)、等于( ==)、不等于( !=)
System.out.println("10 > 5结果 " + (10 > 5));
System.out.println("10 >= 5结果 " + (10 >= 5));
System.out.println("10 < 5结果 " + (10 < 5));
System.out.println("10 <= 5结果 " + (10 <= 5));
System.out.println("10 == 5结果 " + (10 == 5));
System.out.println("10 != 5结果 " + (10 != 5));
code\ch03\ComparisonOperator.java
比较、条件运算
条件运算符条件式?成立传回值,失败传回值
System.out.println("该生是否及格? " +
(scoreOfStudent >= 60? '是 ','否 '));
System.out.println("是否为奇數? " +
(number%2 != 0? '是 ','否 '));
谜题 8code\ch03\ConditionalOperator.java
code\ch03\OddDecider.java 谜题 1,奇数逻辑、位运算
「且」( &&)、「或」( ||)、「反相」( !)
&( AND),|( OR),^( XOR)与 ~(补码)
int number = 75;
System.out.println((number > 70 && number < 80));
System.out.println((number > 80 || number < 75));
System.out.println(!(number > 80 || number < 75));
System.out.println("0 AND 0\t\t" + (0 & 0));
System.out.println("0 AND 1\t\t" + (0 & 1));
System.out.println("1 AND 0\t\t" + (1 & 0));
System.out.println("1 AND 1\t\t" + (1 & 1));
byte number = 0;
System.out.println((int)(~number));
code\ch03\LogicalOperator.java
code\ch03\BitwiseOperator.java
code\ch03\OddDecider2.java
^( XOR) 加密
code\ch03\XorCode.java
谜题 7 互换逻辑、位运算
左移( <<)、右移( >>),>>>运算符
int number = 1;
System.out.println( "2的 0次," + number);
number =number << 1;
System.out.println("2的 1次," + number);
number = number << 1;
System.out.println("2的 2次," + number);
number = number << 1;
System.out.println("2的 3次," + number);
00000001? 1
00000010? 2
00000100? 4
00001000? 8
code\ch03\ShiftOperator.java
递增、递减运算
递增、递减运算符
将递增或递减运算符撰写在变量之前或变量之后
int i = 0;
System.out.println(++i);
System.out.println(--i);
int i = 0;
int number = 0;
number = ++i; //相当於 i = i + 1; number = i;
System.out.println(number);
number = --i; //相当於 i = i - 1; number = i;
System.out.println(number);
code\ch03\IncrementDecr
ement.java
code\ch03\IncrementDecremen
t2.java
递增、递减运算
将递增或递减运算符撰写在变量之前或变量之后
int i = 0;
int number = 0;
number = i++; //相当於 number = i; i = i + 1;
System.out.println(number);
number = i--; //相当于 number = i; i = i - 1;
System.out.println(number);
code\ch03\IncrementDecre
ment3.java
递增、递减运算指定运算符 范 例 结 果
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b
&= a &= b a = a & b
|= a |= b a = a | b
^= a ^= b a = a ^ b
<<= a <<= b a = a << b
>>= a >>= b a = a >> b
if条件式
语法
复合语句句
if(条件式 )
语句句一 ;
else
语句句二 ;
if(条件式 ) {
语句句一 ;
语句句二 ;
}
else {
语句句三 ;
语句句四 ;
}
if条件式
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数字,");
int input = scanner.nextInt();
int remain = input % 2; //求除 2的余数
if(remain == 1) //如果余数为 1
System.out.println(input +"为奇數 ");
else
System.out.println(input +"为偶數 ");
code\ch03\OddDecider3.java
if条件式
if中再设定执行的条件
if(条件式一 ) {
语句句一 ;
if(条件式二 )
语句句二 ;
语句句三 ;
}
if(条件式一 ) {
语句句一 ;
//其它语句句
} else
if(条件式二 )
语句句二 ;
if(条件式一 ) {
语句句一 ;
//其它语句句
} else if(条件式二 )
语句句二 ;
if条件式
Scanner scanner = new Scanner(System.in);
System.out.print("输入分数,");
int score = scanner.nextInt();
if(score >= 90)
System.out.println("得 A");
else if(score >= 80 && score < 90)
System.out.println("得 B");
else if(score >= 70 && score < 80)
System.out.println("得 C");
else if(score >= 60 && score < 70)
System.out.println("得 D");
else
System.out.println("得 E(不及格 )");
code\ch03\ScoreLevel.java
switch条件式
switch的语法架构
switch(变量名称或表达式 ) {
case符合数字或字符,
语句句一 ;
break;
case符合数字或字符,
语句句二 ;
break;
default:
语句三 ;
}
Scanner scanner = new Scanner(System.in);
System.out.print("请输入分數,");
int score = scanner.nextInt();
int level = (int) score/10;
switch(level) {
case 10:
case 9:
System.out.println("得 A");
break;
case 8:
System.out.println("得 B");
break;
case 7:
System.out.println("得 C");
break;
case 6:
System.out.println("得 D");
break;
default:
System.out.println("得 E(不及格 )");
code\ch03\ScoreLevel2.jav
a
for循环
基本语法
for(初始式 ;判断式 ;递增式 ) {
语句句一 ;
语句句二 ;
}
for(int j = 1; j < 10; j++) {
for(int i = 2; i < 10; i++) {
System.out.printf("%d*%d=%2d ",i,j,i * j);
}
System.out.println();
}
code\ch03\SimpleLoopFor.ja
va
code\ch03\NineTable.java
for循环
for括号中的每个语句区块是以分号 ';'作区隔,
而在一个语句区块中若想写两个以上的语句句,则使用逗号 ','作区隔
for (int i = 2,j = 1;
j < 10;
i = (i==9)?((++j/j)+1):(i+1)) {
System.out.printf("%d*%d=%2d%c",i,j,i * j,
(i==9? '\n',' '));
}
code\ch03\NineTable2.java
while循环
Scanner scanner = new Scanner(System.in);
int score = 0;
int sum = 0;
int count = -1;
while(score != -1) {
count++;
sum += score;
System.out.print("输入分数 (-1结束 ),");
score = scanner.nextInt();
}
System.out.println("平均," + (double) sum/count)
code\ch03\ScoreAverage.java
while循环
Scanner scanner = new Scanner(System.in);
int input = 0;
int replay = 0;
do {
System.out.print("输入整数值,");
input = scanner.nextInt();
System.out.println("输入数为奇数? " +
((input%2 == 1)? 'Y','N'));
System.out.print("继续 (1:继续 0:结束 )? ");
replay = scanner.nextInt();
} while(replay == 1);
code\ch03\OddDecider4.java
break,continue
break可以离开目前 switch,for,while、
dowhile的区块
continue只会结束其之后区块的语句句,并跳回循环区块的开头继续下一个循环
for(int i = 1; i < 10; i++) {
if(i == 5)
break;
System.out.println("i = " + i);
}
for(int i = 1; i < 10; i++) {
if(i == 5)
continue;
System.out.println("i = " + i);
}
break,continue
break与 continue还可以配合标签使用
back,{
for(int i = 0; i < 10; i++) {
if(i == 9) {
System.out.println("break");
break back;
}
}
System.out.println("test");
}
code\ch03\BreakTest.java
break,continue
break与 continue还可以配合标签使用
back1:
for(int i = 0; i < 10; i++){
back2:
for(int j = 0; j < 10; j++) {
if(j == 9) {
continue back1;
}
}
System.out.println("test");
}
code\ch03\ContinueTest.java