第三章 Java的基本程序设计结构

1 一个简单的Java应用程序

    public class FirstSample{
        public static void main(String[] args){
            System.out.println("Hello World!");
        }
    }
  • Java区分大小写,如果出现了大小写拼写错误,程序将无法运行
  • 关键字public称为访问修饰符,用于控制程序的其他代码对这段代码的访问级别
  • 关键字class后面紧跟类名,类名必须以字母开头,后面可以跟字母和数字的任意结合,长度基本上没有限制。但是不能使用Java保留字 (如public或class)作为类名
  • 标准的命名规范为:类名是以大写字母开头的单词,若名字由多个单词组成,应使用骆驼命名法(又称驼峰命名法)命名。
  • 源代码的文件名必须与源代码的类名相同,并且使用“ .java ”作为扩展名
  • 运行已编译的程序时,Java虚拟机将从指定类中的main方法开始执行,因此在类的源文件中必须包含一个main方法
  • Java中任何方法的代码都用“{”开始,用“}”结束

2 注释

  • 三种注释方法:

    1) // (一般使用于单行注释)

    2) 以 / * 开头,以 * / 结尾 (一般用于长篇注释)

    3) 以 / ** 开头,以 * / 结尾 (用于自动地生成文档)
  • 在Java中,/ * * /注释不能嵌套

3 数据类型

  • Java是一种强类型语言。这就意味着必须为每一个变量声明一种类型。
  • Java中,一共有8种基本类型(primitive type),其中有4种整型,2种浮点类型,1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型

3.1 整型

-整型用于表示没有小数部分的数值,它允许是负数。

  • Java的四种整型:
类型 储存需求 取值范围
int 4字节 -2147483648 ~ 2147483647
(正好超过20亿)
short 2字节 -32768 ~ 32767
long 8字节 -9223372036854775808 ~
-9223372036854775807
byte 1字节 -128 - 127

3.2 浮点类型

  • Java的两种浮点类型
类型 储存需求 取值范围
float 4字节 大约±3.40282347E+38F
(有效位数为6~7)
double 8字节 大约±1.79769313486231570E+308
(有效位数为15位)
  • double表示这种类型的精度是float类型的两倍
  • float类型的数值有一个后缀F或f(如3.14F)
  • 没有后缀F的浮点数值(如3.14)默认为double类型
  • 用于表示溢出和出错情况的三个特殊的浮点数值:正无穷大,负无穷大,NaN(不是一个数字)、

3.3 char类型

  • char类型的字面量值需要用单括号括起来

3.4 Unicode和char类型

  • 码点:与一个编码表中的某个字符的代码值

3.5 boolean类型

  • boolean类型有两个值:false 和 true,用来判定逻辑条件
  • 整型值和布尔值之间不能进行互相转换

4 变量

  • 在Java中,每个变量都有一个类型。在声明变量时,变量的类型位于变量名之前。
  • 变量名必须是一个以字母开头并由字母或数字构成的序列。
  • 变量名中所有的字符都是有意义的,并且大小写敏感
  • 变量名的长度基本没有限制
  • 不能使用Java保留字作为变量名
  • 可以在一行中声明多个变量,但不提倡使用这种风格。逐一声明每一个变量可以提高程序的可读性。

4.1 变量初始化

  • 声明一个变量之后,必须用赋值语句对变量进行显式初始化。
  • 千万不要使用未初始化的变量
  • 想要对变量进行赋值,就需要将变量名放在等号左侧,相应取值的Java表达式放在等号的右侧。
    int vacationDays;
    vacationDays = 12;

    也可以将变量的声明和初始化放在同一行中。

    int vacationDays=12;
  • 变量的声明尽可能地靠近变量第一次使用的地方,这是一种良好的程序编写风格。

4.2 常量

  • 使用关键字final指示常量
  • 关键字final表示这个常量只能赋值一次,一旦赋值之后就不能修改了
  • 常量名使用全大写
  • 例子:
    public class Constants{
        public static void main(String[] args){
            final double CM_PER_INCH = 2.54;
            double paperWidth = 8.5;
            double paperHeight = 11;
            System.out.println("Paper size in centimeters:"
            + paperWidth * CM_PER_INCH + "by" + 
            paperHeight * CM_PER_INCH);
        }
    }
  • 当希望某个常量可以在一个类中的多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final设置一个类常量。
    public class Constants2{
        public static final double CM_PER_INCH = 2.54;
        public static void main(String[] args){
            double paperWidth = 8.5;
            double paperHeight = 11;
            System.out.println("Paper size in centimeters:"
            + paperWidth * CM_PER_INCH + "by" + paperHeight * CM_PER_INCH);
        }
    }

5 运算符

  • 加、减、乘、除:+、-、*、/
  • 取余:%

5.1 数学函数与常量

  • 求平方根:Math.sqrt(x)
  • 求幂:Math.pow(x)

5.2 数值类型之间的转换

  • 如果两个操作数有一个是double类型,另一个操作数就会转换为double类型
  • 否则,如果其中一个操作数是float类型,另一个操作数就会转换为float
  • 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型
  • 否则,两个操作数都会被转换为int类型

5.3 强制类型转换

  • 在Java中,允许进行这种数值之间的类型转换
  • 当然,有可能会丢失一些信息,在这种情况下,需要通过强制类型转换(cast)实现这个操作。
  • 如果将一个数值从一种类型强制转换为另一种类型,而又超过了目标类型的表示范围,结果就会截断成一个完全不同的值

5.4 结合赋值和运算符

  • 可以在赋值中使用二元运算符
    x += 4
    等价于
    x = x + 4 

5.5 自增与自减运算符

  • 后缀模式: n++ 或 n--

    后缀模式在表达式中会使用变量原来的值
  • 前缀模式: ++n 或 --n

    前缀模式在表达式中会先完成加1
    int m = 7;
    int n = 7;
    int a = 2 * ++m;   //此时a=16,m=8
    int b = 2 * n++;   //此时b=14,n=8

5.6 关系和boolean运算符

  • == , !=
  • < , > , <= , >=
  • && , &
  • ? :

    条件表达式 ? 表达式1 :表达式2

    如果条件为true,则条件表达式的值为表达式1的值;同理当条件为false是值为表达式2的值
    x < y? x : y
    会返回x和y中较小的一个

5.7 位运算符

  • & , | , ∧ (异或) , ~

5.8 括号与运算符级别

运算符 结合性
[] . () 从左到右
! ~ ++ -- + -
() (强制类型转换) new
从右到左
* / % 从左到右
+ - 从左到右
<< >> >>> 从左到右
< <= > >= instanceof 从左到右
= = != 从左到右
& 从左到右
从左到右
&& 从左到右
?: 从右到左
= += -= *= /= %=
&= <<= >>= >>>= ∧ =
从右到左

6 字符串

  • 从概念上将,Java字符串就是Unicode字符序列
  • 每个用双引号括起来的字符串都是String类的一个实例

6.1 子串

  • String 类的substring方法可以从一个较大的字符串提取出一个子串
  • substring 方法的第二个参数是不想复制的第一个位置
  • substring的工作方式有一个优点:容易计算子串的长度。
  • 例子:s.substring(a,b)

6.2 拼接

  • Java 允许使用 + 号连接(拼接)两个字符串
  • 当将一个字符串和非字符串的值进行拼接是,后者会被转换成字符串
  • 如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态的join方法

6.3 不可变字符串

  • String 类没有提供用于修改字符串的方法
  • 不可变字符串有一个优点:编译器可以让字符串共享

6.4 检测字符串是否相等

  • 可以使用equals方法检测两个字符串是否相等:s.equals(t)

    如果字符串s与字符串t相等,则返回true,否则为false
  • 不要使用==运算符检测两个字符串是否相等,这个运算符只能确定两个字符串是否放在同一个位置上,如果字符串在同一个位置上,那么它们必然相等;但是,当内容相同的字符串放在了不同的位置上时则不相等

6.5 空串 与 null串

  • 空串"" 是长度为0的字符串,是一个Java对象,有自己的串长度(0)和内容(空)
  • String变量可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联

6.6 码点与代码单元

  • Java字符串由char值序列组成

6.7 String Api

  • Java 中的String类包含了50多个方法

6.8 阅读联机API文档

  • 文档地址: docs/api/index.html

6.9 构建字符串

  • 使用StringBuilder类可以避免每次都构建一个String对象的问题
  • 当每次需要添加一部分内容时,就调用append方法
  • 在需要构建字符串就调用toString方法

7 输入输出

7.1 读取输入

  • 需要通过控制台进行输入,首先需要构建一个Scanner对象,并与标准输入流System.in关联
    Scanner in = new Scanner(System.in);
  • nextLine方法将输入一行
  • 要读取一个整数,可以调用nextInt方法

7.2 格式化输出

  • 用于printf的转换符:
转换符 类型 举例
d 十进制整数 159
x 十六进制整数 9f
o 八进制整数 237
f 定点浮点数 15.9
e 指数浮点数 1.59e+01
g 通用浮点数 ——
a 十六进制浮点数 0x1.fccdp3
s 字符串 Hello
c 字符 H
b 布尔 True
h 散列码 42628b2
tx或Tx 日期时间(T强制大写) 已经过时,应当改为使用java.time类
% 百分号 %
n 与品台有关的行分隔符 —— 、

7.3 文件输入与输出

  • 想要对文件进行读取,就需要用一个File对象构造一个Scanner对象
  • 如果文件名中包含反斜杠号,就要在每个反斜杠号前在添加一个反斜杠号
  • 要想写入文件,就需要构造一个PrintWriter对象
  • 不能使用一个不存在的文件构造一个Scanner,不能使用一个不能被创建的文件名构造一个PrintWriter,否则会发生异常,Java编译器认为这些异常比“被零除”异常更严重

8 控制流程

8.1 块作用域

  • 块(即复合语句)是由一对大括号括起来的若干条简单的Java语句
  • 块确定了变量的作用域
  • 一个块可以潜逃在另一个块中
  • 不能在嵌套的两个块中声明同名的变量

8.2 条件语句

  • Java条件语句的格式
    if(condition) statement
    或
    if(condition) statement1 else statement2
    或if(condition) statement1 else if(condition) statement2 else statement3

这里的条件(condition)必须用括号括起来

  • 使用块可以在Java程序结构中原本只能放置一条语句的地方放置多条语句

8.3 循环

  • 一般格式:
    while(condition) statement
  • 当条件为true是,while循环执行一条语句(也可以是一个语句块)
  • 如果开始循环条件的值就为false,则while循环体一次也不执行
  • do/while:
    do statement while(condition);

这种循环语句先执行语句(通常是一个语句块),在检测循环条件,然后再重复语句,再检测条件,以此类推。


8.4 确定循环

  • for循环语句是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或者类似的变量来控制迭代次数。
  • for语句第一部分通常用于对计数器的初始化,第二部分给出每次新一轮执行前要检测循环条件,第三部分指示如何更新计数器

8.5 多重选择:switch语句

    switch(choice)
    {
        case 1:
            ...
            break;
        case 2:
            ...
            break;
        case 3:
            ...
            break;
        case 4:
            ...
            break;
        defult:
            ...
            break;
    }
  • switch语句将从与选项值相匹配的case标签处开始执行直到遇到break语句,或者执行到switch语句的结束处为止。如果没有相匹配的case标签,而有default子句,就执行这个子句。
  • 注意:如果在case分支语句末尾没有break语句,那么就会接着执行下一个case分支语句
  • case标签可以是:

    1) 类型为char、byte、short或int的常量表达式

    2) 枚举常量

    3) 从JavaSE 7开始,case标签还可以是字符串字面量

8.6 中断控制流程语句

  • 使用不带标签break跳出循环语句
  • 使用带标签的break跳出多重嵌套的循环语句

9 大数值

  • 如果基本的整数和浮点数精度不能满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal,这两个类可以处理包含任何长度数字序列的数值
  • BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算
  • 当时用这两个方法时,不能使用常用的算术运算符(如+和*),而需要使用大数量值类中的add和multiply方法

10 数组

  • 数组是一种数据结构,用来存储同一类型的值的集合
  • 声明数据变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字
    例如:
        int[] a;
  • 数组的两种形式:
    int[] a;
    或
    int a[];
  • 一旦创建了数组,就不能再改变它的大小(尽管可以改变每一个数组元素)

10.1 for each循环

  • for each循环可以用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心
  • for each循环语句格式
    for(variable : collection) statement

-for each循环语句的循环变量将会遍历数组中的每个元素,而不需要下标值


10.2 数组初始化以及匿名数组

  • 在Java中,提供了一种创建数组对象并同时赋予初始值的简写书写方式:
如:
    int[] smallPrimes = {2,3,5,7,11,13}

请注意,在使用这种语句时,不需要调用new

  • 甚至还可以初始化一个匿名的数组:
    new int[] {17,19,23,29,31,37}

这种表示法将创建一个新数组并利用括号提供的值进行初始化,数组的大小就是初始值的个数


10.3 数组拷贝

  • 在Java中,允许将一个变量拷贝给另一个数组变量,两个变量将引用同一个数组
  • 如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,那么将赋值为false。相反,如果长度小于原始数组的长度,则只拷贝最前面数组元素。

10.4 命令行参数

  • Java应用中的String args[] 参数的main方法表明main方法将接收一个字符串数组,也就是命令行参数

10.5 数组排序

  • 要想对数值型数组进行排序,可以使用Arrays类中的sort方法:
如:
    int [] a = new int[10000];
    ...
    Arrays.sort(a);

10.6 多维数组

  • 多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排序形式
  • 一个简单的例子:
    double[][] balances;
  • 在调用new对多维数组进行初始化前不能使用它

你可能感兴趣的:(第三章 Java的基本程序设计结构)