目录
JAVA基础知识(二)JAVA程序基础(数据类型及运算符)
注释
单行注释
// 这是单行注释
System.out.println("hello, world")
多行注释
/*
这是多行注释
*/
System.out.println("hello, world")
文档注释
/**
* 这是文档注释,用以对函数、类等进行注释说明
* @param args
*/
public static void main(String[] args) {
System.out.println();
}
基本结构
一个JAVA的hello,world
程序,HelloWorld.java
public class HelloWorld {
// 主函数,写法固定。
public static void main(String[] args) {
System.out.println("Hello,World");
}
}
Java作为面向对象的编程语言,一个基本的java程序就是从一个同文件名相同的类开始的,这个类是一个java程序所必须有的类。
类名具有一定的要求:
- 类名必须以英文字母开头,后接字母,数字和下划线的组合
- 以大写字母开头
java程序的运行入口是main
函数,它有固定的格式写法,如上可见。
System.out.println("输出内容")
是一个Java中输出到控制台的语句。
关键字
同其他编程语言一样,java也有其规定的关键字,这里列为表格,但是仅仅作为手册了解,不需要记忆,在后续学习过程中自然而然会知道哪些是关键字,并且也自然不会用以命名。
来源:Java关键字
关键字 | 含义 |
---|---|
abstract | abstract 关键字用于修饰类和方法:1)抽象类抽象类是一个受限制的类,不能用于创建对象(要访问它,它必须从另一个类继承)。2)抽象方法抽象方法只能在抽象类中使用,并且没有实现。 由子类实现抽象方法(从继承)。 |
assert | 断言,用来进行程序调试 |
boolean | 基本数据类型之一,声明布尔类型的关键字 |
break | 中断循环语句的执行 |
byte | 基本数据类型之一,字节类型 |
case | 用在switch语句之中,表示其中的一个分支 |
catch | 用在异常处理中,用来捕捉异常 |
char | 基本数据类型之一,字符类型 |
class | 声明一个类 |
const | 保留关键字,没有具体含义 |
continue | 跳出本次循环,断续执行下一次循环 |
default | 默认,例如,用在switch语句中,表明一个默认的分支。 Java8 中也作用于声明接口函数的默认实现 |
do | 用在do-while循环结构中 |
double | 基本数据类型之一,双精度浮点数类型 |
else | 用在条件语句中,表明当条件不成立时的分支 |
enum | 枚举 |
extends | 表明一个类型是另一个类型的子类型。对于类, 可以是另一个类或者抽象类; 对于接口,可以是另一个接口 |
final | 用来说明最终属性,表明一个类不能派生出子类, 或者成员方法不能被覆盖, 或者成员域的值不能被改变,用来定义常量 |
finally | 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 |
float | 基本数据类型之一,单精度浮点数类型 |
for | 一种循环结构的引导词 |
goto | 保留关键字,没有具体含义 |
if | 条件语句的引导词 |
implements | 表明一个类实现了给定的接口 |
import | 表明要访问指定的类或包 |
instanceof | 用来测试一个对象是否是指定类型的实例对象 |
int | 基本数据类型之一,整数类型 |
interface | 接口 |
long | 基本数据类型之一,长整数类型 |
native | 用来声明一个方法是由与计算机相关的语言 (如C/C++/FORTRAN语言)实现的 |
new | 用来创建新实例对象 |
package | 包 |
private | 一种访问控制方式:私用模式 |
protected | 一种访问控制方式:保护模式 |
public | 一种访问控制方式:共用模式 |
return | 从成员方法中返回数据 |
short | 基本数据类型之一,短整数类型 |
static | 表明具有静态属性 |
strictfp | 用来声明FP_strict(单精度或双精度浮点数) 表达式遵循[IEEE 754](https://baike.baidu.com/item/IEEE 754)算术规范 |
super | 表明当前对象的父类型的引用或者父类型的构造方法 |
switch | 分支语句结构的引导词 |
synchronized | 表明一段代码需要同步执行 |
this | 指向当前实例对象的引用 |
throw | 抛出一个异常 |
throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
transient | 声明不用序列化的成员域 |
try | 尝试一个可能抛出异常的程序块 |
void | 声明当前成员方法没有返回值 |
volatile | 表明两个或者多个变量必须同步地发生变化 |
while | 用在循环结构中 |
变量
变量就是初中数学的代数的概念,例如一个简单的方程,x,y都是变量:
y=x2+1
在Java中,变量需要先定义后使用。定义格式如下:
数据类型 变量名[ = 初始化值];
例如:
int a = 1; // 定义一个整型变量a,并且令其当前值为1。
int b,c; // 定义整型变量b和c
a = 2; // 变量a再次使用无需声明类型,表示将a的值改为1
b = 1; // 虽然定义时没有给初始化值,但是后面要使用则必须先给定值,然后才可以使用。
在Java中,变量分为两种:基本类型的变量和引用类型的变量。
基本类型
整数类型
表示整数(默认为十进制),Java中均有符号。
类型 | 描述 | 取值范围 |
---|---|---|
byte | 1字节,8bit | -128 ~ 127 |
short | 2字节 | -32768 ~ 32767 |
int | 整型,4字节 | -2147483648 ~ 2147483647 |
long | 长整型,8字节 | -9223372036854775808 ~ 9223372036854775807 |
byte a = 1;
short b = 100;
int c = 100000;
long d = 100000000000000L; // 要加后缀L
也可以使用二进制、八进制、十六进制方式定义
进制 | 前缀符号 | 例子 |
---|---|---|
二进制 | 0b 或0B | int a = ob10; //等价于2 |
八进制 | 0 (PS:零) | int a = 010; // 等价于8 |
十六进制 | 0x 或0X | int a = 0x10; // 等价于16 |
浮点型
表示小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的,如1234.5可以表示成12.345x102,也可以表示成1.2345x103,所以称为浮点数。
Java中,浮点数无法精确表示(事实上,计算机中均如此),“因为十进制的
0.1
换算成二进制是一个无限循环小数,很显然,无论使用float
还是double
,都只能存储一个0.1
的近似值。但是,0.5
这个浮点数又可以精确地表示。”
类型 | 描述 | 最大表示 |
---|---|---|
float | 浮点型 | 3.4x1038 |
double | 双浮点型 | 1.79x10308 |
定义方式如下:
float x = 1.2f;// float型定义后需加上后缀f
float x1 = 3.14e38f; // 等价于 3.14 * 10^38
double y = 1.3;
浮点型判别相等请使用“相减后求绝对值忽略一定精度的方式”,不要用==
判断
布尔类型
boolean
, 表示真或假,值为true或者false,是关系运算的结果,可以狭义的理解为正确或错误。Java中不能认为1为真,0为假。
boolean flag1 = true;
boolean flag2 = false;
boolean result = 1 > 2 ;// 计算结果为false
字符类型
char
,表示一个unicode
字符,用单引号表示''
,可以是一个数字、汉字、字母、符号。
char x = 'a';
char x1 = 97; // 利用Java进行自动类型转换
char x2 = '\u0061'; // unicode方式,十六进制0061 = 十进制97
System.out.println(x); // 输出:a
System.out.println(x1); // 输出:a
System.out.println(x2); // 输出:a
想知道具体字符的unicode
码(取值范围0~65535),可以通过以下方式获取:
int value = (int)'a';
System.out.println(value);
基本数据类型间的转换
PS:boolean
不能和其他基本类型进行转换。
自动类型转换
将取值范围小的类型自动提升为取值范围大的类型,隐式且自动转换。
例如:byte->int
byte a = 123;
int b = 12345;
b = a; // 将a赋值给b,a将自动转换为int型
强制类型转换
将取值范围大的类型转换为取值范围小的类型,显示且手动转换。
转换格式:
<取值范围小的数据类型> <变量名> = (<取值范围小的数据类型>)<取值范围大的变量>
强制类型转换可能会丢失一些精度或溢出。
例如: double -> int
double x = 3.14;
int a = (int)x;
System.out.println(a); // 输出:3
Java运算中,byte,short,char
都会先被提示成为int
型然后再计算。
byte a = 1;
byte b = 2;
byte c = a + b; // 报错:Required type:byte,Provided:int
引用类型
字符串
String
, 常用的引用类型。
String str = "hello, world";
System.out.println(str); // 输出:hello,world
特殊字符需要转义,使用\
来进行转义
\"
表示字符"
\'
表示字符'
\\
表示字符\
\n
表示换行符\r
表示回车符\t
表示Tab\u####
表示一个Unicode编码的字符
Java中String
是不可变类型,对其的操作(运算)都是相当于返回了一个新的字符串。
字符串的判别相等要使用str.equals()
方式判别。
数组
数组是一组类型相同的变量的集合,是一种引用类型。
定义方式
<数据类型>[] <数组名> = new <数据类型>[<数组大小>]
也可以以直接初始化方式定义,这样默认数组大小就是n
<数据类型>[] <数组名> = {<数据1>, <数据2>,……,<数据n>}
例如:
int[] list = new int[5];
通过下标访问每个变量list[0]
、list[1]
……list[4]
。同C/C++语言一样,需要预留最后一个位置不能使用。
数组大小:list.length
将数组内元素排序的方法:Arrays.sort(<待排序数组>)
将数组内元素转换成字符串:Arrays.toString(<待排序数组>)
二维数组
既数组的数组。也可以简单的理解成一种二维“表格”。
基本定义如下:
-
静态初始化(举例):
int[][] table = { {1, 2}, {4, 5, 6}, {7, 8, 9} };// 每一行允许长度不一致。
-
动态初始化(举例)
// 先new出“表格”的行 int[][] table2 = new int[3][]; // 再分别new出“表格”的列 for (int j = 0; j < table2.length; j++) { // new “列”,并赋值 table2[j] = new int[3]; }
综合举例:
package run.heat.java; import java.util.Arrays; public class HelloWorld { public static void main(String[] args) { System.out.println("-------------静态初始化-------------"); int[][] table = { {1, 2}, {4, 5, 6}, {7, 8, 9} }; for (int[] cow: table) { System.out.println(Arrays.toString(cow)); } System.out.println("-------------动态初始化-------------"); // 先new出“表格”的行 int[][] table2 = new int[3][]; // 再分别new出“表格”的列 int t = 1; for (int j = 0; j < table2.length; j++) { // new “列”,并赋值 table2[j] = new int[j + 1]; for (int i = 0; i < table2[j].length; i++) { table2[j][i] = t++; } } for (int i = 0; i < table2.length; i++) { System.out.println(Arrays.toString(table2[i])); } } }
其他
其他
均可以看作java提供的对象,后面具体介绍, 使用前需要new
(既需要手动创建)。
空值
引用类型的变量可以指向一个空值,再Java中用关键字null
表示。
String s = null;
常量
与变量相对,在程序运行过程中自定义起既不变的量。定义变量前加上
final
关键词,则定义了一个常量,常量名称通常全部大写。
final double PI = 3.1415826;
作用域
通常,从定义开始,到语句块结束(既最近一层{}
结束处)。
{
...
int i = 0; // 变量i从这里开始定义
...
{
...
int x = 1; // 变量x从这里开始定义
...
{
...
String s = "hello"; // 变量s从这里开始定义
...
} // 变量s作用域到此结束
...
// 注意,这是一个新的变量s,它和上面的变量同名,
// 但是因为作用域不同,它们是两个不同的变量:
String s = "hi";
...
} // 变量x和s作用域到此结束
...
} // 变量i作用域到此结束
// 来源: https://www.liaoxuefeng.com/wiki/1252599548343744/1255883729079552
标识符
给类、变量、接口、方法、包等起的名字均称为标识符。
规定:
- 组成:大、小写字母、数字、
$
、_
、中文字符(不推荐使用) - 数字不能最为开头
- 标识符不能是关键字
规范:
- 方法(函数)名、变量名:驼峰取名法
- 常量名:字母均大写
- 类名:所有单词首字母大写
运算
四则运算
遵循四则运算规则,与数学规则一致。****
public class Main {
public static void main(String[] args) {
int i = (100 + 200) * (99 - 88); // 3300
int n = 7 * (5 + (i - 9)); // 23072
int k = (3 * 4) / 2; // 6
System.out.println(i);
System.out.println(n);
System.out.println(k);
}
}
// 来源:https://www.liaoxuefeng.com/wiki/1252599548343744/1255888634635520
特别的:
- 被除数为0时,运行时会报错,编译不报错。
- 除数和被除数都为整数时,其运算结果也为整数(可能失去精度)
简写
当变量自身作为参与运算的元素时,可以简写。
int a, b;
a += b; // 等价于: a = a + b
a -= b; // 等价于: a = a - b
a /= b; // 等价于: a = a / b
a *+ b; // 等价于: a = a * b
求余运算
对整数,用运算符%
例如,求3/2
的余数
int rs = 3 % 2;
自增自减运算
自增:
<变量>++
:先使用后对变量+1
++<变量>
:先对变量+1
,后使用
自减:
<变量>--
:先使用后对变量-1
--<变量>
:先对变量-1
,后使用
位运算
对整数,计算机以二进制形式存储,所以可以进行位运算。
右移运算(>>
):将整数的二进制形式右移一位,等价于除以2。
左移运算(<<
):将整数的二进制形式左移一位,等价于乘以2。
与运算(&
):将两个整数按位进行与运算。
或运算(|
):将两个整数按位进行或运算。
非运算(~
):将一个数按位进行非运算。
异或运算(^
):两个整数按位进行异或运算。
有关位运算的具体理论及使用,参考:位运算
与位运算有关的计算机基础知识补充:计算机组成原理-原码, 反码和补码,了解一下计算机底层逻辑,了解下原码、反码、补码,对于位运算会有一定更加深刻的感觉。
运算符的优先级
在Java的计算表达式中,运算优先级从高到低依次是:
()
!
~
++
--
*
/
%
+
-
<<
>>
>>>
&
|
+=
-=
*=
/=
记不住也没关系,只需要加括号就可以保证运算的优先级正确。
布尔运算
布尔运算既关系运算,结果总为
true
或false
- 比较运算符:
>
,>=
,<
,<=
,==
,!=
- 与运算
&&
:左式为false时,右式不再运算 - 或运算
||
:左式为true时,右式不再运算。 - 非运算
!
关系运算符的优先级从高到低依次是:
!
>
,>=
,<
,<=
==
,!=
&&
||
三元运算
<运算结果> = <布尔表达式> ? x : y
表示,根据布尔表达式的结果
- 若结果为
ture
:运算结果为x - 若结果为
false
:运算结果为y