书写Java时的常见问题
第一条:从键盘接受用户输入时
第一条第一则:
1.1.1 没有指定的接收 名 时
提示语句和定义的用户从键盘输入的语句,这二者的顺序对我们代码的运行没有很大明显的印象的,现阶段我们可以不用考虑这二者的顺序,当然,知道原理的情况的下,采用规定的顺序更好
比如:
System.out.print("请输入需要产生的二维数组之二维随机数:");
Scanner MyScannerOne = new Scanner(System.in);
1.1.2 指定接受名接收
在这种情况下,我们有必要规避一个很大的错误写法,那就是将提示语句写在了接受名的下方
比如:
byte num = MyScannerOne.nextByte();
System.out.print("请输入需要产生的二维数组之二维随机数:")
这种情况是需要规避的,很影响我们在客户端的输入问题,造成了没有提示语句就需要输入,此刻,在我们不知情的情况下,会对客户端产生很大程度的影响,其次,当我们输入语句是,这是,提示语句就会出来,我们需要在输入一次,就目前情况而言,很影响我们的持续
如果我们规避的上面的一条,我们对顺序就目前而言不做明确的要求,但是呢,定义语句和接收语句的顺序我们应该不会乱,除非你抬杠
我们举一例主编建议的顺序写法
System.out.print("请输入需要产生的二维数组之二维随机数:");
Scanner MyScannerOne = new Scanner(System.in);
byte num = MyScannerOne.nextByte();
本质
本质是将接收的数给他(MyScannerOne.nextByte()),至于他(MyScannerOne.nextByte())又将数(地址)赋给谁,我们不就关系,要做的就是保证他(MyScannerOne.nextByte())以及他(MyScannerOne.nextByte())将数(地址)赋给谁在提示语句的后面
第一条第二则:
2.1 我们在定义从键盘接收客户端的指令时,我们只需要定义一次,在后续当中,我们写了多少个 MyScannerOne.nextByte() (byte可以为任意类型),就有多少个接收指令,类型可以重复多次
2.2 String temp = MyScannerOne.nextLine(); 当我们执行此条语句时,此条语句有个缓冲,我们知道, MyScannerOne.nextLine();
是从键盘接收客户端指令的,可以直接使用,但是,当我们执行 String temp = MyScannerOne.nextLine();
时,需要将 MyScannerOne.nextLine();
接收到的值赋给temp,这就形成了一个缓冲,可以解决我们的很多问题,最主要的是当我们同时输出多条提示语句时,我们又想单独根据提示语句赋值,此时,我们就可以使用这个缓冲
2.3 例如:
System.out.print("请输入书籍名字:");
Scanner MyScannerOne = new Scanner(System.in);
String temp = MyScannerOne.nextLine();
System.out.print("请输入书籍价格:");
Book book = new Book(temp, MyScannerOne.nextShort());
**如果没有缓冲,提示语句会提示输出,对我们造成困扰**
第二条第一则
二维数组之给一维数组单独开空间
以 byte 类型为例
我们都,给二维数组开空间有一下三种简单的方法
- 语法: 类型[][] 数组名=new 类型[大小][大小] 比如: byte a[][]=new int[2][3]
- 先声明:类型 数组名[][]; 再定义(开辟空间) 数组名 = new 类型[大小][大小] 赋值(有默认值,比如 int 类型的就是 0) 比如: byte arr[][]; //声明二维数组 arr = new byte[2][3];//再开空间
- 定义 类型 数组名[][] = {{值 1,值 2…},{值 1,值 2…},{值 1,值 2…}} 使用即可 [ 固定方式访问 ] 比如: byte[][] arr = {{1,1,1}, {8,8,9}, {100}};
- 二维数组的声明方式有: int[][] y 或者 int[] y[] 或者 int y[][]
- 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。
我们知道
二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。
故,我们可以单独给每一阶段的一维数组开空间,以保证数组看见不浪费,我们够用的情况
我们先展示正确的单独开空的示例
arr[i] = new double[MyScannerTwo.nextByte()];
初学者常犯的错误示例
这样子写,虽然在写的过程中不会报错,编译阶段也不会说是他的错,但是程序无法执行下去,需注意
arr = new double[i][MyScannerTwo.nextByte()];
第三条第一则
Java接收字符串
1.首先创建一个 Scanner 实例对象
2.我们可以调用的Scanner类的next()方法来获取输入的字符串。
3.查看结果你会发现,next()方法只能读取第一个空格前的一个段字符串。所以使用这个方法,你输入的数据不能有空格。
4.另外接收字符串,一般使用nextLine()方法。
5.查看下面的运行输出结果。发现nextLine(),一次性读取一行数据.
6.当然接收字符串还可以使用BufferedReader类来接收。 然后调用它的readLine()方法来获得字符串
Java实现接受一个字符
java不像c语言一样,有自己的对应从键盘接受单个字符的能力,java为什么只能接受字符串,而单个字符的能力却没有呢?
java接受单个字符的方法如下
1.先导入java工具包
import java.util.Scanner;
2.创建一个输入类(从键盘接收)
Scanner scanner = new Scanner(System.in);
3.接收一个字符串
String s = scan.next();
4.利用chatAt截取第一个字符
char c = s.charAt(0);
5.关闭输入io流
scanner.close; //关闭输入io流
6.输出字符
System.out.println("获取的的第一字符"+c);
第四条第一则
在 Java 中,当我们遇到需要输入 π 时,我们发现系统并不认识 π,所以,我们这时被迫就输出了 3.14,但是,Java时非常强大的,我们可以输入 Math 中 PI,就可以解决我们的这个问题
比如
圆的周长
(Math.PI * this.Radius * this.Radius)
圆的面积
(2 * this.Radius * Math.PI)
第五章第一则
vs code Java运行问题:Build failed, do you want to continue?
这是因为:
因为vscode构建将编译项目中的所有java文件,所以,应该是你的其他java文件存在一些问题,所以无法通过编译,但是这个你选择的java文件可以通过编译,所以如果你继续,它仍然可以工作.可以通过将其他java文件里面的错误都改正,再进行编译时,就不会再出现这个弹窗了。
我们可以选择是(当前问价)也可以可以通过将其他java文件里面的错误都改正
第五条第一则
Scanner MyScanner = new Scanner(System.in);
强调:只能在当前类中使用,需要注意
Array对数组进行排序
第六章第一则
关于 this 和 super 的区别
this
1.this调用属性 总结: 在构造器和方法中我们可以直接调用属性,往往会省略“this.”,但是当局部变量名和属性名一样的时候 必须使用“this.”来区分和属性和局部变量
2.this调用方法 在同一个类中,方法之间可以相互调用,在调用的时候可以省略“this.”。
3.this调用构造器 格式:this(形参列表) 作用:调用本类中的其他构造器
关键字:this
用来表示当前对象
可以用来调用属性、方法和构造器
一、this调用属性
总结: 在构造器和方法中我们可以直接调用属性,往往会省略“this.”,但是当局部变量名和属性名一样的时候
必须使用“this.”来区分和属性和局部变量
二、this调用方法
在同一个类中,方法之间可以相互调用,在调用的时候可以省略“this.”。
三、this调用构造器
格式:this(形参列表) 作用:调用本类中的其他构造器 注意: 1、this(形参列表)必须在构造器的首行 2、在同一个构造器中最多只能用一个this(形参列表)调用其他构造器 3、如果有n个构造器,那么最多能有n-1个this(形参列表)
super
super 用于在不同的包中调用构造器
super:可以用来修饰属性,方法,构造器
1、当子类与父类有同名的属性时,可以通过super。属性的方式调用父类中生命的属性。
2、当子类重写父类的方法后,在子类中若想调用父类中被重写的方法时,需用super.的方法
3、super修饰构造器,通过在子类中使用super列表参数的形式调用父类中制定的构造器
a、在构造器内部,super(参数列表)必须声明在首行
b、在构造器内部,this(参数列表)或super(参数列表)只能出现一个
c、当构造器中不显示的调用this(参数列表)或super(参数列表)默认调用父类中的空参 构造器
super只在子类中出现 - - - 语法如下
super有三种用法
【1】 super.xxx; xxx可以是类的属性。 例如super.name;即从子类中获取父类name属性的值
【2】 super.xxx(); xxx()可以是类中的方法名。 super.xxx();的意义是直接访问父类中的xxx()方法并调用
【3】 super(); 此方法意义是直接调用父类的构造函数。
super(无参/有参)即调用父类中的某个构造方法,括号里的内容根据你所调用的某个构造函数的变化而改变
与this对比:
this :本身调用者这个对象
super: 代表父类对象的应用
前提:
this:没有继承也可以使用
super: 只能在继承条件才可以使用
构造方法:
this (): 本类的构造
super(): 父类的构造
一张图解决很多文字,如下:
OK,本期内容就分享到这里,后续有关一些需要写在本篇文章中的我会继续更近,有些细节不需要在本篇文章我会放在当前文章,感谢大家的支持