【爪洼岛冒险记】第4站:Java中如何进行控制台输入输出?用Java实现猜数字小游戏;超详细讲解Java中的方法:方法的重载,方法的签名
🌱博主简介:是瑶瑶子啦,一名大一计科生,目前在努力学习JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛!
📜所属专栏:爪洼岛冒险记【从小白到大佬之路】
✈往期博文回顾:链接: 【爪洼岛冒险记】第3站:任务1:学会int和String之间的转换;任务2:将Java运算符全部收入囊中~ 任务3:拿下Java中的类型提升
🕵️♂️近期目标:成为千粉小博主。
🙇♀️写博客理念:力求用自己的语言加上自己的理解去阐述知识知识、技术。喜欢画图、思维导图去描述过程和知识之间的联系。
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
🌺:“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”
爪洼岛冒险记-第4站
- 🌻上一站快速回顾:
- 任务1:流程控制语句,你需要注意的:
- 任务2:学会Java中的输入&输出
- 2.1:三种输出方式
- 2.2:从键盘输入:
- 2.2.1:如何从键盘中读入一个基本数据类型数据?
- 2.2.2:如何从键盘输入一个字符串?
- 2.2.3:如何进行多组输入&输出?
- 任务3:实现猜数字小游戏
- 3.1:Java中如何生成随机数?
- 3.2:获取随机数:
- 3.3:总结:
- 3.4:代码实现:
- 任务4:学会Java中的方法
- 4.1什么是Java中的方法?
- 4.2Java中方法的定义方式:
- 4.3方法使用的注意事项:
- 4.4函数是如何开辟内存的?
- 🌟4.5方法的重载(overload):
- 4.5.1什么是重载:
- 4.5.2什么是方法的签名(method signature)
- 4.5.3重载的规则:
🌻上一站快速回顾:
🤹♀️上一站中,我们重点讲解了Java中的运算符,类型提升.,这里我们向自己提几个问题,快速回顾一下:
- Java的除法运算符需要注意的是?
- Java中取模运算(a%b),结果的正负取决于?
- Java中哪个运算符进行了强制类型转换?
话不多说,咱们赶紧迎接Java岛上的无穷知识把!
🌴本站任务:
🙆♀️write int the front:
🥫🎊
- 不可忽视的流程控制小细节!
- Java中如何进行控制台的输入&输出?
- 用Java写个小游戏!–猜数字小游戏
- 什么是方法?(method)
任务1:流程控制语句,你需要注意的:
- Java中”
表达式
“的值为布尔类型(和C不一样,C中表达式的值是数字类型)
eg:这里while的判断部分不能直接写while( c ),因为c不是boolean类型,(在C语言中,这是是可以的。)
//求两个整数的最大公约数
public static void main(String[] args) {
int a=24;
int b=18;
int c=a%b;
while(c!=0){//不能写成:while (c)
a=b;
b=c;
c=a%b;
}
System.out.println("最大公约数是:"+b);
}
- do-while循环的while后面不要忘带分号!
do{
expr1;
...
}while();
-
else总是和它前面最近的那个没有匹配的if进行匹配
-
switch-case
语句,switch()括号中的内容:
1:不能为复杂表达式
2:不能为long,float,double,boolean类型. -
break
只能跳出一层循环–离break最近的那层循环 -
goto
是Java中的保留字(起用了最好不要使用,不然跳来跳去的,不易阅读和调试)
任务2:学会Java中的输入&输出
2.1:三种输出方式
System.out.println("输出且换行");
System.out.print("输出不换行");
System.out.printf("%format",arg);//(基本不用)//格式化输出,相当于C中的printf
2.2:从键盘输入:
- 🍃前提:导入Java.util.Scanner包
import java.util.Scanner;
1,可以先理解为这个叫做Scanner的”包裹“(其实就是一个类文件)里面,有我们下面要用到的东西。
2,🌟对于Java中的点” . "理解为“ 的 ”;
2.2.1:如何从键盘中读入一个基本数据类型数据?
- eg:读入一个int类型数据
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt;//从键盘读入1个int类型数据,并用变量n来接受
System.out.println(n);
- 相应的,修改nextInt就可以读取其他类型数据:
2.2.2:如何从键盘输入一个字符串?
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println(str);
- 💁♀️为什么不建议用
next()
?
因为遇到空格,则读取结束。
public class TestDemo {
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
String str = scaner.next();
System.out.println(str);
}
}
- 🤦♀️注意事项:
尽量不要在输入其他数据类型之后,再输入字符串。(但是OJ做题的话无所谓),因为字符串会读取输入上一个数据在输入缓冲区
遗留下来的\n.
2.2.3:如何进行多组输入&输出?
- eg:多组输入int类型数据:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int a = scanner.nextInt();
System.out.println(a);
}
}
- 👩🏫相应的,将hasNextInt和nextInt做出相应的改变,即可多组读取其他类型数据:
任务3:实现猜数字小游戏
3.1:Java中如何生成随机数?
- 使用
java.util
包中的Random
类:
import java.util.Random
- 创建一个随机数"生成器"(2种方式:):
JavaAPI文档中是这么描述的:“该类的实例用来生成随机数的流”
//方式1:单纯创建一个随机数生成器
Random random = new Random();
//方式2:创建随机数生成器,并且设定随机数种子(seed)
Random random = new Random(88);
//88为随机数种子。
3.2:获取随机数:
eg:获取[0,100)
的随机数
int rand = random.nextInt(100);
eg:获取[50,100)
的随机数:
int rand = random.nextInt(50)+50;
1.如何理解“随机数的流”?
👩🏫其实就是一个随机数序列!
2.如何理解“随机数种子”-seed?
🙆♀️“种瓜得瓜,种豆得豆”,有什么样的种子,就有什么样的序列。一旦这个种子确定了,那么这个随机数流里面的每一个数字都是确定的!
3.3:总结:
- 利用
Random()
生成随机数,每一次生成的随机数流(随机数序列)都是不同。 - 利用
Random(long seed)
生成随机数,seed确定,每一次生成的随机数流都相同。
3.4:代码实现:
public static void main(String[] args) {
//生成随机数
Random random=new Random();
int rand= random.nextInt(100);//[0,100)
Scanner scanner=new Scanner(System.in);
while(true){
System.out.println("请入你想要猜的数字:");
int num=scanner.nextInt();
if(num==rand){
System.out.println("恭喜你,猜对了");
break;
}
else if(num>rand){
System.out.println("猜大了");
}
else{
System.out.println("猜小了");
}
}
任务4:学会Java中的方法
4.1什么是Java中的方法?
💁♀️方法,其实就是功能,再简单来说,就是一块可以被重复利用的代码块!相当于C语言中的函数。
- 方法存在的意义:
1:模块化组织代码
2:提高代码的复用性,简洁性(调用现有method开发,不必重复造轮子)
3:提高代码的可阅读性
4.2Java中方法的定义方式:
修饰限定符 返回值类型 函数名(参数列表){
功能实现
}
//eg:
public static int add (int x,int y){
return x+y;
}
4.3方法使用的注意事项:
- 传参时,实参和形参的类型一定要匹配.
- Java中没有所谓先声明,后定义(定义就是声明)。即,被调用方法也可在调用方法之后存在。
- 方法的定义必须在类之中
4.4函数是如何开辟内存的?
- 什么是栈.
- 这里的栈,指的是是计算机内存中的一块存储区域–栈区.
- 栈的特点?:–先进后出
- 正是这种先进后出的方式,和函数调用的过程完全一致:主函数调用被调函数,只有当被调函数执行完(遇到return语句)–即这个函数出栈,才能继续执行主函数。
- 正是这种先进后出的方式,和函数调用的过程完全一致:主函数调用被调函数,只有当被调函数执行完(遇到return语句)–即这个函数出栈,才能继续执行主函数。
- 🔥注意!!!:在Java当中取不到栈上所存变量的地址,也就是说,想通过取栈上变量地址,来进行地址传参从而修改局部变量的值,是做不到的。
🌟4.5方法的重载(overload):
4.5.1什么是重载:
oracle官网上,JDK8标准手册手册是这样说的:If two methods of a class (whether both declared in the same class, or both inherited by a class, or one declared and one inherited) have the same name but signatures that are not override-equivalent, then the method name is said to be overloaded.
如果两个方法(无论这个两个方法是在同一个类中声明,或者这两个方法都被一个子类继承,或者一个方法在父类中声明,另外一个方法在子类中声明)具有同一个名字,但是签名不是重写等价的(一样的),那么这个方法的名字可以说
👩🏫因为还没有讲到类和对象,可以简单理解为:
- 同"一个方法"(方法名相同的,我们抽象起来认为是一个方法),但是有不同版本的实现,这就叫做方法的重载or重写。(方法名只有1个,但方法有多个,具体的每一个方法都是不同的)
🤷♀️如何理解:
这里的”方法相同“,在语言上体现,就是函数名相同,比如,计算2个小数的和,这是加法;计算2个长整型的和,也是加法。那么我们只需要写一个方法add,然后通过去改变返回值(只改变返回值,不是重写)和参数列表还有具体实现方法实现的代码,来重载这个方法,即让看似好像在用add这1个方法,实际上它有不同的版本(add的重写)–比如:既可以做整数相加,又可做小数相加。
(但是调用方法时,编译器不是根据函数名来调用函数的,而是根据函数签名!这个我们稍后讲)
🤽♀️具体例子:
//计算2个int类型数据相加
public static int add(int a,int b){
return a+b;
}
//计算2个double类型数据相加
public static double add(double a,double b){
return a+b;
}
//计算3个int类型数据相加
public static int add(int a,int b,int c){
return a+b+c;
}
public static void main(String[] args) {
System.out.println(add(1,2,3));
}
🔔注意:一些博文里说“重载是同一个类中的…"这种方法是错误的,也可以在两个不同类中!
class Point {
int x = 0, y = 0;
void move(int dx, int dy) { x += dx; y += dy; }
int color;
}
class RealPoint extends Point {
float x = 0.0f, y = 0.0f;
void move(int dx, int dy) { move((float)dx, (float)dy); }
void move(float dx, float dy) { x += dx; y += dy; }
}
“Here, the class RealPoint hides the declarations of the int instance variables x and y of class Point with its own float instance variables x and y, and overrides the method move of class Point with its own move method. It also overloads the name move with another method with a different signature”
简而言之就是说RealPoint类继承了Point类(并重写了Point类中move方法),RealPoint类中的的move方法就是重载的Point类中的move方法,而这两个方法可以看到并不在一个类中。所以:方法之间的重载,可以发生在两个类中(只要两个类是继承关系即可)
4.5.2什么是方法的签名(method signature)
- 首先,编译器是根据方法的签名,来判断方法是否相同。即方法签名是用来区分不同方法的标识符.它包括两部分:(不包括修饰符和返回值!!!)
1:方法名
2:参数列表 - 当我们调用一个方法时,如果已存在多个同名方法,Java会根据所传参数的类型,和个数(即参数列表),去自动匹配到方法签名符合的那个方法去调用。
4.5.3重载的规则:
- 方法名相同
- 方法的参数列表不同(参数个数&参数类型)
- 方法返回值的类型是否相同,并不影响函数的重载
这两个方法的签名是一样的,所以不是函数的重载!
public static double add(int x,int y){
return (double)(x+y);
}
public static int add(int x,int y){
return x+y;
}
🏄♀️下期预告–超详细讲解Java中的数组
🙆♀️专栏系列文章:
- 【爪洼岛冒险记】第3站:任务1:学会int和String之间的转换;任务2:将Java运算符全部收入囊中~ 任务3:拿下Java中的类型提升
- 【爪洼岛冒险记】第2站:带你学会:Java中三种输出语句,java中基本数据类型,学会变量,常量,类型转换知识点
- 【爪洼岛冒险记】第1站:Java重要特性,JDK,JRE,JVM区别和联系,环境变量
🙈原创不易,如果对你有所帮助,还请三连+关注!我是瑶瑶子,持续输出优质文章!