(002)循环语句,数组,方法,走进面向对象(封装)

循环语句,数组,方法,面向对象(封装)

今天的内容是循环语句,数组,类,对象,面向对象的三大特征之一的封装;
对这些内容有格式,怎么用,还有注意事项; 这些知识点里面的内容考试题型做了一个总结,
希望对正在学习java的你可以有所帮助;以后每周都会更新,知道我退出这个行业;

1循环结构语句

for :使用最多: 普通for循环
求和思想
统计思想
什么是水仙花数 :三位数,每个位上的数据的立方相加的,是这个数据本身 157?
while: 其次才是这个while
do-while 很少用
引入两个死循环 :一定要出口条件

for(; ; ){
	循环体;
}
while(true){ //使用多一些
	循环体;
}

1.1for语句

//格式:
for(初始化语句;条件表达式;控制体语句或者步长语句){
      循环体语句;
}
/**
*需求:需要在控制台输出 10次 "我爱章若楠"
*这一个代码:10句话放在程序中
* 1)阅读性差
* 2)代码的冗余度非常高(重复性太大)

* 这个时候,计算机语言提供了流程控制语句之循环语句
* //明确循环次数优先的for循环

* 格式
* for(初始化语句;条件表达式;控制体语句或者步长语句){
         循环体语句;
 }
 */
 public class Demo {
	public static void main(String[] args){
		//最原始的做法:输出10句话
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("我爱章若楠") ;
		System.out.println("------------------------------------------------");
		//10次 "我爱章若楠“
		for(int x = 1 ; x <=10;x++){       //x=1,x<=10, x=2,2<=10,x = 3 ,
			3<=10,x=10,x<=10,x=11,11<10
			System.out.println("我爱章若楠") ;        //1,2,3....... 10
		}
	}
}
  • 执行流程

1)初始化语句:给变量赋值 (只执行一次)
2)然后执行条件表达式,看其是否成立,如果成立,执行的是循环体语句------>再次回到控制体语句或者步长语句—>变量自增或者自减
3)再次执行条件表达式,是否成立,成立,继续循环体语句---->再次回到控制体语句或者步长语句---->变量自增或者自减
4)一直执行到条件表达式不成立,for循环结束;

1.2循环求和思想

需求:
* 1)在控制台输出1-10的每一个数据
*
* 2)循环的求和思想
* 在控制台输出1-10的之间的所有的数据之和
* 1+2+3+4+5+6+7+8+9+10 :原始做法比较麻烦,随着数据规模越来越大,这种
做法不合适;
*
* 求和思想:
* 将上面的这种格式变形一下:
* 定义一个结果变量:0开始 sum这个变量
* 0 + 1 = 1 ;
* 1 + 2 = 3 ;
* 3 + 3 = 6 ;
* 6 + 4 = 10 ;
* 10 +5 = 15 ;
* 15 + 6 = 21 ;
* 21 + 7 =28 ; ....
*
* 两个加数:
* 前面的这个加数:就是求和结果变量sum,0开始
* 后面的这个加数:就是1-10的数据;
*
*
* 使用步骤:
* 1)定义一个最终结果变量sum,0开始记录
* 2)使用for(初始化语句;条件表达式;控制体语句){
* //循环体语句
* //先取出来每一个数据
* 使用结果变量就是上面的数据求和,然后再赋值给最终结果变量;
* }
* 3)输出sum即可
public class ForDemo {
	public static void main(String[] args) {
		//1)在控制台输出1-10的每一个数据
		//原始的做法
		System.out.println(1) ;
		System.out.println(2) ;
		System.out.println(3) ;
		System.out.println(4) ;
		System.out.println(5) ;
		System.out.println(6) ;
		System.out.println(7) ;
		System.out.println(8) ;
		System.out.println(9) ;
		System.out.println(10) ;
		System.out.println("--------------------------------") ;
		//上面的重复度很高,改进
/* for(初始化语句;条件表达式;控制体语句或者步长语句){
循环体语句;
}*/
		for(int i = 1;i<=10 ; i ++){   //x=1,1<10 , i++-->2 <=10
			System.out.println(i) ;    //1, 2....
		}
		System.out.println("---------------求和思想的引入------------------");
		// 在控制台输出1-10的之间的所有的数据之和
		//原始的做法:
		System.out.println(1+2+3+4+5+6+7+8+9+10) ;
		System.out.println("---------------------------------------------") ;
		//定义一个结果变量
		int sum = 0 ;
		for(int x = 1 ; x <=10 ; x ++) {// 1-10之间的数据
				//x的取整:1,2....10;
			sum += x ; //sum = sum + x ;
/**
* sum = 0 ;
* x = 1 ; x <=10 ;成立---循环体: sum = sum+x 0 +1 =1 x++
* x = 2 ; 2<=10 ;成立--- 循环体: 1 + 2 = 3 -- sum = 3 ; x ++
* x = 3 ; 3<=10 ; 成立--- 循环体: 3+3 = 6 --- sum= 6; x++
* x=4 .....................
*/
		}
		System.out.println("1-10的数据之和是:"+sum);
	}
}

1.3水仙花数获取

需求:在控制台输出所有的水仙花数

  • 水仙花数

  • 水仙花指的是三位数,而且这个三位数的每一个位上的立方相加就是当前数据本身;

  • 举例:153 = 1 * 1 * 1 + 555 + 333

  • 153 % 10 = 3 ;—确定个位的数据

  • 153 / 10 % 10 = 5 — 确定十位的数据

  • 153 /10 /10 %10 = 1 — 确定百位上的数据

  • 分析:

  • 1)三位数,明确了范围 100-999—使用for循环 x

    1. 确定每各位的数据本身的值:
      定义三个变量,分别代表个位,十位,百位数据本身
      int ge = 当前这个数据 % 10 ;
      int shi = 当前这个数据 /10 %10 ;
      int bai = 当前这个数据 /10/10 % 10 ;
  • 3)for循环中加入逻辑判断
    如果当前x == (gegege)+(shishishi)+
    (baibaibai),
    满足条件,直接输出x

public class forDemo3 {
	public static void main(String[] args) {
		System.out.println("水仙花数是:") ;
		// 1)三位数,明确了范围 100-999---使用for循环 x
		for (int x = 100; x < 1000; x++) {
			//x:100-999的数据
			//确定每各位的数据本身的值:
			// 定义三个变量,分别代表个位,十位,百位数据本身
			int ge = x %10 ; //x=153
			int shi = x /10 %10 ;
			int bai = x /10 /10 % 10;
			//如果当前x == (ge*ge*ge)+(shi*shi*shi)+(bai*bai*bai),满足条件,
				//直接输出x
			if(x==(ge*ge*ge+shi*shi*shi+bai*bai*bai)){
				System.out.println(x) ;
			}
		}
	}
}

while :循环格式

初始化语句;
while(条件表达式){
	循环体;
	控制语句;
}

需求:猜数字游戏

写代码的过程,经常用alt+enter键:自动提示,补全代码

分析:
1)需要产生一个随机数:java.lang.Math 里面的功能random()产生一个1-100之间的随机数不断的键盘录入
Math.random使用
jdk提供了类:java.lang.Math

  • java.lang包下的类不需要导包
  • 针对数学运算的工具类,提供了很多的方法;
  • 获取伪随机数,取值范围:[0.0,1.0)
  • public static double random():
  • 快速使用:
  •   Math.random()---获取一个随机数
    
 while(true){
      2)创建一个键盘录入对象,录入int类型
     3)录入的数据要和Math里面产生的1-100之间数据进行对比,
  如果大了,提示 "你要猜的数据大了"
 如果小了,提示"你要猜的数据小了"
    如果一致,提示"恭喜您,猜对了"
          结束死循环,break ;
   }
public class DisLooperTest {
    public static void main(String[] args) {
        System.out.println("-------猜数字小游戏-------");
        System.out.println("---------游戏开始-----");

        //需要产生一个随机数:java.long.Math 里面的功能random()产生一个1-100之间的随机数
        int number= (int) (Math.random()*100+1);

        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);

        //提示输入并输入要猜的数字
        System.out.println("请输入你要猜的数字:");
        int count=0;
        while(true) {
            //如果猜错了重新录入
            int number1= sc.nextInt();
            count++;
            //拿键盘录入的数字和Math产生的随机数做比较
            if (number1 > 100 || number1 < 0) {
                System.out.println("你输入的数字有误!请输入1-100之间的数字");
            } else if (number1 > number) {
                System.out.println("你猜的数" + number1 + "大了!"+"请重新输入");
            } else if (number1 < number) {
                System.out.println("你猜的数" + number1 + "小了!"+"请重新输入");
            } else {
                System.out.println("恭喜你猜对了!");
                System.out.println("你第" + count + "猜对了");
                break;
            }
        }
        System.out.println("--------游戏结束--------");
    }
}

2 for循环的综合运用(for循环嵌套)

for(初始化语句1;条件中表达式1;控制体语1){ //外层循环
	// 循环体语句又是一个for循环
	for(初始化语句2;条件表达式2;控制体语2){//内层循环
		循环体语句...
	}
}

45的列*
*****
*****
*****
*****

*
**
***
****
*****
******
*******
********
**********
99乘法表

2.1 99乘法表代码

/*
        九九乘法表
 */
public class Demo {
    public static void main(String[] args) {
        //外层循环,表示行数,一共有多少行
        for (int i = 1; i <= 9; i++) {
            //内层循环表示列数,
            for (int j = 1; j <= i; j++) {//列数随着x的变化而变化
                //Java中 转移字符 "\t"---->制表符 相当于tab 缩进空格
                System.out.print(i + " x " + j + " = " + (i * j) + "\t");
            }
            System.out.println();//换行
        }
    }
}

2.2do-while循环和其他循环语句的区别

初始化语句;
do{
	循环体语句;
	控制体语句;
}while(条件表达式) ;
//区别于其他循环: 当条件不成立的时候,循环体语句至少执行一次; 开发中使用的比较少;

2.3断点调试

  • 在方法中的有效代码第一行打断点,在行号上直接单击即可

在这里插入图片描述

  • 使用debug启动Java应用程序 右键—选择 debug run xxx类名.main :debug启动这个类的main方法
    在这里插入图片描述
    在这里插入图片描述

2.4 break和contine的笔试题


for(int x= 1 ; x <=10;x++){ 
    if(x %3==0){ 
    //补全代码
} 
System.out.println("我爱章若楠"); }
//在补全代码的地方需要打印以下内容:该如何补?
//1)需要在控制台输出 2次"我爱章若楠" break 
//2)需要在控制台输出7次"我爱章若楠" continue 
//3)需要在控制台输出13次"我爱章若楠" System.out.println("我爱章若楠") ;

2.5跳转控制语句break和continue的区别

两个都在循环中使用居多;
break:结束中断,结束循环语句也可以结束switch语句,应用范围比continue大
continue:仅仅在循环中使用,表示"结束当期循环,立即进入下一次循环"

循环的基本内容结束了,接下来是方法啦

3 java中的方法

方法(method) 的概述:就是完成特定功能的代码块

3.1无参无返回值方法的定义和调用

定义
public static void 方法名(){
        //方法体
}
范例: public static void isEvenNumber(){
        //方法体
}
调用
格式:        方法名();
范例:        isEvenNumber();
idea演示



public class MethodDemo {
    public static void main(String[] args) {
        //调用方法
        isEvenNumber();
    }
    //需求:定义一个方法,在方法中定义一个变量,判断该数据是否是偶数
    public static void isEvenNumber() {
        //在方法中定义一个变量
        int number = 10;
        number = 9;

        //判断该数据是否是偶数
        if (number % 2 == 0) {
            System.out.println(number + "是偶数");
        } else {
            System.out.println(number + "不是偶数");
        }
    }
}

注意事项:

方法定义完毕后,需要调用才能执行

方法必须先定义后调用,否则程序将报错

3.2 Debug查看方法调用

  • 按照 Debug 的正常使用即可,但是要注意如下事项:
  • 进入一个方法的时候,需要用 Step Into F7
  • 在方法内部,看每一行代码的执行流程,使用 Step Over F8
  • 注意观察方法的出现和消失,以及变量的变化

练习输出较大值
题目:
① 定义一个方法,用于打印两个数字中的较大数,例如:getMax()
② 方法中定义两个变量,用于保存两个数字
③ 使用if语句对两个数字的大小关系进行处理
④ 在main()方法中调用定义好的方法
代码:



public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法
        getMax();
    }
    //定义一个方法,用于打印两个数字中的较大数,例如:getMax()
    public static void getMax() {
        //方法中定义两个变量,用于保存两个数字
        int a = 10;
        int b = 20;
        //使用if语句对两个数字的大小关系进行处理
        if(a >= b) {
            System.out.println("较大的数是:" + a);
        } else {
            System.out.println("较大的数是:" + b);
        }
    }
}

3.3 带参无返回值方法的定义和调用

定义
格式: public static void 方法名(数据类型 参数1,数据类型 参数2,,,,,,,,){...........}
注意事项:

带参方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错

带参方法定义时,多个参数之间使用逗号(,)分隔

调用
格式: 方法名(变量名1/字面量值1,变量名1/字面量值1);
注意事项

带参方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错

代码演示:

public class MethodDemo {
    public static void main(String[] args) {
        //字面量值调用
        isEvenNumber(10);
        isEvenNumber(9);


        //变量的调用
        int number = 11;
        isEvenNumber(number);
        number = 12;
        isEvenNumber(number);
    }
    //需求:定义一个方法,该方法接收一个参数,判断该数据是否是偶数
    public static void isEvenNumber(int number) {
        if (number % 2 == 0) {
            System.out.println(true);
        } else {
            System.out.println(false);
        }
    }
}

3.4 形参和实参

形参:方法定义中的参数
等同于变量定义格式,例如:int number
实参:方法调用中的参数
等同于使用变量或字面量,例如: 10 number
输出较大值(练习)
题目要求:
① 定义一个方法,用于打印两个数字中的较大数,例如:getMax()
② 为方法定义两个参数,用于接收两个数字
③ 使用if语句对两个数字的大小关系进行处理
④ 在main()方法中调用定义好的方法(使用字面量)
⑤ 在main()方法中调用定义好的方法(使用变量)

public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法(使用字面量)
        getMax(10,20);

        //在main()方法中调用定义好的方法(使用变量)
        int x = 10;
        int y = 20;
        getMax(x,y);
    }
    //定义一个方法,用于打印两个数字中的较大数getMax()
    //为方法定义两个参数,用于接收两个数字
    public static void getMax(int a, int b) {
        //使用if语句对两个数字的大小关系进行处理
        if(a >= b) {
            System.out.println("较大的数是:" + a);
        }else {
            System.out.println("较大的数是:" + b);
        }
    }
}

3.5 带返回值方法的定义和调用

定义格式:

public static 返回值类型 方法名(数据类型  参数1,数据类型 参数2,,,,,,,,){
        return 数据;
}

注意事项:

方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错

调用格式:
数据类型 变量名 = 方法名(参数);

注意事项:

方法的返回值通常会使用变量接收,否则该返回值将无意义

有返回值较大值的练习
题目要求:
① 定义一个方法,用于获取两个数字中的较大数,例如:getMax()
② 使用if语句对两个数字的大小关系进行处理
③ 根据题设分别设置两种情况下对应的返回结果
④ 在main()方法中调用定义好的方法并使用变量保存

public class MethodTest {
    public static void main(String[] args) {
        //在main()方法中调用定义好的方法并使用变量保存
        int max = getMax(10, 20); //.var的使用,它能够帮我们自动补齐左边的内容
        System.out.println(max); //max.sout,能够把max变量放到输出语句中

        System.out.println(getMax(10,20));
        System.out.println(getMax(10, 20));
    }

    //定义一个方法,用于获取两个数字中的较大数,例如:getMax()
    public static int getMax(int a,int b) {
        //使用if语句对两个数字的大小关系进行处理
        //根据题设分别设置两种情况下对应的返回结果
        if(a >= b) {
            return a;
        } else {
            return b;
        }
    }
}

方法的注意事项

方法不能嵌套定义 void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据

3.6 方法的通用格式

public static 返回值类型 方法名(参数){
        方法体;
        return 数据;
}

格式说明:

public static 修饰符,目前先记住这个格式

返回值类型
方法操作完毕之后返回的数据的数据类型,如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return

方法名 调用方法时候使用的标识

参数 由数据类型和变量名组成,多个参数之间用逗号隔开

方法体 完成功能的代码块

return 如果方法操作完毕,有数据返回,用于把数据返回给调用者

定义方法时,要做到两个明确

明确返回值类型: 主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型

明确参数: 主要是明确参数的类型和数量而在调用方法时,我们要知道下面两种不同返回值类型的方法调用:

void类型的方法,直接调用即可

非void类型的方法,推荐用变量接收调用

3.7 方法重载

概述: 指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载

格式:

多个方法在同一个类中

多个方法具有相同的方法名

多个方法的参数不相同,类型不同或者数量不同

方法重载的特点:

类型不同或者数量不同重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载 用代码解释方法重载

public class MethodDemo {
    public static void main(String[] args) {
        //调用方法
        int result = sum(10, 20);
        System.out.println(result);

        //每次调用需要从新创建对象
        double result2 = sum(10.0, 20.0);
        System.out.println(result2);


        int result3 = sum(10, 20, 30);
        System.out.println(result3);
    }


    //需求1:求两个int类型数据和的方法
    public static int sum(int a,int b) {
        return a + b;
    }


    //需求2:求两个double类型数据和的方法
    public static double sum(double a,double b) {
        return a + b;
    }


    //需求3:求三个int类型数据和的方法
    public static int sum(int a,int b,int c) {
        return a + b + c;
    }
}

4 数组(默认都是一维数组)---------- 进入到引用数据类型 (重点)

4.1 JVM在java内存的内存分配

  • 栈内存

  • 堆内存

  • 方法区

  • 字节码文件区域

  • static区域

  • 常量池…

  • 寄存器

  • 本地方法区

4.2 什么是数组?

  • 数组定义格式
  • 动态初始化
  • 静态初始化

数组: Java中数组就是容器,这个容器 “只能存储同一种类型的元素”
在数组中定义格式
动态初始化静态初始化

动态初始化:自己定义数组的长度,数组的元素有系统(jvm)默认分配

格式:
数据类型[] 数组名称 = new 数据类型[数组长度] ; 推荐第一种
数据类型 数组名称[] = new 数据类型[数组长度] ;

举例
int[] arr = new int[3] ;
int arr[] = new int[3] ;
静态初始化

数组的定义格式第二种
静态初始化:直接我们自己给定的了元素内容,数组的长度由系统默认分配

原生的格式写法: 数据类型[] 数组对象名 = new 数据类型[]{元素1,元素2,元素3…} ; 数据类型 数组对象名[]
= new 数据类型[]{元素1,元素2,元素3…} ;
举例 int[] arr = new int[]{1,2,3} ; int arr[] = new int[]{1,2,3} ;
静态初始化的简写格式 数据类型[] 数组对象名 = {元素1,元素2,元素3…} ;
推荐的写法 数据类型 数组对象名[] = {元素1,元素2,元素3…} ; int[]
arr = {1,2,3} ; int arr[] = {1,2,3} ;

在数组中有一个特有的属性:length 数组名称.length: 获取数组长度 数组中的最大索引值: 数组名称.length-1

java.lang.ArrayIndexOutOfBoundsException:数组角标越界异常 :访问了数组中的不存在的索引就会出现这种问题;

异常:Exception 编译时期异常:idea写代码的,编译通过不了,无法运行; 语法有问题; 运行时期异常:
开发者在编写代码的时候,大部分逻辑性不严谨,比如: 数组的5个元素,角标最大4,你访问角标5


public class ArrayDemo3 {
	public static void main(String[] args) {
		// 数据类型[] 数组对象名 = {元素1,元素2,元素3.....} ; 推荐的写法
		//创建一个数组,静态初始化
		int[] arr = {11,22,66,77,67} ;
		System.out.println(arr.length-1);//获取最大索引值
		System.out.println(arr) ;//地址值
		System.out.println(arr[0]) ;
		System.out.println(arr[1]) ;
		System.out.println(arr[2]) ;
		System.out.println(arr[3]) ;
		System.out.println(arr[4]) ;
		//java.lang.ArrayIndexOutOfBoundsException:数组
		//角标越界异常 :访问了数组中的不存在的索引就会出现这种问题;
		//System.out.println(arr[5]) ;
		//jvm在校验:这个语法通过的,满足 数组名称[索引值]
	}
}

4.3 数组的基本应用

    数组中的元素----一一获取出来 (数组的遍历) 
    数组 存储了5个不同的元素,获取元素中最大值/           
    最小值查询这个数组的某个元素的角标
    import java.util.Arrays;

import java.util.Scanner;

/*
        2.键盘录入5个不同int类型的数据,将数据存储在数组中,把这个数组中所有元素顺序进行逆序。(静态初始化)
 */
public class ArrayDemo01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr = {0, 0, 0, 0, 0};//静态初始化
        for (int i = 0; i < 5; i++) {//为数组添加元素
            System.out.println("请输入第"+(i+1)+"处的元素:");
            arr[i] = sc.nextInt();//键盘录入
        }
        //数组逆序
        for (int i = 0; i < arr.length/2; i++) {
            //元素交换
            int temp = arr[i];
            arr[i]=arr[arr.length-1-i];
            arr[arr.length-1-i]=temp;
        }
        //打印数组
        System.out.println(Arrays.toString(arr));
    }
}
/*
        元素逆序
 */
public class ArrayDemo02 {
    public static void main(String[] args) {
        //定义一个数组
        int[] array={1,2,3,4,5,6};
        //遍历数组2分之1次取值
        for (int i = 0; i < array.length/2; i++) {
            //定义变量存放数组中的第0处索引的值
            int temp = array[i];
            //然后把数组中的要交换的元素赋给索引0
            array[i]=array[array.length-1-i];
            //然后把变量中存放的元素赋给要交换的索引位置
            array[array.length-1-i]= temp;
        }
        //打印数组
        System.out.println(Arrays.toString(array));
        for (int start=0,end= array.length-1; start < end; start++,end--) {
            int temp= array[start];
            array[start]=array[end];
            array[end]= temp;
        }
        System.out.println(Arrays.toString(array));
    }
}
/**
 * 数组中的基本元素查找法: 查询元素 的第一次出现的索引值,每次都需要从头查到尾
 *   对于基本元素查找法的----数组的元素的内容,可以无序/可以有序
 *
 *
 *   后面:高级查询:二分搜索法(称为"折半查找):前提条件:数组的元素必须有序!
 *   特点:能够节省查询时间,效率高
 *
 *
 * 需求:
 *  已知一个数组,静态初始化了,查询数组中某个元素的索引值;
 *
 *  int[] arr = {69,57,13,24,87} ;  //查询13这个元素第一次出现的索引值
 *                                      //133元素
 *
 *
 *          分析:
 *               1) 定义一个方法
 *                      方法的返回值 int
 *                      方法的参数类型和参数个数
 *                          int[],查询的具体的元素   2个参数
 *               2)
 *                    遍历数组,获取所有元素
 *                    判断:如果要查询的元素和数组的中元素一致,就找到了
 *                              返回角标值
 */
public class ArrayDemo03 {
    public static void main(String[] args) {

        //已知这个数组:
        int[] arr = {69,57,13,24,87} ;

        //调用方法
        int index = getIndex(arr, 13);//找13
        System.out.println("index:"+index);
        System.out.println("----------------------------") ;
        int index2 = getIndex(arr, 133);//找13
        System.out.println("index2:"+index2);
    }
    /**
     * 定义一个方法
     *  明确返回值类型: int
     *  明确参数类型以及参数个数
     *          nt[],查询的具体的元素   2个参数
     */
    public static int getIndex(int[] array,int target) {//array:传递一个数组,target:查询目标元素
        //遍历数组,获取所有元素
        for (int x = 0; x < array.length; x++) {
            //array[x]:每一个元素就可以获取到
            //判断
            //如果array[x] 和target 相等,就找到了,x返回
            if (target == array[x]) {//考虑找到的情况
                return x;
            }
        }
        //查询数组:找不到元素,返回负数  -1
        return  -1 ;
    }
}

4.4 方法重载

什么是overload? 就是方法重载
方法重载:为了某个功能扩展性,多个方法方法名可以相同(完全相同),参数列表不同 ,与返回值无关, 参数列表不同
1)参数个数不同
2)参数类型不同
3)参数类型的顺序不同

public static double getSUM(int x,double y){
	return x+y ;
}
public static double getSum(double a,int b){
	double result = a +b;
	return result ;
}
public static double getSum(int a,double b){
	double result = a +b;
	return result ;
}


4.5 编程作业

4…定义一个方法,根据商品总价,计算出对应的折扣并输出。折扣信息如下:
总价<100,不打折
总价在100到199之间,打9.5折
总价在200以上,打8.5折
要求:
1)定义一个方法,根据商品总价输出折后总价
2)在主方法中调用方法,输出结果

public class Test01 {
    public static void main(String[] args) {
        double v = DiscountTest();//调用方法,接收返回值
        System.out.println("你购买的商品的价格为: "+v+"元");//打印返回值
    }
    public static double DiscountTest(){
        //创建键盘录入对象
        Scanner sc= new Scanner(System.in);
        //提示并输入数
        System.out.println("请输入你要购买的商品价格:");
        int num1= sc.nextInt();
        double x=0.0;//定义返回值
        if (num1<100){//小于一百
            x= num1;//把价格赋值给x
        }else if (num1<=199&&num1>=100){//100到199之间
            x= num1*0.95;//把价格赋值给x
        }else if (num1>200){//200以上
            x= num1*0.85;//把价格赋值给x
        }
        return x;//返回值
    }
}

5.数组的遍历 :
定义一个数组,静态初始化,将数组中的元素按照下面格式输出
[元素1, 元素2, 元素3, 元素4 …] ,使用方法调用完成(遍历,直接输出,没有返回值类型 void)

public class Test02 {
    public static void main(String[] args) {
        //定义静态初始化数组
        int[] arr ={12,23,45,67,78,89};
        //调用方法,遍历数组
        ArrayList(arr);
    }
    //遍历数组
    public static void ArrayList(int[] arr){
        System.out.print("[");//打印[
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            if (i!=arr.length-1) {//判断i不等于arr[]的最后一个元素
                System.out.print(arr[i] + ", ");//成立打印arr[i] + ", "
            }else{
                System.out.print(arr[i]);//否则直接打印
            }
        }
        System.out.print("]");//打印]
    }
}

6.键盘录入5个不同的数据,组成数组,然后获取数组中的最大值(使用方法完成,明显有返回值----int)

public class Test03 {
    public static void main(String[] args) {
        //定义动态初始化数组
        int[] arr= new int[5];
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        //遍历为数组添加元素
        for (int i = 0; i < arr.length; i++) {
            //提示并录入
            System.out.println("请输入第"+i+"号索引处的数");
            int num = sc.nextInt();
            arr[i]=num;//添加元素
        }
        //调用方法
        int i1 = ArrayMax(arr);
        System.out.println("最大值为:"+i1);
    }
    public static int ArrayMax(int[] arr){
        //定义变量为最大值
        int max=arr[0];
        //遍历数组求最大值
        for (int i = 1; i < arr.length; i++) {
            if (arr[i]>max){//判断第第二处索引的值与第一处大的大小,要是第一处的大,那就把第一处的赋值给nax
                max=arr[i];//true
            }
        }
        return max;//返回值
    }
}

7.编写方法,求数组元素的平均值
要求
1)定义一个方法,求数组的平均值
2)在主方法中定义对象,并初始化一个float类型的数组(直接在main方法中静态初始化一些值),调用方法求数组元素的平均值,并将平 均值打印输出

public class Test04 {
    public static void main(String[] args) {
        //初始化数组
        float[] arr= new float[]{12.4F,18.2F,18.365F,14.023F,45.2F,3.14159260718F};
        //调用方法并接收返回值
        float avg = getAVG(arr);
        System.out.println("平均数为:"+avg);//打印平均数

    }
    //定义方法,,求数组元素的平均值
    public static float getAVG(float[] arr){
        float avg=0;//定义变量,用来返回平均值
        //遍历数组,,先把数组元素累加起来
        for (int i = 0; i < arr.length; i++) {
           avg=arr[i];//累加
        }
        avg/=arr.length;//平均值
        return avg;//返回平均值
    }
}

8.将昨天的Math中random()求1-100的随机数,使用键盘不断录入数据,猜数字游戏,使用方法来完成;最终在主方法中进行测试
展示,多少次猜中了;

public class Test05 {
    public static void main(String[] args) {
        //调用方法并接收返回值
        int count = GamePlay();
        //输出返回值
        System.out.println("你第" + count + "猜对了");
    }

    public static int GamePlay() {
        System.out.println("-------猜数字小游戏-------");
        System.out.println("---------游戏开始-----");

        //需要产生一个随机数:java.long.Math 里面的功能random()产生一个1-100之间的随机数
        int number = (int) (Math.random() * 100 + 1);

        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);

        //提示输入并输入要猜的数字
        System.out.println("请输入你要猜的数字:");
        int count = 0;
        while (true) {
            //
            int number1 = sc.nextInt();
            count++;
            //拿键盘录入的数字和Math产生的随机数做比较
            if (number1 > 100 || number1 < 0) {
                System.out.println("你输入的数字有误!请输入1-100之间的数字");
            } else if (number1 > number) {
                System.out.println("你猜的数" + number1 + "大了!" + "请重新输入");
            } else if (number1 < number) {
                System.out.println("你猜的数" + number1 + "小了!" + "请重新输入");
            } else {
                System.out.println("恭喜你猜对了!");
                break;
            }
        }
        System.out.println("--------游戏结束--------");
        return count;//返回第循环次数
    }
}

9…搬砖问题:36 块砖,36 人搬,男搬4,女搬3,两个小孩抬1 砖,
要求一次全搬完,问男、女和小孩各若干?(穷举法题型,和百钱买百鸡同理)

public class Test06 {
    public static void main(String[] args) {
        int xiao=0;//小孩的数量
        for (int i = 0; i <= 9; i++) {//男人群举法
            for (int j = 0; j <= 12; j++) {//女人的群举法
                xiao=36-i-j;//小孩的数量就等于36减去男人和女人的数量
                if (i*4+j*3+xiao/2==36&&xiao%2==0){//判断小孩男人女人搬砖加人数等于36
                    System.out.println("男人:"+i+" ,女人:"+j+" ,小孩:"+xiao);//成立输出小孩子,老头子,老婆子的数量
                }
            }
        }
    }
}

4.6 数组的高级排序算法:冒泡排序

package Test;

import java.util.Arrays;
import java.util.Scanner;

/*
        冒泡排序
            1比较相邻的元素。如果第一个比第二个大,就交换他们两个。
            2对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。
            这步做完后,最后的元素会是最大的数。
            3针对所有的元素重复以上的步骤,除了最后一个。
            4持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
            分析:
            定义俩个方法,第一个方法为数组添加元素(提示键盘录入)
            第二个方法为数组
 */
public class Effervescence {
    public static void main(String[] args) {
        //定义键盘录入对象
        Scanner sc = new Scanner(System.in);
        //提示并打印数组
        System.out.println("请输入需要排序的索引长度:");
        int x = sc.nextInt();
        //定义动态初始化数组
        int[] arr= new int[x];
        //调用方法给数组添加元素
        ArrayList(arr);
        //调用方法给数组排序
        BubbleSort(arr);
    }
    //定义方法用冒泡排序为数组排序
    public static void BubbleSort(int[] arr){
        int count=0;//定义一个计数器
        for (int i = 0; i <arr.length-1 ; i++) {
            //第一遍冒泡排序
            boolean dong= true;//定义退出循环变量
            for (int j = 0; j < arr.length-1-i; j++) {
                //判断第一个和第二元素大小;用元素交换方法交换他们的位置
                if (arr[j] > arr[j + 1]) {
                    dong=false;
                    int temp= arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j] = temp;
                }
            }
            //判断是否排序完成;如果完成排序直接结束循环
            if(dong){
                break;
            }
            //提示这个打印每个进行一遍排序,且输出排序一遍后的元素;
            System.out.println("---------第" + ++count +"次排序结果----------");
            System.out.println(Arrays.toString(arr));
        }
        //最终排序结果
        System.out.println("最终排序结果:"+Arrays.toString(arr));
    }
    //定义方法为数组插入元素
    public static void ArrayList(int[] arr){
        //定义键盘录入对象
        Scanner sc = new Scanner(System.in);
        //遍历数组添加元素
        for (int i = 0; i < arr.length; i++) {
            //提示并为数组添加元素
            System.out.println("请输入位置"+i+"索引处的值:");
            arr[i]=sc.nextInt();
        }
        //定义数组
        //int[] arr = {12, 23, 8, 35, 89, 21, 78,2};
        //把冒泡排序运行数组长度减一次
        //换到最后一个数最后一个就不动了
        System.out.println("排序之前的数组:"+Arrays.toString(arr));
    }
}

4.7 面试题

int] array = new int[3]; 这句话完了哪些事情? —内存 于了什么事情
1)需要在栈内存中开辟空间int]
array这个变量
2)new int[3];需要在堆内存中申请空间
3)为这个堆内存中的这些数组的元素,进行系统默认机始化int类型的元素在数组中默以值0
4)系统初始化完毕,为堆内存空间产生一个空间地址值,
5)将堆内存空间地址值赋值给线内存的变量array
6)栈内存中array指向堆内存地址:

5 进入面向对象

数组和方法的基础学完了
接下来我们就要进入一个新的层次叫面向对象
什么是面向对象?接下来我们开始学习
什么是面向对象? Java语言 --对比面向过程:代表c语言
面向对象的思想特点是什么?
面向对象的三大特征: 封装继承多态(整个java最重要的)
Java重要特点:代码的健壮性(里面涉及Java面向的对象特征以及java设计模式)

5.1 类和事物的关系

什么是类----代码中体现类

事物:现实世界的真义存在的东西

class Student(} 学生事物 对象?

5.2 面向对象

什么是面向对象? Java语言 —对比 面向过程: 代表 c语言
面向对象的思想特点是什么?
面向对象的三大特征: 封装,继承,多态 (整个java最重要的)
Java重要特点:代码的健壮性(里面涉及Java面向的对象特征以及java设计模式)
面向对象思相特点是什么?

  • 特点:
    1)更符号生活中的思想行为习惯
    2)让复杂的事情简单化
    3)从执行者变成了指挥者
5.2.1 面向对象语言被设计出来的理念

不断的去创建对象,使用对象,指挥对象做事情;

5.2.2 面向对象三大特征
  • 封装,继承,多态 (整个java最重要的)

5.3 什么是类

类是能够描述现实世界事物属性和行为的集合

类和事物的关系:一对应的关系

事物:定现实真实存在的

  • 学生事物
    属性: 姓名,身高,年龄,等等…
    行为:主要目的是学习

Java中规定,需要定义类描述这个事物 ,Java中最基本单元就是类 代码体现 描述哪一个事物 class 类名{
//类名:满足标识符的规范: 见名知意 }

5.3.1 面向对象思想特点

举生活中的例子;

面向对象基于面向过程,面向过程的代表C语言;
举例:
键盘录入三个数据,获取最大值
	1)分析:
	2)创建键盘录入
	3)写比较的逻辑
	4)输出结果...
面向过程:
	我们始终是一个执行者;
	面向对象基于面向过程:
    举例:现实生活中的例子
    买电脑
 面向过程:
	1)了解电脑笔记本的配置
	2)自己要去电脑城,了解, 谈价格
	3)砍价
	4)买完电脑,发现被坑了
面向对象:
	1)了解笔记电脑配置---告诉懂行的朋友
	2)你的朋友买回来
		洗衣服:
			面向过程:
				1)脱下脏衣服
				2)洗衣盆,泡一泡
				3)搓一搓
				4)透一透,拧一拧
				5)晾衣服..
			面向对象:
				1)脱下脏衣服
				2)放在自动洗衣机里面 一键即可
				3)晾衣服...

高斯林:Java之父 "万物皆对象"
5.3.2 面向对象思想特点是什么?

特点:

1)更符号生活中的思想行为习惯
2)让复杂的事情简单化
3)从执行者变成了指挥者

5.4 基本类型作为形式参数和引用数组(数组,类,接口)作为形式参数的特点(重点)

实际需求业务中,数组这种在后期用的不是很多,用的"集合" List,Set,Map(高级集合特 性),支持长度可变的需求;

基本类型作为形式参数,形式参数改变不影响实际参数; 引用类型作为形式参数,形式参数的改变直接影响实际参数;

5.5 类 描述现实世界事物的一组属性和行为,代码体现对某事物的描述以及在对应的主方法中测试;

1)手机有品牌(brand),价格,颜色,内存等属性,
手机可以打电话,发短信,打游戏等行为,
请使用面向对象的方式描述手机并且进行定义一个PhoneTest类,在主方法中测试手机类

public class Phone {
    String brand;//品牌
    double price;//价格
    String color;//颜色
    double size;//内存大小
//定义成员方法打电话
    public void call(){
        System.out.println("给章若楠打电话;");
    }
//定义成员方法拍照片
    public void takePhotos(){
        System.out.println("给章若楠拍风景照;");
    }
    //定义成员方法聊天
    public void chat (){
        System.out.println("和章若楠发消息;");
    }
    //定义测试方法
    public void show(){
        System.out.println("品牌:"+brand+" ,价格:"+price+", 颜色:"+color+", 内存大小:"+size);
    }
}
//测试类
public class PhoneTest {
    public static void main(String[] args) {
        Phone p = new Phone();
        p.brand="华为nova8";//品牌
        p.price=1232;//价格
        p.color="幻影黑";//颜色
        p.size= 8;//内存大小
        p.show();//用来测试的方法
        p.call();//打电话的方法
        p.takePhotos();//拍照的方法
        p.chat();//聊天的方法
    }
}

2)学生有姓名,年龄,性别属性
学生主要行为就是学习,还可以玩游戏,
请使用面向对象的方式描述学生类并且定义一个StudentTest类,在主方法中测试学生类

public class Student {
    String name;//姓名
    int age;//年龄
    String gender;//性别
    String faxing;//发型
    //定义成员方法,,吃饭的行为
    public void eat(){
        System.out.println("吃香辣牛腿加汉堡");
    }
    //定义成员方法,,抽烟的行为
    public void somke(){
        System.out.println("抽华子");
    }
    //定义成员方法,,打游戏的行为
    public void playGame(){
        System.out.println("打穿越火线");
    }
    //定义成员方法,,学习的行为
    public void Java(){
        System.out.println("学习java");
    }
}
//测试学生类
public class StudentTest {
    public static void main(String[] args) {
        //创建学生对象
        Student s= new Student();
        s.name="刘德华";//给学生对象变量提供具体的值
        s.age=19;//年龄
        s.gender="男";//性别
        s.faxing="中风";//发型
        //打印
        System.out.println("名字:"+s.name+", 年龄:"+s.age+", 性别:"+s.gender+", 发型:"+s.faxing);
        s.eat();//调用方法吃饭
        s.somke();//调用抽烟的方法
        s.playGame();//调用打游戏的方法
        s.Java();//调用学习的方法
    }
}

5.6 通过上面的代码,思想 问题—>封装;

5.6.1 private

private作为一种权限修饰符可以修饰类、属性和方法;
用private修饰的类、属性、方法,只能自己使用,别的类是不能访问的,也就是说对于别的类来说是隐藏不可见的,
private一般不修饰类,但是可以修饰内部类。
可以使用private实现封装: 将属性和方法用private封装后表示,被封装的属性与方法只能在本类中使用,类外部不可见。

5.6.2 封装:
  • 就是将显示世界事物的属性隐藏了(加入一个关键字private),
  • 私有的,无法直接访问的,对外数据的安全性!(外界不能访问的)
  • 对外提供一个方法,公共的(public)访问方法(setXXX()/getXXX())
    封装的好处
  1. 提高代码的安全性。

  2. 提高代码的复用性。

  3. “高内聚”:封装细节,便于修改内部代码,提高可维护性。

  4. “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作

5.6.3 注意事项:

以后在书写的代码的时候,写一个类,描述真实存在事物的属性的时候, 需要属性(英文单词字母全部小写)全部加入private

5.6.4 面试题:
  • private关键字的特点?
  • 1)被private修饰的成员变量以及成员方法只能在本类中访问
  • 2)可以修饰成员变量也可以成员方法,就是为了外界不能直接访问
  • 3)被private修饰的成员变量/成员方法可以间接的通过通过的方法访问
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java_houduan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值