Java核心技术(二) —— Java的基本程序设计结构

本文主要讲述程序设计相关的基本概念在Java中的实现方式,涉及的内容很多很细,包括注释、数据类型、变量、运算符、字符串、输入输出、控制流、大数值和数组。

1、基本认知

(1)Java对大小写敏感

(2)源代码的文件名必须与公共类的名字相同,并以.java作为扩展名

(3)源代码文件经过编译得到一个包含这个类的字节码的文件,并将其自动地命名为同名文件,只不过扩展名为.class,并与源文件存储在同一个目录下。

(4)运行编译后的程序时,java虚拟机将从制定类中的main方法(方法即函数)开始执行,因此为了代码能够执行,在类的源文件中必须包含一个main方法,且必须声明为public,static的。

(5).用来调用方法。

2、注释

注释并不会出现在可执行程序中,因而不必担心可执行代码膨胀。

(1)//行注释

(2)/加一星号开头,一星号加/结尾,进行段注释

(3)/加两星号开头,一星号加/结尾,可以自动生成文档。注意每行以星号开头,如

3、数据类型

Java为强类型语言,即必须为每一个变量声明一种类型。

Java包含八种基本类型,四种整型、两种浮点类型、一种字符类型、一种布尔类型。

3.1 整型

(1)注意Java中没有任何无符号类型(unsigned)

(2)加前缀0b可以用来写二进制数,如0b1001就是9。也可以为数字字面量加下划线,如1_000_000表示一百万,当然这里的下划线只是为了人们读方面,java编译器会去除这些下划线。

3.2 浮点类型

(1)一般来说,很少使用float类型,除了需要快速处理单精度数据、需要存储大量数据时。

(2)float类型数值有一个后缀F,如3.14F,没有的话默认为double型。

(3)注意,有三个特殊的浮点数值表示:POSITIVE_INFINITY、NEGATIVE_INFINITY和NaN。注意所有非数值被认为是不相同的,不能进行if判断等等,如if(x == Double.NaN)是错的。

(4)还需注意的一点是,浮点数值不适用于禁止出现舍入误差的金融计算中,如System.out.println(2.0-1,1)将打印出0.8999999999999,而不是期望的0.9。显然这是由于浮点数值采用二进制系统表示导致的。如果需要数值计算中不含有任何舍入误差,应该使用后面介绍的BigDecimal类。

3.3 Char类型

char类型用于表示单个字符,通常用来表示字符常量。

(1)同样,’A’表示字符常量,而”A”表示包含字符A的字符串。

(2)\u时转义序列符,可以用来表示Unicode代码单元的编码,或者一些特殊的字符,常用的特殊转义序列符

(3)在Java中,插入类型用UTF-16编码描述一个代码单元,最好不要使用char类型,最好将需要处理的字符串用抽象数据类型表示

3.4 布尔类型

即false和true。

(1)注意,区别于C++等,这里整型值和布尔值之间不能进行相互转换。

4、变量

在Java中,每一个变量属于一种类型。

(1)变量名必须是一个以字母开头的包含字符或数字的序列

(2)大小写敏感,长度无限制

(3)虽然可以一行中声明多个变量,但建议逐一声明每一个变量

4.1 变量初始化

区别于C++,java中不区分变量的声明和定义。声明一个变量后。必须用赋值语句对变量进行显示初始化,千万不可使用未被初始化的变量。

4.2 常量

(1)java中利用关键字final表示常量,即这个变量只能被赋值一次,一旦赋值,不可再改。习惯上,常量名使用全大写。注意不使用const。

(2)如果一个常量需要在一个类中的多个方法中使用,即类常量,可以使用关键字static final进行设置。

5、运算符

(1)当参与/运算的两个操作数都是整数时,表示整数除法,否则表示浮点除法。注意,整数除以0会产生异常,而浮点数除以0会得到无穷大或者NaN。

(2)浮点型数值在不同平台运算涉及到精度的截断或者扩展,很难达到可移植性。对于使用strictfp关键字标记的方法,要求方法中的所有指令都必须使用严格的浮点计算。

5.1 自增、自减运算符

当自增自减运算符用到表达式中时,后缀形式(即++,–在变量后)在自增自减后还是使用变量原来的值,而前缀形式则是自增自减后就用变化后的这个值餐与运算。

5.2 关系运算符与布尔运算符

(1)关系运算符得到的结果为false或者true

(2)与&&,或||,采用短路逻辑,即前一个操作数已经可确定表达式值,就不计算后一个。

(3)三元运算符

condition ? expression1 : expression2

即当condition为真时计算表达式1,否则计算2

例可用

x < y ? x : y

返回x与y中较小的那个值

5.3 位运算符

(1)

(2)>>和<<进行右移或左移,>>>将用0填充高位,>>用符号为填充高位,没有<<<运算符

(3)对移位运算符右侧的参数需要进行模32的运算,除非左边的操作数是long型,那么此时进行模64运算即可,如1<<35和1<<3都表示8。

5.4 数学函数与常量

Math类中包含了许多数学函数。

(1)Java中没有幂运算,需要借用Math.power(x,a)方法

(2)Math的导入只要在源文件的顶部加上这行代码

import static java.lang.Math.*;

5.5 数值类型之间的转换

以下为数值类型之间的合法转换方向

对于不同类型的两个操作数进行运算时,会自动转换为同一种类型,转换方式参考上图方向,让两者保持最远的那个类型。

5.6 强制类型转换

当需要实现上图不存在的转换关系时,即需要进行强制类型转换,当然会造成信息丢失。通过在待转换的变量名前加(目标类型)进行,如(int) x。

注意,不要在布尔类型和其他任意数值类型之间进行强制类型转换,入药的情况可以适用条件表达式

b ? 1 : 0

5.7 括号与运算符级别

5.8 枚举类型

6、字符串

每个用双引号括起来的字符串都是String类的一个实例

6.1 子串

String类的substring方法可以从一个较大的字符串中提取出一个子串。

substring中从0开始计数,s.substring(a,b)表示提取字符串s的第a个字符到第b个(不包含第b个)。

6.2 拼接

循序使用+号进行连接两个字符串,当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。

6.3 不可变字符串

String类没有提供类似于C++中那种修改字符串的方法,如将”Hello”修改为”Help!”只能使用提取加拼接来实现替换。

因此,Java文档中将String类对象称为不可变字符串。

6.4 检测字符串是否相等

使用equals方法

s.equals(t)

注意s和t可以是字符串变量也可以是字符串常量。

equalsIgnoreCase方法是不区分大小写检测

切忌使用==检测字符串是否相等。

6.5 空串和Null串

空串“”是一个Java对象,有自己的串长度(0)和内容(空)。

还有一种特殊的String值,null,表示目前没有任何对象与该变量关联。

常用下属语句检查字符串既不是Null也不是空串

if (str != null && str.length() != 0)

6.6 构建字符串

采用前面介绍的字符串拼接大方是构建字符串,效率较低,因为每次拼接都会构建一个新的string对象,耗时浪费空间,可使用StringBuilder类。

7、输入输出

7.1 读取输入

想通过控制台进行输入,首先需要构造一个Scanner对象,并与标准输入流System.in关联

Scanner in = new Scanner(System.in);

现在才可以使用Scanner类的各种方法实现输入操作,如

String name = in.nextLine();

用来输入一行。

Scanner类定义在java.util包中,当使用的类不是定义在基本的java.lang包中时,需要使用import指示字将相应的包加载进来,即在程序的最开始添加

import java.util.*;

另外需要注意的是,Scanner类不适用于从控制台读取密码,应使用Console类。

7.2 格式化输出

较输入简单很多,直接使用System.out.print(x)将数值x输出到标准输出流(控制台窗口)上。此命令将以x对应的数据类型所允许的最大非零数字位数打印输出x。

(1)System.out.prinf(“%8.2f”,x);

即用8个字符的宽度和小数点后2个字符的精度打印x,例对于10000.0/3.0,将输出 3333.33,即一个空格和七个字符。

(2)printf也可也使用多个参数

关于转换符的释义见

7.3 文件输入与输出

类似于输入,要对文件进行读取,需要用一个File对象构造一个Scanner对象,如

Scanner in = new Scanner(paths.get(“myfile.txt”));

当然,如果文件名中包含符号\,需要在每个\钱再加一个额外的\避免歧义。

注意,当用一个不存在的文件构造一个Scanner或者不能被创建的文件名构造一个PrintWriter时,会产生严重异常,如果知道有可能出现这种异常,需提前在main方法中用throws字句标记。

8、控制流程

即我们要介绍条件语句和循环语句。Java没有goto语句,有break语句。

8.1 块作用域

不可以在嵌套的两个块中声明同名的变量。,区别于C++。

8.2 条件语句

if (condition) statement

以及

if (condition) statement1 else statement2

else永远跟最邻近的if构成一组。

8.3 循环语句

while (condition) statement

下述语句可以实现循环体至少被执行一次

do statement while (condition)

8.4 确定循环

即常用的for循环,注意在循环中,检测两个浮点数是否相等需要格外小心

for (int i = 0; i != 10; i += 0.1) …

可能永远都不会终结。由于舍入误差的存在,最终可能得不到精确值,上述程序中x将从9.99999999999998直接跳到10.09999999999998。

同样的,for语句第一部分中声明的变量,其作用域就为for循环的整个循环体。

8.5 多重选择

switch (choice)
{
    case 1:
        ...
        break;
    case 2:
        ...
        break;
    default:
        // bad input
        ...
        break;
}

注意,如果在case分支语句的末尾没有break语句就会接着执行下一个case分支语句,即触发多个case分支,相当危险,一定要避免。

为了避免此危险,建议编译代码时加上-Xlint:fallthrough选项。如此一来,如果某个分支最后缺少一个break语句,编译器就会给出警告。

case标签可以是

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

(2)枚举常量

(3)字符串字面量

注意,在switch语句中使用枚举常量时,不必在每个case钟志明枚举名,可以由switch的表达式值确定。

8.6 中断控制流程语句

(1)前面使用的break为普通用法,还有一种带标签的break用法,如

当满足condition时,通过执行带标签的break跳转到标签label冒号后的语句块的末尾,其实类似于C++的goto命令。

(2)与break不同,continue中断正常的控制流程,是将控制转移到最内层循环的首部。对于for循环,则跳到for循环的更新部分,即第三部分。

9、大数值

有时基本的整数和浮点数的精度不能满足需求,可以适用java.math包中的两个类:BigInteger和BigDecimal,分别可以实现任意精度的整数运算和任意精度的浮点数运算。

可以通过这两个类中的valueOf()方法将普通的数值转换为大数值,但对于步数值之间的算术运算,不能再使用+,*等,需要使用类中的add和multiple方法。

10、数组

数组是一种数据结构,用来存储同一类型值的集合,通过一个整型下标来访问数组中的每一个值。

(1)声明方法

int[] a;

(2)初始化,使用new运算符创建数组

int[] a = new int[100];

从而创建了一个可以存储一百个整数的数组。

创建一个数字数组时,所有元素初始化为0,布尔数组的元素初始化为false,对象数组的元素初始化为null。

(3)注意数组的一个元素为a(0)

(4)数组一旦创建,不可改变大小。如需扩展数组大小,应该是用另一种数据结构——数组列表,后面会讲。

10.1 for each 循环

可以快捷依次处理数组中的每个元素而不需要使用下标值。基本语法为

for (variable : collection) statement

定义的变量用于暂存集合中的每一个元素,并执行后续的语句。注意集合表达式collection必须是一个数组,或一个实现了Iterable接口的类对象,如ArrayList(数组列表)。

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

(1)Java提供了一种创建数组并同时赋初值的简化书写方式

int[] smallPrimes = {2, 3, 5, 7, 11, 13};

即不需要调用new。

(2)还允许初始化一个匿名的数组

new int[] {2, 3, 5, 7, 11, 13}

10.3 数组拷贝

Java允许将一个数组变量拷贝给另一个数组变量,此时两个变量将引用同一个数组。这里的拷贝即用赋值符号=实现。

10.4 数组排序

需要对数值型数组进行排序时,可以适用Arrays类中的sort方法。

10.5 多维数组

多维数组将使用多个下标访问数组元素,适用于表示表格或者更加复杂的排列形式。例如声明一个二维数组

double[][] a;

同样,在初始化之前不可使用

a = new double[b][c];

同样可以使用简便方式初始化

int[][] a = {{1,2,3}, {4,5,6}, {7,8,9}};

注意对于二维数组,for each语句不能自动处理其中每一个元素,其是按照行进行循环处理的,要想访问二维数组a的所有元素,需要两个嵌套循环,如

for (double[] row : a)
    for (double value : row)
        do something with value

10.6 不规则组

注意由于Java实际上没有多维数组概念,前面提到的多维实际上是数组的数组,因此,可以构造不规则的数组,即数组的每一行有不同的长度。

当需要创建一个不规则数组时,首先需要分配一个具有所含行数的数组

int[][] a = new int[NMAX+1][];

接下来,再分配这些行

for (int n=0; n<=NMAX; n++)
    a[n] = new int[n+1];

从而生成了一个三角矩阵。

时间: 2024-08-03 04:25:29

Java核心技术(二) —— Java的基本程序设计结构的相关文章

Java核心技术之Java概述与开发环境搭建

Java核心技术之Java概述与开发环境搭建 Java核心技术 1.1 浅谈计算机语言 1.1 计算机语言发展史 1.1.2 编程语言应用场景 1.2 Java概述 1.2.1 Java发展历史 1.2.2 Java的特性 1.2.3 Java技术体系平台 1.3 Java程序员的必备环境 1.4 理解JDK,JRE和JVM三者之间的关系 1.5 macOS配置Java环境 1.5.1 macOS下载JDK 1.5.2 macOS下JDK安装 1.5.3 macOS下JDK配置 1.6 Visu

[Java面试二]Java基础知识精华部分.

一:java概述(快速浏览): 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名为Java: Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发: JAVASE:Java Platform Standard Edition,完成桌面应用程序的开发,是其它两者的基础: JAVA

Java学习(二)--java概述

一 发展 看了java的发展史,发现他的发展充满了戏剧性.它没有经过精心的策划.制作,但是它的产生却具有了划时代的意义,一切的形成都好像顺利成章,又充满了传奇. 1990年,sun公司准备为下一代只能家电编写通用控制系统.因为C++的api存在的问题,创造了一种新的语言oak. 1992年,在其竞争机顶盒平台倡议中,因其过分给用户控制权而落选.否极泰来,在这里得到了最好的验证,再坚持一点点.下一个一点点就是转机. 1994年,互联网和浏览器的出现给oak带了希望.进过调整后,着眼于浏览器方法.更

Java核心技术(五) —— 泛型程序设计(2)

本文延续上文,针对泛型程序设计,从以下方面进行讲解: 为何使用泛型程序设计 定义简单的泛型类 泛型方法 类型变量的限定 泛型代码和虚拟机 约束与局限性 泛型类型的继承规则 通配符类型 反射和泛型 4.泛型代码和虚拟机 这里内容比较多且杂,我们先概括几个主要思想: 虚拟机中没有泛型,只有普通的类和方法 所有的类型参数都用他们的限定类型转换 桥方法被合成来保持多态 为保持类型安全性,必要时插入强制类型转换 (1)当定义一个泛型类型时,系统会自动提供一个相应的原始类型.原始类型的名字就是删去类型参数后

Java核心技术(五) —— 泛型程序设计(1)

本文主要针对泛型程序设计,从以下方面进行讲解: 为何使用泛型程序设计 定义简单的泛型类 泛型方法 类型变量的限定 泛型代码和虚拟机 约束与局限性 泛型类型的继承规则 通配符类型 反射和泛型 泛型程序设计,意味着编写的代码可以被很多不同类型的对象所重用. 1.泛型类 一个泛型类就是具有一个或多个类型变量的类,如定义一个Pair类 其中,Pair类引入了一个类型变量T,一般用比较短的大写形式来书写.实际上泛型类可以有多个类型变量,如上述程序中可以定义第一个域和第二个域具有不同的类型 之后,只要用具体

【JAVA 核心技术】java web 中的监听器

为什么要有监听器? 监听器是用来处理一系列事件的java类,可被配置在java web项目中. 既然如此,为什么不用代码直接调用监听器? 这可能是因为J2EE规范规定的项目工程标准,用web.xml指定监听器, 然后服务器中间件如weblogic可以以遵照标准,读取web.xml, 运行监听器处理指定的事件. 这样,listener,servlet是类似的规范. 为什么要有web.xml? web.xml可以方便(也许不)地修改工程中用到的监听器. 这种东西像不像触发器或者轮询进程?如果像,它跟

重学JAVA基础(二):Java反射

看一下百度的解释: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息    以及动态调用对象的方法的功能称为java语言的反射机制. 先看一下一个例子: 这是最简单的反射使用方法,通过反射来调用类的方法. 下面通过一个需求来做反射实验:有3种人类(黄,白,黑),分别继承于Human类,都有人类的共同操作Behaviour /** * 行为,区别于动物 * @author tomsnail *

java核心技术卷一

java核心技术卷一 java基础类型 整型 数据类型 字节数 取值范围 int 4 +_2^4*8-1 short 2 +_2^2*8-1 long 8 +_2^8*8-1 byte 1 -128-127       浮点类型 数据类型 字节数 取值范围 小数位数 float 4 10^-38~10^38和-10^-38~-10^38 小数位数6-7 double 4 10^-308~10^308和-10^-308~-10^308 15位小数         boolean 类型和char 类

Java核心技术 卷1 读书笔记 (3 Java基本程序设计结构)

3.3 数据类型 Java是强类型语言,必须为每一个变量声明一种类型. 3.3.1 整型 Java 提供四种整型 int 4字节 short 2字节 long 8字节 byte 1字节 长整型(long)数值有一个后缀L(例如40000000000L),十六进制数值有一个前缀0x(例如0xCAFE),八进制数值有一个前缀0(例如010). 3.3.2 浮点型 Java提供两种浮点类型 float 4字节 double 8字节 float类型的数值有一个后缀F(例如3.42F),没有后缀F的浮点数

Java核心技术第三章----Java的基本程序设计结构重难点总结

最近在看Java核心技术这本书,这里对第三章个人认为的重难点做一个总结.方便以后回顾,个人能力有限,本人菜鸟,大神勿喷,请大家多多指教. 一.位运算符 指定 A = 66(0100 0010); B = 22 (0001 0110)(这里为了简化说明支取一个字节即8位来运算) 位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能.如果要开发高效率程序,位运算符是必不可少的.位运算符用来对二进制位进行操作,包括:按位与(&).按位或(|).按位异或(^).按位取反(~).按