方法的重载(@overload)
前提:
- 重载的方法是存在于同一个类中 [前提]
- 重载的方法的方法名必须相同
- 重载的方法的参数列表必须不相同
- 重载的方法的返回类型可以不一样,可以一样
public class LoadMethodDemo { public static void main(String[] args) { add(20); } public static int add(){ System.out.println("add -> 100"); return 100; } public static void add(int i){ System.out.println(i); } }
优点就是简化api - 方便调用的.
学会使用api
通过学习java.lang.Math - 数学工具类 - 提供了很多关于数学计算的方式.
package tech.aistar.day03; /** * 本类用来演示: java.lang.Math * * @author: success * @date: 2021/7/19 8:59 上午 */ public class MathDemo { public static void main(String[] args) { //绝对值 int n = Math.abs(-10); System.out.println(n); //求随机数 - 伪随机的 //static double random();//[0.0,1.0)之间的随机小数 System.out.println(Math.random()); //[1,100]之间随机的整数 int result = (int) (Math.random()*100+1);//[1,100] System.out.println(result); //[3,5]之间的随机整数 int m = (int) (Math.random()*3+3); System.out.println(m); //求俩个数中的最大值/最小值 System.out.println(Math.max(10,20));//20 //笔试填空题 - //返回小于或等于参数的最大(最接近正无穷大) double值,等于一个数学整数。 //floor方法. System.out.println(Math.floor(3.5));//3.0 System.out.println(Math.floor(4.0));//4.0 System.out.println(Math.floor(-3.5));//-4.0 //返回参数中最接近的 long ,其中 long四舍五入为正无穷大。 //Math.floor(a + 1/2) System.out.println(Math.round(-3.5)); //开根 System.out.println(Math.sqrt(9));//3.0 //次方 System.out.println((int)Math.pow(2,3));//8 } }
语句
三元操作符
三目运算符
条件表达式 ? result1 : result2
表达式为true,结果就是result1,否则结果是result2
支持无限嵌套的 - 但是不推荐,可读性差
m ? (表达式?result1:result2):result2
if…else…
if语句单独使用场景
if(条件){//成立 //code... }
{}可以省略的场景
if(条件) //code... 如果if{}中的代码只有1行,那么{}可以省略,但是一定要缩进
if…else…使用
if(条件){ //条件成立 }else{ //条件不成立 } //如果语句仍然只有一行,{}还是可以省略的 if(条件) //code else //code..
多条件分支if…else if…else…if … else…
注意条件是互斥的
if(条件){ //条件成立 }else if(条件){ //条件不成立 }else if(条件){ //code }else{ //code.. }
if…else语句可以无限嵌套使用
if(条件){ //条件成立 if(条件){ }else{ } }else if(条件){ //条件不成立 if(条件){ //条件成立 }else if(条件){ //条件不成立 }else if(条件){ //code }else{ //code.. } }else if(条件){ //code }else{ //code.. }
习题
买奶茶,每第二杯半价,单价是10元.求总价.
10 5 10 5 10
- 求某年某月最大天数
switch…case
没有if…else if…else灵活
语法:
switch(变量)/ /byte short int char String enum[枚举类型] //包装类型Byte Short Integer Character case 值1: //code [break]; case 值2: //code [break]; case 值3: //code [break]; [default: //code.. [break];] }
当switch括号中的变量能够匹配到某个case后面的值的时候,那么就会进入到对应的case中去执行里面的程序
进入到某个case块中执行的过程中,只有遇到break语句才会跳出switch块.如果没有遇到break语句,那么程序会
自动进入到下一个case块中去执行.
default语句可以省略,也是可以随便放的,推荐放在末尾.如果switch括号中的变量没有匹配到任何的case后面的值
的时候,那么就会进入到default
循环语句
while
- 属于后置循环 - 先判断循环条件是否成立,如果成立,则进入到循环体中,否则不执行循环.
- 使用场景:当不知道循环多少次,但是知道循环退出的条件的时候 - 优先选择while循环.
语法:
while(条件){
// 循环体…
}
package tech.aistar.day03; /** * 本类用来演示: while循环 * * @author: success * @date: 2021/7/19 10:53 上午 */ public class WhileDemo { public static void main(String[] args) { //while可以代替for的使用 //'a'-'z' char c = 'a'; while(c <= 'z'){ System.out.println(c); c++; } System.out.println("====="); //'A' - 'Z' int n = 65; while(n<=90){//退出的条件 System.out.println((char)n); n++; } //1-10 int m = 1; //死循环... while(true){ //死循环的内部一定要有打破循环的语句 - break System.out.println(m); if(m==10) // 循环退出的条件 break; m++; } } }
练习
求俩个数的最大公约数
思路:20 12 -> 4 20 % 12 = 8 12 % 8 = 4 8 % 4 = 0
十进制转换二进制
for循环
属于后置循环
单层for
for(①表达式1;②表达式2;③表达式3){ //④循环体 } ①表达式1 - 循环过程中的变量的初始化操作.比如int i = 0; - 仅仅只会执行1次. ②表达式2 - 循环退出的条件.比如 i<=10 - 至少执行1次 ③表达式3 - 循环过程中,变量因子的变化.i++ - 有可能是不执行,可能执行 执行顺序①-②[成立]-④-③-②[成立]-④-③.....
怪异的写法
for(;;){ //死循环 - break打破循环的语句 } 三个表达式都是可以任意的省略不写,或者写到其他地方
for循环的复合形态
for(同时定义若干个变量;条件;表达式){ //循环体... }
嵌套for循环,嵌套的层数不建议超过三层.嵌套越多,性能越低.
2-1. 内外层无关 - 里面的for选中的使用可以单独执行.没有使用到外面for的循环的变量因子的.
2-2. 内外层相关 - 里面的for使用到了外面for循环的变量因子的
练习 - 打印所有的三位数.三位数由数字1,2,3,4组成.但是不能出现重复的.
每打印4个换一行
package tech.aistar.day03; /** * 本类用来演示: * 练习 - 打印所有的三位数.三位数由数字1,2,3,4组成.但是不能出现重复的. * * 每打印4个换一行 * * @author: success * @date: 2021/7/19 2:26 下午 */ public class ForExerciseDemo { public static void main(String[] args) { //定义一个计数器 int count = 0; for (int x = 1; x <=4 ; x++) { for (int y = 1; y <=4; y++) { for (int z = 1; z <=4; z++) { // System.out.print(x+""+y+z); if(x!=y & x!=z & y!=z){ System.out.print(x*100+y*10+z+"\t"); count++; // if(count % 4==0){ // System.out.println(); // } if(count == 4){ System.out.println(); count = 0; } } } } } } }
do…while…
属于前置循环 - 无论循环条件是否成立,优先先进入到循环体中执行一次.
然后再进行判断条件,决定下一次是否再次进入.
do{
//循环体…
}while(条件);
break语句
- break可以跳出swtich块
- break可以打破它所在的那一层循环
continue语句
出现在循环体中
跳过本轮循环,继续执行下一轮循环.
数组
- 数组的诞生 - 为了解决单个变量只能存储单个值的缺点.
- 数组本身也是属于数据结构[数组,栈,堆,树[红黑树],链表,图…]
- 数组是属于对象类型,数组是存在在JVM内存的堆区,基本类型存储在JVM内存的栈区
- 数组在内存中一定是一块连续的空间.
- 数组的大小[长度,数组中存放的数据的个数]一旦确定了,不能改变.
语法
1. 元素类型[] 变量名 = new 元素类型[size];//size数组的大小
2. 元素类型 变量名[] = new 元素类型[size];//
元素类型就是数据类型[8种基本数据类型,以及对象类型]
作用 - 元素类型决定了这个数组中可以存放的数据的类型
//arr的数据类型是什么?int[] -> 整数型数组
// "定义一个长度为3的int型数组"
int[] arr = new int[3];
赋值方式
如果定义了数组,但是没有进行赋值操作,那么系统会默认分配一个默认值
默认值根据元素类型来决定了.
byte,short,int,long -> 0
float,double -> 0.0
boolean -> false
char -> 空格
对象类型 -> null
先定义数组,然后通过下标一一赋值
int[] arr = new int[3]; //数组的下标从[0,数组长度-1]范围 //如果下标不在此范围,控制台抛出java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常 arr[0] = 10; arr[1] = 10; arr[2] = 10;
- 定义数组的同时进行赋值
int[] arr = {3,4,5};
- 定义数组的同时进行赋值
int[] arr = new int[]{3,4,5};
- 通过普通for去赋值
int[] arr = new int[3]; for(int i=0;i<arr.length;i++){ arr[i] = (int)(Math.random()*100+1); }
数组的遍历
通过下标一一取值
System.out.println(arr[下标]);
数组提供了属性length - 获取数组的长度
通过普通for循环进行遍历
for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
使用jdk5.x提供的增强for循环的语法
属于只读的for
int[] arr2 = {3,4,5}; for(元素类型 元素变量:数组变量名){ System.out.println(元素); } for(int e:arr2){//此处的e不是代表下标,就是代表真正的元素 System.out.println(e); }
拓展 - 数组的内存
//通过new关键字在Jvm的堆中开辟新的空间01,用来存储这个对象{10,20,30}
//然后将这个对象在堆空间中的内存地址赋值给了引用变量arr1[存储在栈]
//"结论" - arr1的本质不是对象,只是一个引用变量而已
//"结论" - 引用和对象之间的关系
// 引用变量中存储的就是对象在堆空间中的内存地址
// "气球理论" - 一个引用变量在同一个时刻,只能指向一个对象
// - "一个对象可以在同一个时刻被多个引用指向"
int[] arr1 = new int[]{10,20,30};
//通过new关键字在Jvm的堆中开辟新的空间02,用来存储这个对象{10,20,30}
int[] arr2 = {10,20,30};
arr1 = arr2;//arr1和arr2都是指向第二次创建出来的数组对象
//原来第一次创建出来的对象就成为内存中的垃圾对象 - GC[垃圾回收线程进行回收,释放内存]
//"垃圾对象" - 没有任何引用指向的对象
拓展 - 方法的参数传递方式
- 基本类型采用值传递
- 对象类型[引用类型]采用地址传递
总结:Java中只有值传递,没有地址传递.比较特殊的是String类型[虽然是一个对象类型,但是具备基本类型传递的特点]