Java SE
1. Scanner类型
包路径:java.util.Scanner
通过Sanner对象实现接收用户键入
//需要将Scanner类导入
import java.util.Scanner;
public class Test {
public static void main(String[] args){
//创建Scanner的对象s
Sanner s = new Scanner(System.in);
//接收int类型
int i = s.nextInt();
//接收String类型
String s = s.next();
}
}
2. package
1. 尽量使用小写字母,尽量不要出现数字、_、$(规范)
2. 一般以公司域名倒序命名,例如:com.jsoft.模块.架构.功能.xxx
3. 流程控制
之前在学习js过程中学习过流程控制,这里不再对基本结构进行阐述
选择结构
if选择结构
-
if()
-
if()…else
-
if()…else if()…
-
if() else if()…else
1. 对于2,4这两个选择结构,肯定会有分支会被执行到。 2. 对于1,3这两个选择结构,则无法肯定会不会有分支执行到。 3. 对于"()"中的表达式,要求运算结果是布尔值
switch选择结构
switch结构
public static void main(String[] args){
int i1 = 10;
// i1在此处可被称为受测变量
switch(i1) {
case 5:
System.out.print(i1 + "和5匹配");
break;
case 10:
System.out.print(i1 + "和10匹配");
break;
default:
System.out.print(i1 + "和5、10不匹配");
break;
}
}
switch重点
1. break的穿透性
对于switch匹配到的分支,如果没写break,程序会继续往下一个分支执行
2. switch支持的数据类型
* int类型 (byte、short、char)
* String类型
* 枚举类型
在java5之后,switch支持枚举类型,以及根据拆箱机制可以使用包装类(Integer/Byte/Short/Character)
在java7之后,switch支持String类型
3. case合并
public static void main(String[] args){
int i = 10;
switch(i1) {
case 10: case 20: case 30:
System.out.println("i的值是10,20,30中的一个");
break;
default:
System.out.println("i的值是其他值");
}
}
4. switch中case的作用域
我们先来看一下下面的代码
public static void main(String[] args){
int i1 = 10;
switch(i1) {
case 5:
//在此分支声明一个变量var
int var = 10;
break;
case 10:
//在此分支声明一个变量var
int var = 10;
break;
default:
//在此分支声明一个变量var
int var = 10;
break;
}
}
结果如下图
编译无法通过,存在语法问题。提示错误:已在方法main(String[])中定义了变量var;
此处可以是否可以说明case分支的作用域不是闭合的?那么我们 在case中加入“{}” 试试
public static void main(String[] args){
int i1 = 10;
switch(i1) {
case 5: {
//在此分支声明一个变量var
int var = 10;
break;
}
case 10: {
//在此分支声明一个变量var
int var = 10;
break;
}
default: {
//在此分支声明一个变量var
int var = 10;
break;
}
}
}
结果如下图所示
此处编译通过了,由此案例可以看出case分支的作用域是整个switch,如果想要让case分支的作用域闭合,可以使用“{}”
循环结构
for循环
for循环案例
通过for循环打印矩形
public static void main(String[] args){
for(int i=0; i < 5; i++) {
for (int j=0 ;j < 5 ; j++) {
System.out.print("*");
}
System.out.println();
}
}
foreach(增强for)
可以把数组中的元素通过镜像给变量(元素)接收,我们操作的不是原始数据,我们操作的是镜像数据,foreach的操作更加安全,不影响原始数据。foreach是Java5新特性
while循环结构
课堂案例
模拟计算器功能
iimport java.util.Scanner;
public class Test6 {
/*
请输入第一个数:1
请输入第二个数:2
请输入第运算符号:*
计算结果为:1*2=2
是否继续计算:1、是 2、否
*/
public static void main(String[] args){
Scanner s = new Scanner(System.in);
int flag = 1;
while(flag == 1) {
System.out.print("请输入第一个数:");
int first = s.nextInt();
System.out.print("请输入第二个数:");
int second = s.nextInt();
System.out.print("请输入运算符号(+,-,*,/):");
String opera = s.next();
switch(opera) {
case "+":
System.out.println("计算结果为:"+ first +"+"+ second +"="+ (first+second));
break;
case "-":
System.out.println("计算结果为:"+ first +"-"+ second +"="+ (first-second));
break;
case "*":
System.out.println("计算结果为:"+ first +"*"+ second +"="+ (first*second));
break;
case "/":
while(second == 0) {
System.out.print("除数不能为0,请重新输入第二个数字:");
second = s.nextInt();
}
System.out.println("计算结果为:"+ first +"/"+ second +"="+ (first/second));
break;
default:
System.out.println("不存在该运算符");
break;
}
System.out.print("是否继续计算:1、是 2、否:");
flag=s.nextInt();
while(flag != 1 && flag !=2) {
System.out.print("输入错误请重新输入");
flag=s.nextInt();
}
System.out.print(flag == 2 ? "计算器已经终止,谢谢您的使用\n" : "");
}
}
}
运行结果如下
猜大小
import java.util.Scanner;
public class Test7 {
/*
请输入一个数字:20
数字保存成功,请踩踩数字是几
比较大小,如果打了,就提示大了
如果小了,就提示小了
直到猜到这个为止
*/
public static void main(String[] args){
Scanner s = new Scanner(System.in);
System.out.print("请输入一个数字:");
int num = s.nextInt();
System.out.print("数字保存成功,请猜猜数字是几:");
int temp = s.nextInt();
while (true){
if(temp > num) {
System.out.print("猜大了,请重新猜测:");
temp = s.nextInt();
} else if(temp < num) {
System.out.print("猜小了,请重新猜测:");
temp = s.nextInt();
} else {
System.out.print("猜对了");
break;
}
}
}
}
do…while循环结构
控制循环的语句
* break——> 中断循环(最近的)
* continue——>结束本次循环(最近的)
对于break,continue都可以指定循环,只需要在给循环加一个标签,然后使用break/continue 标签名 即可
public static void main(String[] args){
for1:for(int i=0; i<5; i++) {
for(int j=0; j<5; j++) {
if(i == 1) {
break for1;
}
System.out.print("*");
}
}
}
4. 数组
数组的特点
数组的声明与初始化
-
动态初始化
int[] intArr = new int[10]; ----> 声明一个长度为10的数组,初始化的值给定为int类型的默认值 -
静态初始化
int[] intArr = new int[]{1,2,3,4,5} ;—> 声明一个长度为5的数组,并给定数组元素的值。此处可以简写为 int[] intArr = {1,2,3,4,5};对于数组初始化默认值
在动态初始化中,数组元素的默认值就是数组元素类型的默认值
在静态初始化中,数组元素也有默认值,只不过系统自动马上将默认值替换成大括号里的具体数值在Java中各种类型的默认值
数据类型 默认值 整数型 0 浮点型 0.0 字符型 ‘\u0000’ 布尔类型 false 引用数据类型 null
数组这种结构有什么其优缺点
优点
- 检索元素效率极高。——原因:在一个数组中数组元素的内存地址是连续的;知道数组的地址值,知道数量数组元素所占字节数(因为在同一个数组中数组元素的类型必须相同,所以在同一个数组中数组元素所占字节数都是相同的),知道数组元素的下标,我们可以通过一个数学表达式计算出某一个数组元素下标的地址值,所以检索效率极高
- 向数组末尾添加元素效率极高。——原因:向数组末尾添加元素,并不涉及到整体元素的位移操作,所以效率高
缺点
- 数组不能存储大容量数据。——原因:很难在堆内存中找到一块很大且连续的空间
- 数组删除元素效率很低。——原因:为了保证数组地址值式连续的这种特点,删除元素会涉及到整体元素向前或向后位移操作,所以效率很低
数组扩容
- 可以以使用System.arraycopy()对数组扩容
- 数组扩容效率极低,尽量减少数组的扩容次数
数组内存分析
public class Test {
public static void main(String[] args) {
int[] arrA = new int[3];
arrA[0] = 1;
arrA[1] = 2;
arrA[2] = 3;
}
}
程序执行分析
-
对于这个Test.java的源文件,通过编译生成字节码文件,字节码文件被类加载器找到后并装入到JVM(方法区)中,程序运行时JVM会调用main方法,并将main方法临时存放在栈内存中(push)。
-
在栈内存中执行main方法,
- int[] arrA = new int[3]; ----> 这条语句,会在堆中创建一个长度为3的数组对象(地址0x666),这个数组对象中的元素系统会自动给定默认值0。并将这个数组对象的内存地址赋值给这个名为arrA的变量(引用)。
- arrA[0] = 1; ----> 这条语句会将找到(地址值为0x666)的数组的第1个元素,并将其值改为1
- arrA[1] = 2; ----> 这条语句会将找到(地址值为0x666)的数组的第2个元素,并将其值改为2
- arrA[2] = 3; ----> 这条语句会将找到(地址值为0x666)的数组的第3个元素,并将其值改为3
3.main方法执行完毕后,在栈中会释放main内存(pop)
5. 在idea中debug工具的使用
对于断点的高级设置,View Breakpoints