JAVA第五六课

一、
1.使用scanner.nextXXX()方法来读取数据,XXX表示数据类型

int num = scanner.nextInt();
double num= scanner.nextDouble();

next是读到空白符就结束了
nextLine是读到换行符就结束了
空白符:空格,换行\n,回车\r,制表\t,翻页\f,垂直制表符
2.如果某个类找不到定义,此时可以尝试使用Alt+enter让IDEA自动查找该类对应的位置,并自动import这个类
3.EOF:文件结束标志
windows上使用 ctrl+z 触发EOF
Linux/mac上使用 ctrl+d 触发EOF
二、猜数字游戏
1.先生成一到一百的随机整数(C中rand)

Random(java.util.Random引出)
Random random = new Random(seed:100);
//一般是默认的
//阅读代码文档注释知道范围是[0,100)
int num = random.nextInt(bound 100)+1;
System.out.println(num);     

2.循环的提示用户输入数字

while(ture){
    
    
      System.out.println("请输入要猜的数字:");
      int num = scanner.nextInt();
      if (num < toGuess){
    
    
           System.out.println("低了");
}else if(num > toGuess){
    
    
           System.out.println("高了");
}else(num = toGuess){
    
    
           System.out.println("猜对了");
           break;
}

seed随机种子
计算机中的随机数都是"伪随机"(给定一个初始值,套入一个数学公式,生成一系列"看起来毫不相关的"数列,看起来像是一个随机数)
真实开发中,生成伪随机数的方式有很多
三、方法
1.方法就是函数(function),函数就是方法(method)
2.本质上就是一段可以被重复使用的代码片段,每个方法一般都是只完成一个工作
eg:计算阶乘和
①不用方法(两个循环)

public class Test {
    
    
    public static void main(String[] args) {
    
    
        int sum = 0;
        
        for (int i = 1; i <= 5; i++) {
    
    
            int tmp = 1;
            for (int j = 1; j <= i; j++) {
    
    
                tmp *= j;
           }
            sum += tmp;
       }
        
        System.out.println("sum = " + sum);
   }
}

②用方法(和函数差不多)

public class Test {
    
    
    public static int fac(int n) {
    
    
        int f = 1;
        
        for (int i = 1; i <= n; i++) {
    
    
            f *= i;
       }
        
        return f;
   }
    
    public static void main(String[] args) {
    
    
       int s = 0;
        
        for (int i = 1; i <= 5; i++) {
    
    
            s += fac(i);
       }
        
        System.out.println("sum = " + s)}
     }

3.形参的作用域只是当前方法内部,形参名字可以随便起
4.方法的调用过程:一旦遇到方法调用的代码,就会跳转到方法内部执行(同时会把实参的值赋给形参),顺序执行方法内部的代码,方法内部遇到return或者方法执行完毕的时候代码就会回到调用位置继续执行,方法内部的代码一定是调用,如果没有去调用代码就不会被执行到
5.在c中,函数的定义如果写到函数调用的上方,此时不必写函数声明.但是如果函数定义在调用下方,或者在其他文件中,此时就需要在调用之前加上声明
这个其实不合理的,Java中没有声明这样的概念
6.方法调用的时候,需要传入实参
7.实际开发中,一般还是先写调用更常见些,复杂的项目开发时,代码中到底有哪些方法,哪个方法是干啥的,在开发之前不一定全都能想清楚(包括该方法参数是啥类型 有几个,返回值是啥类型
如果要是先明确了方法是如何调用的那么对于方法的实现来迎是有大帮助的.

一、方法执行过程分析
1.内存、栈、栈帧
⑴栈
①是一个广义概念,具体指什么,得结合上下文来确定
②数据结构、操作系统、Java/jVM中都有一个栈,互不相干
③栈是JVM中一块儿特殊的内存区域
也是操作系统创建出来的一个Java进程,本来一个程序对于内存的使用都要通过操作系统来进行管理,Java里为了让内存管理更加方便,会在JVM进程启动的时候,直接从操作系统里申请一块内存 自己进行管理
JVM会对申请到的内存区域进一步进行区域划分,其中一块区域就叫栈
④栈里面存的是一些特定的内容,核心就是方法与方法的调用关系
⑤Java中的栈原则上和数据结构中的栈没关系,是两个不同的概念,但是JAVA的栈也遵守“后进先出”的规则
在这里插入图片描述

⑥入栈:调用某个方法
出栈:当某个方法执行结束后,就会把对应信息从栈中删除
每一层栈帧都对应一个方法,栈帧中就包含了该被调用方法的一些信息
〖地址(方法入口在哪),参数,内部局部变量,返回地址(回到哪里继续执行),返回值〗
栈帧(frame)
栈帧中就包含了该被调用的方法的一些信息.
1.该方法的地址是啥.(方法的入口在哪)
2.该方法的参数有哪些.
3.该方法内部的局部变量
4.该方法的返回地址.(回到哪里继续执行)
二、方法重载
1.有时候我们需要用一个函数兼容多种参数的情况,就可以用到方法重载
同一个方法名字,提供不同版本的实现叫做方法重载
2.重载规则
针对同一个类
①方法名相同
②方法的参数不同(参数个数或类型)
③方法返回值类型不影响重载
当两个方法名字相同,参数相同,但返回值不同的时候,不构成重载,并且编译会出错,构成重载的两个方法,得是在同一个作用域中.
3.Java的数组,本质上就是让程序猿能够批量创建一组相同类型的变量
在代码中往往需要用到很多的变量,如果代码简单,涉及到的数据不多,就可以用int a, double b…这些变量来直接表示.
还有很多情况,涉及到的数据很多,总不能写成int a1, int a2…int a1000
通过数组,就可以一下子批量的创建出一大堆的变量来.
C, C++, Java, Go,都要求数组中的变量是相同类型的.往往能让程序在使用数组元素的时候更加高效.
Js, Python,PHP,不要求数组中的变量类型相同.能够让程序更灵活
像C中的 arr这个变量,
int arr[4] = {1,2.3,4}
在C中,int[4]和int[5]是两种不同的类型,也就不能相互赋值
但是Java中没这个问题,不管数组长度如
何,大家都是同一种类型,可以相互赋值
原则上说, int和[]应该是一个整体.共同构成了变量的类型

int[]arr1 = new int[]f1,234};

Java中的arr1这个数组的类型就叫int[]
数组使用两方面操作:
1.获取数组长度
2.获取数组元素
下标从0开始计算,length-1,(Java通过.length 方式获取到数组的长度.一旦数组创建好了之后,此时 length 就是固定的了,无法动态进行修改)使用下标访问的时候,不能超出有效范围.如果超出了有效范围,在Java中会抛出一个数组下标越界异常,要想能抛出异常就意味着每次访问下标的时候,就需要程序耗费额外的时间进行边界检查.会影响到程序效率.
C中的下标越界,是未定义行为.
C++也没有下标检查.
准确说,特定的容器中有检查.大部分没有.

猜你喜欢

转载自blog.csdn.net/WSXHN/article/details/112966720