Java入门
Java特性及优势
-
简单性
-
面向对象
-
可移植性
-
高性能
-
分布式(网络分布式环境,处理TCP/IP协议)
-
动态性(反射机制)
-
多线程
-
安全性(内存检查,捕获异常)
-
健壮性
Java安装与配置
下载
同意协议进行下载安装,建议把jdk与jre放在一起
安装目录修改为 D:\SoftWare\Java
环境配置
变量设置参数如下:
变量名: JAVA_HOME
变量值: D:\SoftWare\Java\jdk1.8.0_231
变量名: Path
变量值: %JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
变量名: CLASSPATH
变量值: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
保存后退出,在cmd窗口输入java -version 查看java版本信息
HelloWord编写
- 新建一个文件夹存放代码
- 新建java文件
- 文件后缀名为 .java
- 文件名为 Hello
- 编写代码
public class Hello{
public static void main(String[] args){
System.out.print("HelloWord!");
}
}
-
编译
打开cmd窗口 ,输入javac Hello.java,产生Hello.class文件
-
运行class文件 java Hello,打印出HelloWord!字样即是成功
Java基础语法
注释
-
单行注释
//
-
多行注释
/* */
-
文档注释
/** * */
标识符
关键字
Java所有组成部分都需要名字。类名、变量名以及方法名都被称为标识符
标识符命名规则
-
标识符由字母、数字、下划线“_”、美元符号“$”组成,第一个字符不能是数字。
-
标识符没有长度限制。
-
标识符对大小写敏感。
-
可以使用中文命名,但不推荐,也不推荐用拼音
数据类型
Java 是一种强制类型的语言,所有的变量都必须先明确定义其数据类型,然后才能使用。Java 中所有的变量、表达式和值都必须有自己的类型,没有“无类型”变量这样的概念。
Java的数据类型分为两大类
-
基本类型
-
引用类型
基本类型取值范围
类型转换
数据类型的转换是在所赋值的数值类型和被变量接收的数据类型不一致时发生的,它需要从一种数据类型转换成另一种数据类型。数据类型的转换可以分为隐式转换(自动类型转换)和显式转换(强制类型转换)两种。
-
自动转换
自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:
- 数值型数据的转换:byte→short→int→long→float→double。
- 字符型转换为整型:char→int。
-
强制转换
两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换,转换过程可能出现内存溢出或者精度问题
常量
常量是指在程序的整个运行过程中值保持不变的量。
定义常量
Java 语言使用 final 关键字来定义一个常量,其语法如下所示:
final dataType variableName = value
其中,final 是定义常量的关键字,dataType 指明常量的数据类型,variableName 是变量的名称,value 是初始值。
常量有三种类型:静态常量、成员常量和局部常量。
在定义常量时,需要注意如下内容:
- 在定义常量时就需要对该常量进行初始化。
- final 关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或者方法。
- 为了与变量区别,常量取名一般都用大写字符。
变量
声明变量
语法:
DataType identifier;
或者
DataType identifier=value;
上述语法代码中涉及 3 个内容:DataType、 identifier 和 value,其具体说明如下:
- DataType:变量类型,如 int、string、 char 和 double 等。
- identifier:标识符,也叫变量名称。
- value:声明变量时的值。
命名规范:
-
首字符必须是字母、下划线(―)、美元符号($)或者人民币符号(¥)。
-
标识符由数字(09)、大写字母(AZ)、小写字(a~z)、下划线(―)、美元符号($)、人民币符号(¥)以及所有在十六进制 0xc0 前的 ASCII 码组成。
-
不能把关键字、保留字作为标识符。
-
标识符的长度没有限制。
-
标识符区分大小写。
变量赋值
初始化变量有两种方式:
-
声明时直接赋值
int num = 10;
-
先声明、后赋值。
int num; num = 10;
作用域
根据作用域的不同,一般将变量分为两种类型
- 成员变量
- 局部变量
成员变量
Java 的成员变量有两种,分别是全局变量和静态变量(类变量)。定义在方法体和语句块之外,不属于任何一个方法,作用域是整个类。
局部变量
局部变量是指在方法或者方法代码块中定义的变量,其作用域是其所在的代码块。可分为以下三种:
- 方法参数变量(形参):在整个方法内有效。
- 方法局部变量(方法内定义): 从定义这个变量开始到方法结束这一段时间内有效。
- 代码块局部变量(代码块内定义):从定义这个变量开始到代码块结束这一段时间内有效。
局部变量在使用前必须被程序员主动初始化值。
运算符
最基本的运算符包括算术运算符、赋值运算符、逻辑运算符和关系运算符。运算符按照操作数的数量可以分为单目运算符、双目运算符和三目运算符。
算数运算符
Java 中的算术运算符主要用来组织数值类型数据的算术运算,按照参加运算的操作数的不同可以分为一元运算符和二元运算符。
一元运算符
-a 是对 a 取反运算,a++ 或 a-- 是在表达式运算完后,再给 a 加一或减一。而 ++a 或 --a 是先给 a 加一或减一,然后再进行表达式运算。
int a = 10;
int b = a++;
/*
运算过程
b = a
a = a+1
运算结果
b = 10
a = 11
*/
int c = ++a;
/*
运算过程
a = a + 1
b = a
运算结果
b = 12
a = 12
*/
int d = -a; // d = -10
二元运算符
算数赋值运算符
a += b //相当于 a = a + b
a -= b //相当于 a = a - b
a *= b //相当于 a = a * b
a /= b //相当于 a = a / b
a %= b //相当于 a = a % b
逻辑运算符
-
&& 与 & 区别:如果 a 为 false,则不计算 b
-
|| 与 | 区别:如果 a 为 true,则不计算 b
逻辑运算符的优先级为:
- !运算级别最高
- && 运算高于 || 运算
- !运算符的优先级高于算术运算符
- && 和 || 运算则低于关系运算符。结合方向是:逻辑非(单目运算符)具有右结合性,逻辑与和逻辑或(双目运算符)具有左结合性。
关系运算符
位运算符
位与运算符
运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为 1,那么计算结果才为 1,否则为 0。因此,任何数与 0 进行按位与运算,其结果都为 0。
int x = 5,y = 12;
int z = x&y; //z = 4
运算过程
位或运算符
运算规则是:参与运算的数字,低位对齐,高位不足的补零。如果对应的二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。
int x = 11,y = 7;
int z = x&y; //z = 15
运算过程
位异运算符
运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1。
int x = 11,y = 7;
int z = x^y; //z = 12
位反运算符
运算规则是:只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。
int x = ~10; // x = -11
编译执行以上程序,会发现输出的结果是 -11,而不是 65525。这是因为取反之后的结果是十六进制数,而在上面的程序中将输出转换为了十进制数。
二进制是 1111111111110101。这个二进制数的最高位为 1,表示这个数为负数。除最高位外,按位取反再加 1,即得到二进制原码 1000000000001011,用十进制数表示即为 -11。(负数 = 反码 + 1)
位移运算符
位移运算符用来将操作数向某个方向(向左或者右)移动指定的二进制位数。它们都属于双目运算符。
左移运算符
运算规则是:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
int i = 11<<1; //i = 22 相当于原来数的 2 倍。
右移运算符
运算规则是:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补零。
int i = 11>>1; //i = 5 相当于原数整除 2 。
条件运算符
Java提供了一个特别的三元运算符(也叫三目运算符)经常用于取代某个类型的 if-then-else 语句。使用条件运算符的一般语法结构为:
result = <expression> ? <statement1> : <statement3>;
其中,expression 是一个布尔表达式。当 expression 为真时,执行 statement1, 否则就执行 statement3。此三元运算符要求返回一个结果,因此要实现简单的二分支程序,即可使用该条件运算符。
int x,y,z;
x = 6,y = 2;
z = x>y ? x-y : x+y; //z = 4
运算符优先级
使用优先级为 1 的小括号可以改变其他运算符的优先级,即如果需要将具有较低优先级的运算符先运算,则可以使用小括号将该运算符和操作符括起来。
Java流程控制
Scanner类
语法:
Scanner s = new Scanner(System.in);
使用方法:
- next()方法
- 一定要读取到有效字符后从才可以结束输入。
- 对输入有效字符之前遇到的空白 ,next()方法会自动将其去掉
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- next()不能得到带有空格的字符串
public class Demo01_next {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("使用next方式接收");
if(s.hasNext()){
String str = s.next();
System.out.println(str);
}
s.close();
}
}
- nextLine()方法
- 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符
- 可以获得空白
public class Demo02_nextLine {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("使用nextLine方式接收");
if(s.hasNextLine()){
String str = s.nextLine();
System.out.println(str);
}
s.close();
}
}
java的流程控制结构有三种:顺序、选择、循环
顺序结构
程序从上向下进行逐步的运行其实就是一个顺序结构,中间没有任何的判断和跳转.
选择结构
-
if结构
if (条件表达式) { 语句块; }
-
if-else结构
if (表达式) { 语句块1; } else { 语句块2; }
-
多条件if-else if 语句
if(表达式1) { 语句块1; } else if(表达式2) { 语句块2; ... } else if(表达式n) { 语句块n; } else { 语句块n+1; }
嵌套if的使用
if(表达式1) { if(表达式2) { 语句块1; } else { 语句块2; } } else { if(表达式3) { 语句块3; } else if(表达式4) { 语句块4; } else { if(表达式n) { 语句块n; } else { 语句块n+1; } } }
-
switch结构
switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
switch(表达式) { case 值1: 语句块1; break; case 值2: 语句块2; break; … case 值n: 语句块n; break; default: 语句块n+1; break; }
public class Demo05_switch { public static void main(String[] args) { Scanner s = new Scanner(System.in); if (s.hasNext()){ char grade = s.next().charAt(0); switch (grade){ case 'A': System.out.println(grade +"---优秀"); break; case 'B': System.out.println(grade +"---好"); break; case 'C': System.out.println(grade +"---良"); break; default: System.out.println("未知等级"); break; } } s.close(); } }
循环结构
while循环
while 语句是 Java 最基本的循环语句,是一种先判断的循环结构,可以在一定条件下重复执行一段代码。该语句需要判断一个测试条件,如果该条件为真,则执行循环语句(循环语句可以是一条或多条),否则跳出循环。
while(条件表达式) {
语句块;
}
do-while循环
如果 while 循环一开始条件表达式就是假的,那么循环体就根本不被执行。然而,有时需要在开始时条件表达式即使是假的情况下,while 循环至少也要执行一次。
Java就提供了这样的循环:do-while循环。它与 while 语句略有不同。do-while 循环语句的特点是先执行循环体,然后判断循环条件是否成立。
do {
语句块;
}while(条件表达式);
while和do-while的比较
while 循环和 do-while 循环的相同处是:都是循环结构,使用 while(循环条件) 表示循环条件,使用大括号将循环操作括起来。
while 循环和 do-while 循环的不同处如下:
-
语法不同:与 while 循环相比,do-while 循环将 while 关键字和循环条件放在后面,而且前面多了 do 关键字,后面多了一个分号。
-
执行次序不同:while 循环先判断,再执行。do-while 循环先执行,再判断。
-
一开始循环条件就不满足的情况下,while 循环一次都不会执行,do-while 循环则不管什么情况下都至少执行一次。
for循环
for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假,那么它的循环语句根本不会执行。for 语句通常使用在知道循环次数的循环中。
for(条件表达式1;条件表达式2;条件表达式3) {
语句块;
}
九九乘法表
public class Demo06_for {
public static void main(String[] args) {
for(int i = 1;i<10;i++){
for (int j = 1;j < i+1;j++){
System.out.print(j + " * " + i + " = " + i*j + "\t");
}
System.out.println();
}
}
}
增强for循环
foreach 循环语句是 Java1.5 的新特征之一,在遍历数组、集合方面,foreach 为开发者提供了极大的方便。foreach 循环语句是 for 语句的特殊简化版本,主要用于执行遍历功能的循环。
for(类型 变量名:集合) {
语句块;
}
public class Demo07_foreach {
public static void main(String[] args) {
int[] nums = {10,20,30,40,50};
System.out.println("for循环输出");
for(int i = 0;i<nums.length;i++){
System.out.print(nums[i]+"\t");
}
System.out.println("\n"+"foreach循环输出");
for(int s:nums){
System.out.print(s+"\t");
}
}
}