Java学习之入门
一、Java入门学习
一)安装jdk
1、下载jdk
oracle官网jdk下载地址(要有oracle账号才能下): https://www.oracle.com/java/technologies/downloads/
选择下载自己需要的版本以及符合硬件环境的安装包
我下载的是Linux x64操作系统的安装包:jdk-11.0.16.1_linux-x64_bin.tar.gz
2、安装jdk
mkdir -p /app/{3rd/java,download} cd /app/download # 上传安装包 tar -xvf jdk-11.0.16.1_linux-x64_bin.tar.gz -C /app/3rd/java
# 创建软连接,方便版本变更/切换
ln -s /app/3rd/java/jdk-11.0.16.1/ /app/3rd/java/jdk
3、配置环境变量,并验证
cat > /etc/profile.d/java.sh <<EOF export JAVA_HOME=/app/3rd/java/jdk export CLASSPATH=.:\$JAVA_HOME/jre/lib/rt.jar:\JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar export PATH=\$PATH:\$JAVA_HOME/bin EOF source /etc/profile.d/java.sh java -version
二)如何运行程序
Java源码本质上是一个文本文件,需要先用javac
把Hello.java
编译成字节码文件Hello.class
,然后,用java
命令执行这个字节码文件:
1、运行第一个程序
hello.java
class Simple{ public static void main(String args[]){ System.out.println("Hello Java !"); } }
这个定义被称为class(类),这里的类名是Hello
,大小写敏感,class
用来定义一个类,public
表示这个类是公开的,public
、class
都是Java的关键字,必须小写,Hello
是类的名字,按照习惯,首字母H
要大写。而花括号{}
中间则是类的定义。
程序运行步骤如下
第一步,在保存Hello.java的目录下执行命令javac Hello.java: $ javac Hello.java 如果源代码无误,上述命令不会有任何输出,而当前目录下会产生一个Hello.class文件: $ ls hello.java Simple.class 第二步,执行Simple.class,使用命令java Simple: $ java Simple Hello Java !
2、注意事项
一个Java源码只能定义一个public类型的class,并且class名称和文件名要完全一致;
使用javac可以将.java源码编译成.class字节码;
使用java可以运行一个已编译的Java程序,参数是类名
三)java程序基础
1、java程序基本结构
/** * 可以用来自动创建文档的注释 */ public class Hello { public static void main(String[] args) { // 向屏幕输出文本: System.out.println("Hello, world!"); /* 多行注释开始 注释内容 注释结束 */ } } // class定义结束
2、类名和方法名命名规范
注意到public是访问修饰符,表示该class是公开的。
不写public,也能正确编译,但是这个类将无法从命令行执行。
类名要求:
- 类名必须以英文字母开头,后接字母,数字和下划线的组合
- 习惯以大写字母开头
方法名也有命名规则,命名和class
一样,但是首字母小写:
Java有3种注释
第一种是单行注释,以双斜线开头,直到这一行的结尾结束: // 这是注释... 第二种是多行注释 多行注释以/*星号开头,以*/结束,可以有多行: /* 这是注释 blablabla... 这也是注释 */ 第三种特殊的多行注释 以/**开头,以*/结束,如果有多行,每行通常以星号开头: /** * 可以用来自动创建文档的注释 * * @auther liaoxuefeng */
3、基本数据类型
基本数据类型是CPU可以直接进行运算的类型。Java定义了以下几种基本数据类型:
-
整数类型:byte,short,int,long
-
浮点数类型:float,double
-
字符类型:char
-
布尔类型:boolean
数据类型占用的字节数不一样。Java基本数据类型占用的字节数
byte
恰好就是一个字节,而long
和double
需要8个字节。
整型
对于整型类型,Java只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)。各种整型能表示的最大范围如下:
- byte:-128 ~ 127
- short: -32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
浮点型
浮点类型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的,如1234.5可以表示成12.345x102,也可以表示成1.2345x103,所以称为浮点数。
布尔类型
布尔类型boolean
只有true
和false
两个值
字符类型
字符类型char
表示一个字符。Java的char
类型除了可表示标准的ASCII外,还可以表示一个Unicode字符
public class Main { public static void main(String[] args) { char a = 'A'; char zh = '中'; System.out.println(a); System.out.println(zh); } }
注意char
类型使用单引号'
,且仅有一个字符,要和双引号"
的字符串类型区分开。
引用类型
除了上述基本类型的变量,剩下的都是引用类型
引用类型最常用的就是String字符串: String s = "hello";
引用类型的变量类似于C语言的指针,它内部存储一个“地址”,指向某个对象在内存的位置
常量
定义变量的时候,如果加上final
修饰符,这个变量就变成了常量:
final double PI = 3.14; // PI是一个常量 double r = 5.0; double area = PI * r * r; PI = 300; // compile error!
常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。
常量的作用是用有意义的变量名来避免魔术数字(Magic number)
var关键字
编译器会根据赋值语句自动推断出变量sb的类型是StringBuilder。对编译器来说,语句: var sb = new StringBuilder(); 实际上会自动变成: StringBuilder sb = new StringBuilder(); 因此,使用var定义变量,仅仅是少写了变量类型而已。
变量的作用范围
在Java中,多行语句用{ }括起来。很多控制语句,例如条件判断和循环,都以{ }作为它们自身的范围,例如: if (...) { // if开始 ... while (...) { // while 开始 ... if (...) { // if开始 ... } // if结束 ... } // while结束 ... } // if结束
定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。
4、运算
整数运算
整数的数值表示不但是精确的,而且整数运算永远是精确的,即使是除法也是精确的,因为两个整数相除只能得到结果的整数部分: 特别注意:整数的除法对于除数为0时运行时将报错,但编译不会报错。 简写的运算符,即+=,-=,*=,/=,它们的使用方法如下: n += 100; // 3409, 相当于 n = n + 100; n -= 100; // 3309, 相当于 n = n - 100; 自增自减运算,++运算和--运算 位运算 位运算是按位进行与、或、非和异或的运算。 运算优先级 在Java的计算表达式中,运算优先级从高到低依次是: () ! ~ ++ -- * / % + - << >> >>> & | += -= *= /=
浮点运算
浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。
在计算机中,浮点数虽然表示的范围大,但是,浮点数有个非常重要的特点,就是浮点数常常无法精确表示
布尔运算
对于布尔类型boolean,永远只有true和false两个值。 布尔运算是一种关系运算,包括以下几类: 比较运算符:>,>=,<,<=,==,!= 与运算 && 或运算 || 非运算 !
关系运算
关系运算符的优先级从高到低依次是:
!
>,>=,<,<=
==,!=
&&
||
5、字符和字符串
在Java中,字符和字符串是两个不同的类型。 字符类型 字符类型char是基本数据类型,它是character的缩写。一个char保存一个Unicode字符: 一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。要显示一个字符的Unicode编码,只需将char类型直接赋值给int类型即可: 常见的转义字符包括: \" 表示字符" \' 表示字符' \\ 表示字符\ \n 表示换行符 \r 表示回车符 \t 表示Tab \u#### 表示一个Unicode编码的字符
字符串连接
Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理
如果用+
连接字符串和其他数据类型,会将其他数据类型先自动转型为字符串,再连接:
多行字符串
如果我们要表示多行字符串,使用+号连接会非常不方便: String s = "first line \n" + "second line \n" + "end"; 从Java 13开始,字符串可以用"""..."""表示多行字符串(Text Blocks)了。举个例子: // 多行字符串 public class Main { public static void main(String[] args) { String s = """ SELECT * FROM users WHERE id > 100 ORDER BY name DESC """; System.out.println(s); } } 上述多行字符串实际上是5行,在最后一个DESC后面还有一个\n。如果我们不想在字符串末尾加一个\n,就需要这么写: String s = """ SELECT * FROM users WHERE id > 100 ORDER BY name DESC"""; 还需要注意到,多行字符串前面共同的空格会被去掉,即: String s = """ ...........SELECT * FROM ........... users ...........WHERE id > 100 ...........ORDER BY name DESC ..........."""; 用.标注的空格都会被去掉。
6、数组类型
- 数组是同一数据类型的集合,数组一旦创建后,大小就不可变;
- 可以通过索引访问数组元素,但索引超出范围将报错;
- 数组元素可以是值类型(如int)或引用类型(如String),但数组本身是引用类型;
定义一个数组类型的变量,使用数组类型“类型[]”,例如,int[]。和单个基本类型变量不同,数组变量初始化必须使用new int[5]表示创建一个可容纳5个int元素的数组。
Java的数组有几个特点: 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false; 数组一旦创建后,大小就不可改变。 要访问数组中的某一个元素,需要使用索引。数组索引从0开始
7、流程控制
占位符
Java的格式化功能提供了多种占位符,可以把各种数据类型“格式化”成指定的字符串: 占位符 说明 %d 格式化输出整数 %x 格式化输出十六进制整数 %f 格式化输出浮点数 %e 格式化输出科学计数法表示的浮点数 %s 格式化字符串
if 判断
if语句的基本语法是: if (条件) { // 条件满足时执行 }
switch 多重选择
switch
语句根据switch (表达式)
计算的结果,跳转到匹配的case
结果,然后继续执行后续语句,直到遇到break
结束执行
使用switch语句时,只要保证有break,case的顺序不影响程序逻辑: switch (option) { case 3: ... break; case 2: ... break; case 1: ... break; }
while 循环
while条件循环。它的基本用法是: while (条件表达式) { 循环语句 } // 继续执行后续代码
do while循环
while循环是先判断循环条件,再执行循环。而另一种do while循环则是先执行循环,再判断条件,条件满足时继续循环,条件不满足时退出。它的用法是: do { 执行循环语句 } while (条件表达式);
do while
循环会至少循环一次
对1到100的求和用do while循环 public class Main { public static void main(String[] args) { int sum = 0; int n = 1; do { sum = sum + n; n ++; } while (n <= 100); System.out.println(sum); } }
for循环
除了while
和do while
循环,Java使用最广泛的是for
循环
for
循环的功能非常强大,它使用计数器实现循环。for
循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。计数器变量通常命名为i
for循环的用法是: for (初始条件; 循环检测条件; 循环后更新计数器) { // 执行语句 }
把1到100求和用for
循环
public class Main { public static void main(String[] args) { int sum = 0; for (int i=1; i<=100; i++) { sum = sum + i; } System.out.println(sum); } }
break和continue
break
语句可以跳出当前循环;break
语句通常配合if
,在满足条件时提前结束整个循环;break
语句总是跳出最近的一层循环;continue
语句可以提前结束本次循环;continue
语句通常配合if
,在满足条件时提前结束本次循环
8、数组操作
遍历数组
通过for
循环就可以遍历数组。因为数组的每个元素都可以通过索引来访问,因此,使用标准的for
循环可以完成一个数组的遍历
public class Main { public static void main(String[] args) { int[] ns = {1, 4, 9, 16, 25, 36}; for (int i=0; i<ns.length; i++) { int n = ns[i]; System.out.println(n); } } }
排序顺序
冒泡排序的特点是,每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。
常用的排序算法有冒泡排序、插入排序和快速排序等; 冒泡排序使用两层for循环实现排序; 交换两个变量的值需要借助一个临时变量。 可以直接使用Java标准库提供的Arrays.sort()进行排序; 对数组排序会直接修改数组本身。