JavaSE
一、Java简介
Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出。
后来 Sun 公司被 Oracle (甲骨文)公司收购,Java 也随之成为 Oracle 公司的产品。
Java分为三个体系:
- JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)
- JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版)
- JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)。
2005 年 6 月,JavaOne 大会召开,SUN 公司公开 Java SE 6。此时,Java 的各种版本已经更名,以取消其中的数字 "2":J2EE 更名为 Java EE,J2SE 更名为Java SE,J2ME 更名为 Java ME。
主要特性
-
Java 语言是简单的:
Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
-
Java 语言是面向对象的:
Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
-
Java语言是分布式的:
Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。
-
Java 语言是健壮的:
Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
-
Java语言是安全的:
Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
-
Java 语言是体系结构中立的:
Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
-
Java 语言是可移植的:
这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。
-
Java 语言是解释型的:
如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
-
Java 是高性能的:
与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。
-
Java 语言是多线程的:
在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。
-
Java 语言是动态的:
Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
发展历史
- 1995 年 5 月 23 日,Java 语言诞生
- 1996 年 1 月,第一个 JDK-JDK1.0 诞生
- 1996 年 4 月,10 个最主要的操作系统供应商申明将在其产品中嵌入 JAVA 技术
- 1996 年 9 月,约 8.3 万个网页应用了 JAVA 技术来制作
- 1997 年 2 月 18 日,JDK1.1 发布
- 1997 年 4 月 2 日,JavaOne 会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
- 1997 年 9 月,JavaDeveloperConnection 社区成员超过十万
- 1998 年 2 月,JDK1.1 被下载超过 2,000,000次
- 1998 年 12 月 8 日,JAVA2 企业平台 J2EE 发布
- 1999 年 6月,SUN 公司发布 Java 的三个版本:标准版(JavaSE, 以前是 J2SE)、企业版(JavaEE 以前是 J2EE)和微型版(JavaME,以前是 J2ME)
- 2000 年 5 月 8 日,JDK1.3 发布
- 2000 年 5 月 29 日,JDK1.4 发布
- 2001 年 6 月 5 日,NOKIA 宣布,到 2003 年将出售 1 亿部支持 Java 的手机
- 2001 年 9 月 24 日,J2EE1.3 发布
- 2002 年 2 月 26 日,J2SE1.4 发布,自此 Java 的计算能力有了大幅提升
- 2004 年 9 月 30 日 18:00PM,J2SE1.5 发布,成为 Java 语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5 更名为 Java SE 5.0
- 2005 年 6 月,JavaOne 大会召开,SUN 公司公开 Java SE 6。此时,Java 的各种版本已经更名,以取消其中的数字 "2":J2EE 更名为 Java EE,J2SE 更名为 Java SE,J2ME 更名为 Java ME
- 2006 年 12 月,SUN 公司发布 JRE6.0
- 2009 年 04 月 20 日,甲骨文 74 亿美元收购 Sun,取得 Java 的版权。
- 2010 年 11 月,由于甲骨文对于 Java 社区的不友善,因此 Apache 扬言将退出 JCP。
- 2011 年 7 月 28 日,甲骨文发布 Java7.0 的正式版。
- 2014 年 3 月 18 日,Oracle 公司发表 Java SE 8。
- 2017 年 9 月 21 日,Oracle 公司发表 Java SE 9
- 2018 年 3 月 21 日,Oracle 公司发表 Java SE 10
- 2018 年 9 月 25 日,Java SE 11 发布
- 2019 年 3 月 20 日,Java SE 12 发布
Java 开发工具
Java 语言尽量保证系统内存在 1G 以上,其他工具如下所示:
- Linux 系统、Mac OS 系统、Windows 95/98/2000/XP,WIN 7/8系统。
- Java JDK 7、8……
- vscode 编辑器或者其他编辑器。
- IDE:Eclipse、 IntelliJ IDEA、NetBeans 等。
安装好以上的工具后,我们就可以输出Java的第一个程序 "Hello World!"
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Java开发环境配置
请参考菜鸟教程开发环境配置
二、Java语言基础
一、标识符
1、什么是标识符
在java源程序当中凡是程序员有权利自己命名的单词都是标识符
2、标识符的命名规则
- 一个合法的标识符只能由数字、字母、下划线_、美元符号$组成,不能含有其他符号
- 不能以数字开头
- 严格区分大小写
- 关键字不能做标识符
- 理论上无长度限制,但最好不要太长
3、标识符的命名规范
最好见名知意,如下示例:
public class UserService{//UserService用户服务类
public void login(String username,String password){
}
}
/*
遵守驼峰命名方式:
UserService
SystemService
- 类名、接口名:首字母大写,后面每个单词首字母大写
- 变量名、方法名:首字母小写,后面每个单词首字母大写
- 常量名:全部大写
*/
public class UserService01{ //UserService01是一个类名,名字可以修改
//main是一个方法名
public static void main(String[] args){ //args是一个变量名
}
//doSome就是方法名
public static void doSome(){
int i = 10; //i就是变量名
}
}
4、合法和不合法的标识符
合法 不合法
----------------------
_123Test 123Test
class1 class
ABC$ HelloWorld!
二、关键字
请参考菜鸟教程关键字
三、关于字面值
/*
字面值:字面值就是数据
10、100
3.14
"abc"
'a'
true、false
字面值是java源程序的组成部分之一。包括标识符和关键字它们都是java源程序的组成部分
数据在现实世界当中是分门别类的,所以数据在计算机编程语言当中也是有类型的【数据类型】
10、100 属于整数型字面值
3.14 属于浮点型字面值
"abc" 属于字符串型字面值
'a' 属于字符型字面值
true、false 属于布尔型字面值
注意:
java语言当中所有的字符串型字面值必须使用双引号括起来
java语言当中所有的字符型字面值必须使用单引号括起来
*/
public class Test01{
public static void main(String[] args) {
System.out.println(10);
System.out.println("abc");
System.out.println("你怎么样?");
System.out.println(false);
System.out.println(true);
System.out.println('A');
System.out.println(3.14);
System.out.println("3.14");
//System.out.println('ABC');编译报错,因为单引号只能存放单个字符,属于字符型字面值
}
}
四、变量
/*
1.什么是变量?
变量本质上来说是内存中的一块空间,这块空间有数据类型、有名字、有字面值
变量包含三部分:数据类型、名称、字面值【数据】
变量内存中存储数据的最基本的单元
2.Java 中主要有如下几种类型的变量
局部变量
类变量(静态变量)
成员变量(非静态变量)
3.数据类型的作用?
不同的数据有不同的类型,不同的数据类型底层会分配不同大小的空间
数据类型是指导程序在运行阶段应该分配多大的内存空间
4.变量要求:变量中存储的具体的数据必须和变量的数据类型一致,当不一致时会编译报错
5.声明/定义变量的语法格式:
数据类型 变量名;
例如:
int i;
6.变量声明之后怎么赋值?
语法格式:
变量名 = 字面值;
要求:字面值的数据类型必须和变量的数据类型一致
= 等号是一个运算符,叫做赋值运算符,赋值运算符先运算等号右边的表达式,表达式执行结束之后的结果赋值给左边的变量
7.声明和赋值可以放到一起完成
int i = 10;
8.变量赋值之后,可以重新赋值,变量的值可以变化
int i = 10;
System.out.println(i);//10
i = 20;
System.out.println(i);//20
i = 100;
System.out.println(i);//100
9.有了变量的概念之后,内存空间得到了重复的使用
int i = 10;
System.out.println(i);
...
....
System.out.println(i);
10.通常访问一个变量包括两种访问形式:
第一种:读取变量中保存的具体数据 get/获取
第二种:修改变量中保存的具体数据 set/设置
i = 20; //set
System.out.println(i); //get
11.变量可以在一行上声明多个
int a,b,c,d;
12.java中的变量必须先声明,再赋值,才能访问
int i; 程序执行到这里,内存空间并没有开辟出来,变量i并没有初始化所以没有赋值之前是无法访问的
*/
//例1
public class Test01{
public static void main(String[] args) {
//声明一个int类型的变量,起名为i
int i;
//System.out.println(i);
//编译报错:变量i并没有初始化
i = 100;//给i变量赋值,i变量在这里完成初始化,内存开辟
System.out.println(i);
//i再次重新赋值
i = 1000;
System.out.println(i);
//一行上可以同时声明多个变量
int a,b,c = 300; //a和b尚未初始化,c赋值300
System.out.println(a);//编译错误
System.out.println(b);//编译错误
System.out.println(c);//300
a = 0;
b = 1;
System.out.println(a);//0
System.out.println(b);//1
}
}
//例2
//关于java中的变量:
//1.在方法体当中的java代码,是遵循自上而下的顺序依次执行的。逐行执行
//2.在同一个作用域当中,变量名不能重名,但是变量可以重新赋值
public class Test02{
public static void main(String[] args) {
int i = 100;
System.out.println(i);//100
i = 200;
System.out.println(i);//200
//以下代码顺序有错误,先声明后赋值再访问
/*
System.out.println(k);
int k = 200;
*/
/*
int i = 90;
System.out.println(i);
*/
}
}
//例3
/*关于java中的变量:
变量的作用域
1.什么是作用域
变量的作用域其实描述的就是变量的有效范围
3.变量的作用域只要记住一句话
出了大括号就不认识了
*/
public class Test03{
static int k = 40;//注意:这里的static不要去掉
public static void main(String[] args) {
//变量i的作用域是main方法,在整个main方法当中是有效的,可见的,可以访问的
int i = 100;
System.out.println(i);//可以
System.out.println(k);//可以
//以下会编写一个for循环语句,在for循环中讲解
for(int a=0;a<10;a++){ //a变量的作用域是整个for循环,for循环结束之后,a变量的内存就释放了
}
//System.out.println(a); //这里无法访问a变量
int j; //作用域是main方法
for(j=0;j<10;j++){
}
System.out.println(j); //访问的是main方法中的j变量
}
public static void doSome() {
//这里无法访问main方法当中的变量i,已经出了i变量的作用域
//System.out.println(i);
System.out.println(k);//可以
}
}
//例4
/*关于java中的变量:
变量的分类:根据变量声明的位置来分类:
局部变量:在方法体当中声明的变量叫做局部变量
成员变量:在方法体外【类体之内】声明的变量叫做成员变量
在不同的作用域当中,变量名可以重名,同作用域当中不能
*/
public class Test04{
//成员变量
int k = 200;
//主方法:入口
public static void main(String[] args) {
//i变量就是局部变量
int i = 3;
System.out.println(i); //java遵循 就近 原则
}
//成员变量
int i = 100; //声明变量
//System.out.println(i); //类体中不能直接编写java语句【除声明变量之外】
//doSome方法
public static void doSome() {
//局部变量
int i = 90;
}
}
五、数据类型
/*
关于java中的数据类型
1.数据类型的作用是什么
程序当中有很多数据,每一个数据都是有相关类型的,不同数据类型的数据占用空间大小不同。
数据类型的作用是指导JVM在运行程序的时候给该数据分配多大的内存空间。
2.java中的数据类型包括两种:
基本数据类型
引用数据类型
3.关于基本数据类型:
第一类:整数型
byte,short,int,long
第二类:浮点型
float,double
第三类:布尔型
boolean
第四类:字符型
char
4.字符串“abc”不属于基本数据类型,属于 引用数据类型,字符属于基本数据类型
5.八种基本数据类型各自占用空间大小是多少
基本数据类型 占用空间大小【单位:字节】 取值范围 默认值
------------------------------------------------------------------------------
byte 1 -128 ~ 127 0
short 2 -32768 ~ 32767 0
int 4 0
long 8 0
float 4 0.0
double 8 0.0
boolean 1 true/false false
char 2 0 ~ 65535 \u0000
6.计算机在任何情况下都只能识别二进制。例如:101010
【现代的计算机底层采用交流电的方式,接通和断开,只识别0或1】
7.什么是二进制
数据的一种表示形式。十进制表示满十进一原则。二进制表示满二进一原则
8.字节【byte】
1 Byte = 8 bit 【1个字节 = 8个比特位】1个比特位表示一个二进制位:0/1
1 KB = 1024 Byte
1 MB = 1024 KB
.....
9.整数型当中的byte类型,占用1个字节,所以byte类型的数据占用8个比特位。那么byte类型的取值范围是什么?
关于java中的数字类型,数字都有正负之分的,所以在数字的二进制当中有一个二进制位被称为“符号位”。并且
这个“符号位”在所有二进制位的最左边,0表示整数,1表示负数
byte类型最大值:01111111
2的7次方-1,结果是:127
byte类型最小值:-128
byte类型取值范围:[-128 ~ 127]
byte类型可以表示256个不同的数字【256个不同的二进制】
10.二进制和十进制之间的转换规则:
二进制转换十进制
十进制转换二进制
*/
/*
数据类型之:char类型
*/
public class Test01{
public static void main(String[] args){
char c = 'a';
System.out.println(c);
char x = '国';
System.out.println(x);
}
}
/*
数据类型之char类型:转义字符 \
转义字符出现在特殊字符之前,会将特殊字符转换成普通字符
\n 换行符
\t 制表符
\' 普通的单引号
\\ 普通的反斜杠
\" 普通的双引号
*/
public class Test02{
public static void main(String[] args){
//普通的a字符
char c = 'a';
System.out.println(c);
//换行符,属于char类型的数据
char x = '\n';
//制表符tab,制表符和空格不同,他们的ASCII码不同
char y = '\t';
//例题:要求在控制台上输出反斜杠字符
char k = '\\';
System.out.println(k);
//例题:要求在控制台上输出单引号字符
char z = '\'';
System.out.println(z);
}
}
/*
数据类型之整数型
java语言当中的整数型字面值被默认为int类型处理。要让这个整数型字面值被当作long类型来处理的话,
需要在整数型字面值后面添加L
java语言当中的整数型字面值有三种表示方式
十进制【是一种缺省默认的方式】
八进制【在编写八进制整数型字面值的时候需要以0开始】
十六进制【在编写十六进制整数型字面值的时候需要以0x开始】
*/
public class Test03{
public static void main(String[] args){
int a = 10;
int b = 010;
int c = 0x10;
System.out.println(a);//10
System.out.println(b);//8
System.out.println(c);//16
}
}
public class Test04{
public static void main(String[] args){
long x = 100L; //100L是long类型字面值,x是long类型变量,不存在类型转换,直接赋值
//int y = x; //x变量是long类型,8个字节,y变量是int类型,4个字节,所以会出现编译错误,因为大容量不能直接赋值给小容量
/*
大容量转换成小容量,需要进行强制类型转换
强制类型转换需要加强制类型转换符
加上强制类型转换符之后编译通过了,但是运行阶段可能损失精度
所以强制类型转换谨慎使用,因为损失精度之后可能损失很严重
强转原理:
原始数据:00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
强转之后的数据:00000000 00000000 00000000 01100100
将左边的二进制砍掉【所有的数据强转的时候都是这样完成的】
*/
int y = (int)x;
System.out.println(y);
//在java语言当中,当一个整数型字面值没有超出byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量
byte b = 50;//true
byte c = 127;//true
byte d = 128;//false
}
}
/*
关于浮点型数据类型:
float 单精度【4个字节】
double 双精度【8个字节,精度较高】
在java语言当中,所有的浮点型字面值默认被当作double类型来处理,
要想该字面值当作float类型来处理,需要在字面值后面添加F/f
*/
public class Test01{
public static void main(String[] args){
//float f = (float)5.1;
float f = 5.1f;
}
}
/*
关于布尔型数据类型:boolean【占1个字节】
在java语言当中boolean类型只有两个值:true、false
*/
public class Test01{
public static void main(String[] args){
boolean login = true;
if(login){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
}
/*
关于基本数据之间的互相转换:转换规则
1.八种基本数据类型当中除布尔类型之外剩下的7种类型之间都可以互相转换
2.小容量向大容量转换,称为自动类型转换,容量从小到大排序:
byte < short < int < long < float < double
char <
注:任何浮点类型不管占用多少个字符,都比整数型容量大
char和short可表示的种类数量相同,但是char可以取更大的正整数
3.大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用
4.当整数字面值没有超出byte,short,char的取值范围,可以直接赋值给byte,short,char类型的变量
5.byte,short,char混合运算的时候,各自先转换成int类型再做运算
6.多种数据类型混合运算,先转换成容量最大的那种类型再做运算
*/
六、运算符
运算符可以分为以下几种:
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
/*
算术运算符
+ 求和
- 相减
* 乘积
/ 商
% 求余数【取模】
++ 自加1
-- 自减1
*/
public class Test01{
public static void main(String[] args){
int i = 10;
int j = 3;
System.out.println(i+j);//13
System.out.println(i-j);//7
System.out.println(i*j);//30
System.out.println(i/j);//3
System.out.println(i%j);//1
int k = 10;
k++;
System.out.println(k);//11
int y = 10;
++y;
System.out.println(y);//11
//小结:++运算符可以出现在变量前,也可以出现在变量后,无论是变量前还是变量后,只要++运算结束,该变量中的一定会自加1
//++ 出现在变量后
//规则:先做赋值运算,再对变量中保存的值进行自加1
int a = 100;
int b = a ++;
System.out.println(a);//101
System.out.println(b);//100
//++出现在变量前
//规则:先进行自加1运算,再进行赋值操作
int m = 20;
int n = ++m;
System.out.println(m);//21
System.out.println(n);//21
int e = 100;
System.out.println(e++);//100
System.out.println(e);//101
int s = 100;
System.out.println(++s);//101
System.out.println(s);//101
}
}
/*
关系运算符:
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
= 是赋值运算符,==是关系运算符
关系运算符的运算结果一定是布尔类型:true/false
关系运算符的运算原理:
int a = 10;
int b = 10;
a > b 比较的时候,比较的是a中保存的10这个值和b中保存的10这个值之间的大小比较
*/
public class Test01{
public static void main(String[] args){
int a = 10;
int b = 10;
System.out.println(a>b);//false
System.out.println(a>=b);//true
System.out.println(a<b);//false
System.out.println(a<=b);//true
System.out.println(a==b);//true
System.out.println(a!=b);//false
}
}
/*
逻辑运算符
& 逻辑与 (两边都是true,结果才是true)
| 逻辑或 (两边只要有一个是true,结果就是true)
! 逻辑非 (取反,!false就是true,!true就是false,是一个单目运算符)
^ 逻辑异或(两边只要不一样,结果就是true)
&& 短路与 第一个表达式执行结果是false,会发生短路与。
|| 短路或 第一个表达式执行结果是true,会发生短路或。
1.逻辑运算符要求两边的算子都是布尔类型,并且逻辑运算符最终的运算结果也是一个布尔类型
2.短路与和逻辑与最终的运算结果是相同的,只不过短路与存在短路现象
3.短路或和逻辑或最终的运算结果是相同的,只不过短路或存在短路现象
4.什么情况下发生短路现象呢???
5.什么时候选择使用逻辑与运算符?什么时候选择使用短路与运算符?
*/
public class Test
{
public static void main(String[] args){
System.out.println(true & true); //true
System.out.println(true & false); //false
System.out.println(true | false); //true
System.out.println(false & false); //false
System.out.println(!true); //false
System.out.println(true ^ false); //true
System.out.println(false ^ false); //false
System.out.println(true ^ true); //false
//逻辑与和短路与
int x = 10;
int y = 8;
//逻辑与
System.out.println(x < y & ++x < y);
System.out.println(x);//11
//短路与
//a<s结果是false,整个表达式结果已经确定是false,所有后面的表达式不再执行,这种现象被称为短路现象
//短路与才会有短路现象,逻辑与是不会存在短路现象的。短路与在开发中常用
int a = 10;
int s = 8;
System.out.println(a < s && ++a < s);
System.out.println(a);//10
}
}
/*
赋值运算符:
基本的赋值运算符
=
扩展的赋值运算符
+=
-=
*=
/=
%=
优先级:先执行等号右边的表达式,将执行结果赋值给左边的变量
注意:
byte i = 10;
i += 5; 等同于i = (byte)(i + 5);
int k = 10;
k += 5; 等同于k = (int)(k + 5);
long x = 10L;
int y = 20;
y += x; 等同于y = (int)(y + x);
结论:扩展类的赋值运算符不改变运算结果类型,假设最初这个变量的类型是byte类型,
无论怎么进行追加或追减,最终该变量的数据类型还是byte类型
字符串连接运算符
1.java中的"+"运算符:有两个作用,一是求和,二是字符串的连接运算
2.当"+"运算符两边的数据都是数字的话,一定是进行加法运算
3.当"+"运算符两边的数据只要有一个数据是字符串,一定会进行字符串连接运算,并且连接运算之后的结果还是一个字符串类型
数字 + 数字 ---> 数字【求和】
数字 + "字符串" ---> "字符串"【字符串连接】
4.在一个表达式当中可以出现多个"+",在没有添加小括号的前提下,遵循自左向右的顺序依次运算
三目运算符
语法:布尔表达式 ? 表达式1 : 表达式2
*/
public class Test
{
public static void main(String[] args){
//基本的赋值运算符
int i = 10;
System.out.println(i);//10
i = i + 5;
System.out.println(i);//15
//扩展的赋值运算符
i += 5; //等同于i = i + 5【其实不等】
System.out.println(i);//20
//-------------------------------------
//字符串连接运算符
String userName = "A";
System.out.println("欢迎你" + userName + "回来");
//-------------------------------------
//三目运算符
String s = sex ? "男" : "女";
System.out.println(s);
}
}
七、条件语句
/*
if语句:
1.语法结构:四种编写方式
一:if(布尔表达式){
java语句;
....
}
二:if(布尔表达式){
java语句;
....
}else{
java语句;
....
}
三:if(布尔表达式){
java语句;
....
}else if(布尔表达式){
java语句;
....
}
...
四:if(布尔表达式){
java语句;
....
}else if(布尔表达式){
java语句;
....
}else(布尔表达式){
java语句;
....
}
2.重点:对于java中的if语句来说,只要一个分支执行,整个if语句全部结束
3.注意:以上的第二,第四种编写方式都带有else分支,这两种方式都可以100%保证会有分支执行
4.所有控制语句都是可以嵌套使用的,只要合理嵌套就行
5.if语句的分支中只有一条java语句的话,大括号可以省略不写【不推荐】
*/
public class Test
{
public static void main(String[] args){
//需求:所在位置的5公里范围之内有肯德基的话,去kfc吃午饭
double distance = 1.0;
if(distance < 5){
System.out.println("去kfc吃饭");
}
/*需求:
假设系统给定一个考生的成绩,成绩可能带有小数点,根据学生的成绩判断该学生的成绩等级:
[90-100] A
[80-90] B
[70-80] C
[60-70] D
[0-60] E
用if语句应该怎么写???
*/
double score = 90;
String grade = "成绩等级为E";
if (score < 0 || score > 100){
grade = "输入的成绩不合法";
}else if (score >= 90){
grade = "输入的成绩等级为A";
}else if(score >= 80){
grade = "输入的成绩等级为B";
}else if(score >= 70){
grade = "输入的成绩等级为C";
}else if(score >= 60){
grade = "输入的成绩等级为D";
}
System.out.println(grade);
//---------------------------
//接收用户键盘输入
//第一步:创建键盘扫描器对象
java.util.Scanner s = new java.util.Scanner(System.in);
//第二步:调用Scanner对象的next()方法开始接收用户键盘输入
String userInputContent = s.next();//接受文本【以字符串的形式接收】
//int num = s.nextInt(); 接受数字【以整数型int的方式接收】
System.out.println("你输入了:"+userInputContent);
//System.out.println("你输入的数字是:"+num);
//对上面的例子进行修改,使用键盘输入------------------
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入成绩:");
int score = s.nextInt();
String grade = "E等级";
if(score < 0 || score > 100){
grade = "你输入的成绩不合法";
}else if (score >= 90){
grade = "输入的成绩等级为A";
}else if(score >= 80){
grade = "输入的成绩等级为B";
}else if(score >= 70){
grade = "输入的成绩等级为C";
}else if(score >= 60){
grade = "输入的成绩等级为D";
}
System.out.println(grade);
}
}
/*
switch语句
语法:
switch(int或){
case int或String类型的字面值或变量:
java语句;
...
case int或String类型的字面值或变量:
java语句;
...
...
default :
java语句;
...
}
执行原理:
switch后面的小括号当中的数据和case后面的数据进行一一匹配,匹配成功的分支执行,按照自上而下的顺序依次匹配
匹配成功的分支执行,分支当中最后有break语句的话,整个switch语句终止
匹配成功的分支执行,分支中没有break语句的话,直接进入下一个分支执行,这种现象被称为case穿透现象
所有分支都没有匹配成功,当有default的语句,会执行default分支当中的程序
case可以合并:
int i = 10;
switch(i){
case 1: case 2: case 3: case 10:
System.out.println("Test");
}
*/
public class Test
{
public static void main(String[] args){
//需求:接收用户的输入:1表示星期一,2表示星期二
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.print("请输入数字:");
int num = s.nextInt();
switch(num){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期七");
break;
default :
System.out.println("输入错误");
}
//case穿透把break去掉就行
/*
需求:
使用switch判断考生成绩等级
1、有效成绩范围[0-100]
2、考生成绩可能带有小数
90-100 A
80-90 B
70-80 C
60-70 D
0-60 E
*/
double score = 95.5;
//转换成int
int grade = (int)(score / 10);
switch(grade) {
case 9 : case 10 :
System.out.println("A");
break;
case 8 :
System.out.println("B");
break;
case 7 :
System.out.println("C");
break;
case 6 :
System.out.println("D");
break;
default :
System.out.println("E");
}
}
}
八、循环结构
/*
for循环
语法结构:
for(初始化表达式 ; 布尔表达式 ; 更新表达式){
//需要重复执行的代码片段
}
执行原理:
1、初始化表达式 ,布尔表达式,更新表达式都不是必须的【分号必须】
2、初始化表达式最先执行,并且在整个for循环当中只执行一次
3、布尔表达式必须是true/false,不能是其他值
*/
public class Test
{
public static void main(String[] args){
//找出1-100的所有奇数
//第一种方案
for(int i = 1; i < 100; i += 2){
System.out.println("奇数-->"+i);
}
//第二种方案
for(int i = 1; i < 100; i ++){
if(i % 2 != 0){
System.out.println(i);
}
}
//----------------------------
//计算1-100奇数的和
int sum = 0;
for(int i = 1; i < 100; i += 2){
sum += i;
}
System.out.println("sum="+sum);
//-----------------------------
//使用for循环输出九九乘法表
for(int i = 1; i <= 9; i ++){//外层循环九次
for(int j = 1; j <= i; j ++){
System.out.print(i + "*" + j + "=" + i * j + " ");
}
System.out.println();//换行
}
//编写for循环找出1-100中所有的素数(能被1和它本身整除)
for(int i = 2; i <= 100; i++){
boolean isSuShu = true;//默认将i看作是一个素数【标记在开发中经常用】
for(int j = 2; j < i; j++){
if(i % j == 0){
isSuShu = false;
break;
}
}
if(isSuShu){//是素数
System.out.println(i);
}
}
//编写for循环找出1-100中所有的素数,要求每8个换一行输出
int count = 0;
for(int i = 2; i <= 100; i++){
boolean isSuShu = true;
for(int j = 2; j < i; j++){
if(i % j == 0){
isSuShu = false;
break;
}
}
if(isSuShu){
System.out.println(i + " ");
count++;
if(count % 8 == 0){
System.out.println();
}
//可以改为
/*if(count == 8){
System.out.println();
count = 0;//归0
}*/
}
}
}
}
/*
while循环:
1、语法结构:
while(布尔表达式){
循环体;
}
2、循环次数:0-n次
*/
public class Test
{
public static void main(String[] args){
int i = 10;
while(i > 0){
System.out.println(i--);//10 9 8 7 6 5 4 3 2 1
System.out.println("--->"+i);//9 8 7 6 5 4 3 2 1 0
}
System.out.println("--->"+i);//0
//-------------------------------------------
int j = 10;
while(j >= 0){
System.out.println(--j);//9 8 7 6 5 4 3 2 1 0 -1
}
System.out.println("--->"+j);//-1
}
}
/*
do..while循环
语法结构:
do{
循环体;
}while(布尔表达式);
循环次数:1-n
*/
public class Test
{
public static void main(String[] args){
int i = 10;
do{
System.out.println(i);//1 2 3 4 5 6 7 8 9 10
i++;
}while(i <= 10);
}
}
/*
break语句:
1、break是java语言当中的关键字,被翻译为中断
2、break + ; 可以成为一个单独完整的java语句:break;
3、break语句使用在switch语句中,用来终止switch的语句执行
4、break语句使用在循环中,用来终止循环的执行。for,while,do...while
5、默认终止的循环是最近的语句
*/
public class Test
{
public static void main(String[] args){
for(int i = 0; i < 10; i++){
if(i == 5){
break;//终止当前的for循环
}
System.out.println("--->");//0 1 2 3 4
}
}
}
/*
continue语句:
1、continue表示继续,下一个的意思
2、continue也是一个关键字,主要出现在循环语句中。continue;
3、break和continue的区别
break表示循环不再执行,跳出循环,终止循环
continue表示终止当前循环,直接进入下一次循环继续执行
*/
public class Test
{
public static void main(String[] args){
for(int i = 0; i < 10; i++){
if(i == 5){
continue;//停止本次循环,直接进入下一次循环继续执行
}
System.out.println("i="+i);//0 1 2 3 4 6 7 8 9
}
}
}
九、方法
1.什么是方法?
Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
2.方法的优点有哪些?
- 使程序变得更简短而清晰。
- 有利于程序维护。
- 可以提高程序开发的效率。
- 提高了代码的重用性。
3.方法的结构
/*
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
*/
//如:
public static int age(int birthday){...}
//示例:下面的方法包含 2 个参数 num1 和 num2,它返回这两个参数的最大值。
public static int max(int num1, int num2) {
int result;
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result;
}
//简略写法如下------------------运用了三元运算符
public static int max(int num1, int num2) {
return num1 > num2 ? num1 : num2;
}
4.方法的调用
Java 支持两种调用方法的方式,根据方法是否返回值来选择。
//示例:
public class TestMax {
// 主方法
public static void main(String[] args) {
int i = 5;
int j = 2;
int k = max(i, j);//调用了max方法
System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);
}
// 返回两个整数变量较大的值
public static int max(int num1, int num2) {
int result;
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result;
}
}
5.void关键字
首先void是空的意思,它表示在方法声明的时候表示该方法没有返回值(但是可以用 return; 来退出该方法)
//示例:
public class Test{
public static void main(String[] args){
int i = 5;
int j = 2;
int k = max(i, j);//调用了max方法
sum(1,3);////调用了sum方法
System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);
}
public static void sum(int a, int b){
System.out.println(a + "+" + b + "=" + (a + b));//也可以写成return;结束该方法没有返回值
}
public static int max(int num1, int num2){
int result;
if (num1 > num2){
result = num1;
}else{
result = num2;
}
return result; //结束方法,有返回值
}
}
6.方法重载【overload】
/*
1、生么时候用方法重载?
功能相似时用方法重载
2、满足方法重载的条件:
-在同一个类中
-方法名相同
-参数列表不同:
数量不同
顺序不同
类型不同
*/
//例
public class Test
{
public static void main(String[] args){
m1();
m1(10);
m2(2,3.0);
m2(3.0,2);
m3(2);
m3(2.0);
}
//数量不同
public static void m1(){
}
public static void m1(int a){
}
//顺序不同
public static void m2(int a,double b){
}
public static void m2(double a,int b){
}
//类型不同
public static void m3(int x){
}
public static void m3(double x){
}
}
/*
方法递归
1、什么是递归:方法自身调用自身
a(){
a();
}
2、递归是很耗费内存的,不需要时尽量不用
3、递归必须有结束条件,否则会发生栈内存溢出错误
*/
//例
public class Test
{
public static void main(String[] args){
System.out.println("main begin");
doSome();
System.out.println("main over");
}
public static void doSome(){
System.out.println("doSome begin");
doSome();
System.out.println("doSome over");
}
}
//不使用递归计算1-N的和[可以不使用递归就不用]
public class Test01
{
public static void main(String[] args){
/*普通方法
int n = 4;
int sum = 0;
for(int i = 0; i <= 4; i++){
sum += i;
}
System.out.println("sum="+sum);
*/
int n = 4;
int retValue = sum(n);
System.out.println(retValue);
}
//单独定义一个方法,这是一个独立的功能,可以完成1-N的求和
public static int sum(int n){
int result = 0;
for(int i = 0; i <= n; i++){
result += i;
}
return result;
}
}
//使用递归计算1-N的和
public class Test02
{
public static void main(String[] args){
//1-4的和
int n = 4;
int retValue = sum(n);
System.out.println(retValue);
}
public static int sum(int n){
if(n == 1){
return 1;
}
return n + sum(n - 1);
}
}
//不使用递归计算N的阶乘
public class Test03
{
public static void main(String[] args){
//5的阶乘
int n = 5;
int retValue = method(n);
System.out.println(retValue);
}
public static int method(int n){
int result = 1;
for(int i = n; i > 0; i--){
result *= i;
}
return result;
}
}
//使用递归计算N的阶乘
public class Test04
{
public static void main(String[] args){
//5的阶乘
int n = 5;
int retValue = method(n);
System.out.println(retValue);
}
public static int method(int n){
if(n == 1){
return 1;
}
return n * method(n - 1);
}
}

浙公网安备 33010602011771号