Java 语言程序设计(学习笔记超详细版)

Java 语言程序设计(学习笔记超详细版)

第一章 Java起步入门

1.1起源

一个叫James Gosling的大佬想要开发用于消费类电子产品的嵌入式芯片,但是发现C++不能胜任,于是基于c++和smalltalk设计出了java。

1.1.1Java的优点

主要是两点:1.面向对象 2. 平台独立的

面向对象意味着所有代码都定义在类当中,而这些类的大多数可以实例化为对象。ok,怎样理解?

面向对象:类,是一种方法,是抽象的。实例,是具体的。类经过实例化后就成了对象。

平台独立:传统的编程中,在Windows编写和编译的代码只能在windows中运行,源代码直接编译成为可执行代码。而java是先把源代码编译为字节码,然后在java虚拟机上运行。

问题来了:怎么编译?用java编译器(一个叫javac的程序,在终端中使用javac命令可以检验环境变量是否配置成功)。

编译成字节码之后还需要java的运行环境(JRE)java runtime environment,哈哈,懂点英语很好记住缩写。

JRE是由JVM(java virtual machine)java虚拟机和java类库构成(JAVA API)。

还需要JDK(java development toolkit)java开发工具包用来编译和运行java程序。

1.1.2 Java三大平台

JSE(标准版)JEE(企业版)JME(微型版)

1.2一个程序分析

类定义

public class Shangzhaoyun{

}

类方法

public static void main(String[]args){

}

public是访问修饰符,static说明是该方法的静态方法,void说明返回值是空。

输出语句

System.out.println("1");

System.out.print("2");

System.out.print("3");

//输出为:

1

23

print()方法输出不换行。

第二章 基本数据类型与运算符

2.1 基本数据类型

Java共有8种基本数据类型。

前6种基本类型(byte、short、int、long、float和double)用于存储数字,它们能够存储数值的大小不同。

对于带有小数点的数字,需要float或double。float是用32位存储的浮点值。

char类型可以保存一个Unicode字符,比如’A’、‘9 ‘或’&’。Unicode也允许使用不包含在英语字母表中的字符。boolean类型值可以包含两种可能状态之一(false或true)。引用数据类型

Java还支持6种引用数据类型,其中包括类、接口、枚举、记录、注解和数组。

类是Java语言最重要的引用类型,任何Java程序都离不开类的使用。

接口是对类的一种扩展,它也是一种引用类型,但接口不能实例化。

枚举是一种特殊的引用类型,它用来定义具有确定几个值的类型,比如交通灯有绿色、红色、黄色三种颜色。

注解类型主要用于以结构化的方式为程序元素(类、方法等)提供信息。

记录在Java 15中是预览特性,它用来声明主要用于数据存储的类。

数组是一种特殊的引用类型,它不需要程序员自己定义类型。

2.2 关键字、变量与赋值

Java关键字

每种语言都定义了自己的关键字。所谓关键字(keywords)是该语言事先定义的一组词汇,这些词汇具有特殊的用途,用户不能将它们定义为标识符。Java标识符

标识符必须以字母、下划线(_)或美元符($)开头,其后可以是字母、下划线、美元符或数字,长度没有限制。如下面是一些合法的标识符:

intTest, Manager_Name, _var, $Var变量

变量(variable)是在程序运行中其值可以改变的量。一个变量通常由三个要素组成,数据类型、变量名和变量值。

int age;

double d1, d2;

char letter, ch2;变量赋值

age = 21;

letter = ‘A’;

d1 = d2 = 0.618;

也可以在声明变量的同时给变量赋值,例如:

boolean b = false;语句

程序由一系列指令组成,这些指令称为语句(statement)。Java有许多类型的语句,有简单的语句(如声明语句、赋值语句),也有控制流程语句(如if、while、for、switch)等语句。在Java中,语句以分号结束。

下面是给变量赋值的语句。

x = z + 5;

下面是一个变量声明语句。

long secondsElapsed;

2.3 程序注释

Java源程序支持三种类型的注释。

(1)单行注释

// 这里是注释内容

(2)多行注释

/*

该文件的文件名是:666

*/

(3)文档注释,以/*开始,以/结束的多行。

2.4 字面值与基本类型

2.3.1 字面值

字面值(literals)是某种类型值的表示形式,比如,99是int类型的字面值。

字面值有三种类型:基本类型的字面值、字符串字面值以及null字面值。基本类型的字面值有4种类型:整数型、浮点型、布尔型、字符型。整数字面值

Java提供4种整数类型,分别是byte型(字节型)、short型(短整型)、int型(整型)和long型(长整型)。

整型字面值有四种表示方法。

(1)十进制数。(2)二进制数。(3)八进制数。(4)十六进制数。

整型变量使用byte、short、int、long等声明。浮点字面值

Java中有两种浮点类型的数据:float型和double型。

浮点型字面值有两种表示方法。

(1)十进制数形式。

(2)科学记数法形式。

float pi = 3.1415926F;

System.out.println("float pi = " + pi);

如果一个数值字面值太长,读起来会比较困难。从Java 7开始,对数值型字面值的表示可以使用下划线(_)将一些数字进行分组,这可以增强代码的可读性。

210703_19901012_2415 // 表示一个身份证号

==注意:浮点数计算可能存在舍入误差,因此,浮点数不适合做财务计算,而财务计算中的舍入误差是不能接受的。==例如,下面语句的输出结果是0.8999999999999999,而不是所期望的0.9。

字符字面值

字符型字面值用英文单引号定界,大多数可见的字符都可用这种方式表示,如’a’、’@’、'我’等。

字符型变量使用char定义,在内存中占16位,表示的数据范围是0~65 535。字符型变量的定义如:

char c = ‘A’;布尔字面值

布尔型变量使用boolean关键字声明,如下面语句声明了布尔型变量t并为其赋初值true:

boolean t = true;

2.5 数据类型转换

在Java中,基本数据类型的转换分为自动类型转换和强制类型转换两种。

2.5.1 自动类型转换

自动类型转换也称加宽转换,它是指将具有较少位数的数据类型转换为具有较多位数的数据类型。例如:

byte b = 120;

int i = b; // 字节型数据b自动转换为整型

2.5.2 强制类型转换

将位数较多的数据类型转换为位数较少的数据类型。

其语法是在圆括号中给出要转换的目标类型,随后是待转换的表达式。例如:

double d = 200.5;

byte b = (byte)d;

System.out.println(b); // 输出-56

表达式类型自动提升:

除了赋值可能发生类型转换外,在含有变量的表达式中也有类型转换的问题,如下所示:

byte a = 40;

byte b = 50;

byte c = a + b;

c = (byte)(a + b); // 正确

int i = a + b;

该案例通过使用类型转换实现四舍五入功能。比如,圆周率在Java中用Math.PI常量表示,默认情况下输出它的值是3.141592653589793。假设希望将该值四舍五入保留4位小数,可以通过下面程序实现。

CastDemo.java

package com.boda.xy;

public class CastDemo{

public static void main(String[] args){

System.out.println(Math.PI); // 输出PI

double pi = Math.PI;

pi = pi * 10000 + 0.5; // 保证四舍五入

pi = (int) pi; // 保留整数部分

pi = pi / 10000; // 得到结果

System.out.println(pi);

}

}

2.6 运算符和表达式

运算符和表达式是Java程序的基本组成要素。把表示各种不同运算的符号称为运算符(operator),参与运算的各种数据称为操作数(operand)。为了完成各种运算,Java提供了多种运算符,不同的运算符用来完成不同的运算。表达式是由运算符和操作数按一定语法规则组成的符号序列。以下是合法的表达式:

(7 + 3) * (8 - 5)

a > b && c < d

一个字面值或一个变量是最简单的表达式。每个表达式经过运算后都会产生一个确定的值。

2.6.1 算术运算符

算术运算符一般用于对整型数和浮点型数运算。算术运算符有加(+)、减(-)、乘(*)、除(/)和取余数(%)5个二元运算符和正(+)、负(-)、自增(++)、自减(- -)4个一元运算符。

注意,除法运算符(/)时,如果两个操作数都是整数,商为整数,例如:5 / 2的结果是2而不是2.5,而5.0 / 2的结果是2.5。

“%”运算符用来求两个操作数相除的余数,操作数可以为整数,也可以为浮点数。例如,7 % 4的结果为3,10.5 % 2.5的结果为0.5。当操作数含有负数时,情况有点复杂。这时的规则是余数的符号与被除数相同且余数的绝对值小于除数的绝对值。例如:

10 % 4 = 2

10 % -4 = 2

-10 % 4 = -2

-10 % -4 = -2

在操作数涉及负数求余运算中,可通过下面规则计算:先去掉负号,再计算结果,结果的符号取被除数的符号。如求-10 % -4的结果,去掉负号求10 %4,余数为2。由于被除数是负值,因此最终结果为-2。

“+”运算符不但用于计算两个数值型数据的和,还可用于字符串对象的连接。例如,下面的语句输出字符串"abcde"。

System.out.println(“abc” + “de”);

当+运算符的两个操作数一个是字符串而另一个是其他数据类型,系统会自动将另一个操作数转换成字符串,然后再进行连接。例如下面代码输出“sum = 123”。

int a = 1, b = 2, c = 3;

System.out.println("sum = " + a + b + c);

但要注意,下面代码输出“sum = 6”。

System.out.println("sum = " + (a + b + c));

自增(++)和自减(–)运算符

“++”和“–”运算符主要用于对变量的操作,分别称为自增和自减运算符,“++”表示加1,“–”表示减1。它们又都可以使用在变量的前面或后面,如果放在变量前,表示给变量加1后再使用该变量;若放在变量的后面,表示使用完该变量后再加1。

变量x的值为5,执行下面语句后y和x的值如下所示:

y = x++; //语句执行后 y = 5 x = 6

y = ++x; //语句执行后y = 6 x = 6

y = x–; //语句执行后y = 5 x = 4

y = --x; //语句执行后y = 4 x = 4

2.6.2 比较运算符

比较运算符(也称关系运算符)用来比较两个值的大小或是否相等。一般用来构成条件表达式,比较的结果返回true或false。假设定义了下面的变量。

int x = 99;

int y = 108;

下面的语句的输出是true。

System.out.println(x < y);

比较结果通常作为判断条件,如下所示。

if (n % 2 == 0)

System.out.println( n + “是偶数”);

2.6.3 逻辑运算符

逻辑运算符包括以下几种:逻辑非(!)、短路与(&&)、短路或(||)、逻辑与(&)、逻辑或(|)、逻辑异或(^)。

在相同的初始条件下,使用短路逻辑运算符和非短路逻辑运算符,对同一表达式的计算结果可能不同。

【程序2-6】LogicalDemo.java

package com.boda.xy;

public class LogicalDemo{

public static void main(String[] args){

int a = 1, b = 2, c =3 ;

boolean u = false;

u = (a >= --b || b++ < c–) && b = = c;

System.out.println("u = " + u);

// 使用&和|运算符

b = 2;

u = ( a >= --b | b++ < c–) & b == c;

System.out.println("u = "+u);

}

}

2.6.4 赋值运算符

赋值运算符用来为变量指定新值。

int x = 10;

int y = x + 20;

赋值运算必须是类型兼容的,即左边的变量必须能够接受右边的表达式的值,否则会产生编译错误。如下面的语句产生编译错误。

int pi = 3.14;

复合赋值运算符

用变量当前值与右侧表达式值进行运算,最后将运算结果赋给变量。例如,下面两行是等价的:

a += 3;

a = a + 3;

2.6.5 位运算符

位运算有两类:位逻辑运算(bitwise)和移位运算(shift)。位逻辑运算符包括按位取反(~)、按位与(&)、按位或(|)和按位异或(^)4种。移位运算符包括左移(<<)、右移(>>)和无符号右移(>>>)3种。

课堂讲授 2.8.6 运算符的优先级

假设有下面一个表达式:

3 + 4 * 5 > (5 * (2 + 4) – 10)&& 8 – 4 > 5

首先计算括号中的表达式(如果有嵌套括号,先计算里层括号中的表达式)。当计算没有括号的表达式时,会按照运算符的优先级和结合性进行运算。

不必死记硬背运算符的优先级。必要时可以在表达式中使用圆括号,圆括号的优先级最高。圆括号还可以使表达式显得更加清晰。例如,考虑以下代码:

int x = 5;

int y = 5;

boolean z = x * 5 == y + 20;

因为“*”和“+”的优先级比“= =”高,比较运算之后,z的值是true。但是,这个表达式的可读性较差。使用圆括号把最后一行修改如下:

boolean z = (x * 5) == (y + 20);

案例学习:显示当前时间

问题描述

编写程序,以GMT(格林尼治时间)来显示当前的时间,以“小时:分钟:秒”的格式来显示。要求得到类似下面的输出结果。

当前时间:11:10:27

CurrentTime.java

package com.boda.xy;

public class CurrentTime {

public static void main(String[] args) {

long t = System.currentTimeMillis();

long seconds = t / 1000; // 总秒数

long s = seconds % 60;

long minutes = seconds / 60; // 总分钟数

long m = minutes % 60;

long hours = minutes / 60; // 总小时数

long h = hours % 24;

System.out.println(“当前时间:”+h +":" + m + “:” + s);

}

}

第三章 各种循环与判断语句

3.1 判断语句

要求:用户从键盘输入两个整数,分别存入变量a与b,如果a大于b,则交换a和b的值,也就是保证a小于或等于b,最后输出a和b的值。

if(a > b){

int t = b;

b = a;

a = t;

}

if-else结构的一般格式如下:

if (条件){

语句(组)1;

}else{

语句(组)2;

}要求用户从键盘输入一个年份,输出该年是否是闰年。符合下面两个条件之一的年份即为闰年:(1)能被400整除;(2)能被4整除,但不能被100整除。

if(year % 400 = = 0||(year % 4 == 0 && year % 100 != 0)){

System.out.println(year + " 年是闰年。") ;

}else{

System.out.println(year + " 年不是闰年。") ;

}

多分支if-else语句

多分支if-else语句的使用。要求输入一个人的身高和体重,计算并打印出他的BMI,同时显示BMI是高还是低。对于一个成年人,BMI值的含义如下:

BMI<18.5,表示偏瘦;

18.5≤BMI<25.0,表示正常;

25.0≤BMI<30.0,表示超重;

BMI≥30.0,表示过胖。

if(bmi < 18.5){

System.out.println("你的体重偏瘦。");

}else if(bmi < 25.0) {

System.out.println("你的体重正常。");

}else if(bmi < 30.0) {

System.out.println("你的体重超重。");

}else {

System.out.println("你的体重过胖。");

}

条件运算符

条件运算符(conditional operator)的格式如下:

for (条件 ? 表达式1 : 表达式2)

switch语句

如果需要从多个选项选择其中一个,可以使用switch语句。switch语句主要实现多分支结构,一般格式如下:

switch (表达式){

case 值1 -> 语句(组)1;

case 值2 -> 语句(组)2;

case 值n -> 语句(组)n;

[default -> 语句(组)n+1;]

}

3.2 循环语句

在程序设计中,有时需要反复执行一段相同的代码,这时就需要使用循环结构来实现。Java语言提供了4种循环结构:while循环、do-while循环、for循环和增强的for循环。

一般情况下,一个循环结构包含四部分内容:

(1)初始化部分:设置循环开始时变量初值。

(2)循环条件:一般是一个布尔表达式,当表达式值为true时执行循环体,为false时退出循环。

(3)迭代部分:改变变量的状态。

(4)循环体:需要重复执行的代码。

while循环是Java最基本的循环结构,这种循环是在某个条件为true时,重复执行一个语句或语句块。它的一般格式如下:

while(条件){

// 循环体

[迭代部分]

}

使用while循环计算1到100之和。

int n = 1;

int sum = 0;

while(n <= 100){

sum = sum + n;

n = n + 1;

}

System.out.println("sum = " + sum); // 输出sum = 5050

do-while循环

do-while循环的一般格式如下:

[初始化部分]

do{

// 循环体

[迭代部分]

}while(条件);

用do-while循环计算1到100之和。

int n = 1;

int sum = 0;

do{

sum = sum + n;

n = n + 1;

}while(n <= 100);

System.out.println("sum = " + sum); // 输出sum = 5050

for循环

for循环是Java程序中使用最广泛的,也是功能最强的循环结构。它的一般格式如下:

for (初始化部分; 循环条件; 迭代部分){

// 循环体

}

这里,初始化部分、循环条件和迭代部分用分号隔开,大括号内为循环体。

下面代码使用for循环计算1到100之和。

int sum = 0;

for(int n = 1; n <= 100; n++){

sum = sum + n;

}

System.out.println("sum = " + sum); // 输出sum = 5050

循环的嵌套

在一个循环的循环体中可以嵌套另一个完整的循环,称为循环的嵌套。内嵌的循环还可以嵌套循环,这就是多层循环。同样,在循环体中也可以嵌套另一个选择结构,选择结构中也可以嵌套循环。

用嵌套的for循环打印输出:第一行输出一个星号,第二行输出3个星号,…,第8行输出15个星号。

// n记录行数

for (int n = 1; n <= 8; n++) {

// 打印每行的前导空格

for (int k = 1; k <= (8 - n); k++) {

System.out.print(" ");

}

// 每行打印2*n-1个星号

for (int j = 1; j <= (2*n – 1); j++) {

System.out.print("*");

}

System.out.println(); // 换行

}

break语句

break语句是用来结束while、do、for结构的执行,该语句有两种格式:

break;

break 标签名;continue语句

continue语句与break语句类似,但它只终止执行当前的迭代,导致控制权从下一次迭代开始。该语句有下面两种格式:

continue;

continue 标签名;

总结

算术运算符包括:加(+)、减(-)、乘(*)、除(/)、求余(%)、自增(++)、自减(–),关系运算符包括:大于(>)、小于(<)、大于或等于(>=)、小于或等于(<=)、等于(==)、不等于(!=),

位运算符包括:按位取反(~)、按位与(&)、按位或(|)、按位异或(^)、左移(<<)、右移(>>)、无符号右移(>>>),位运算符只能应用在整型数据上,逻辑运算符包括:逻辑非(!)、短路与(&&)、 短路或(||)、逻辑与(&)、逻辑或(|)、逻辑异或( ^ ),赋值运算符包括(=)和扩展的赋值运算符(如+=、<<=等)

循环语句有四种:while循环、do-while循环、for循环和增强的for循环。循环中包含重复执行语句的部分称为循环体。

while循环首先检查循环继续条件,如果条件为true,则执行循环体;如果条件为false,则循环结束。

do-while循环与while循环类似,只是do-while循环先执行循环体,然后再检查循环继续条件,以确定是继续循环还是终止循环。

for循环控制由三部分组成。第一部分是初始操作,通常用于初始化控制变量。第二部分是循环继续条件,决定是否执行循环体。第三部分是每次迭代后执行的操作,经常用于调整控制变量。for循环一般用在循环体执行次数固定的情况。

在循环体中可以使用break和continue这两个关键字。break立即终止包含break的最内层循环。continue只是终止当前迭代。

头都要裂开了!ccf-csp的题目自练明天马上更新。