就算是下午一点钟才开始学,也不会怎么样哦。其实一天还有很久,睡多了就睡多了,玩了就玩了,要开始做就赶紧吧别焦虑自责,还有很多事情要做呢,不要慌一件一件做吧!
其实每次前面写一点是为了方便保存草稿和哄自己学...天啊时间不等人,快去!
1 GeometricObject g是什么意思?Circle circle = (Circle) g是什么意思?
package PTA_training.Test2_7;
/*
7-7 多态练习-计算面积
定义三个类,父类(抽象类)GeometricObject代表几何形状,
子类Circle代表圆形,子类Rectangle代表矩形。
具体属性和方法如下:
父类 (抽象类)GeometricObject
属性:
private String color;
private String name;
为上述变量提供getter()和setter()方法
构造方法:为color和name初始化
public GeometricObject(String color, String name)
抽象方法:
public void findArea();用于计算几何图形的面积
子类:
Circle
属性:
private double radius;半径
为上述变量提供getter()和setter()方法
构造方法:
设计构造方法为圆形的name,color和radius初始化
方法:
实现findArea()方法用于计算圆形的面积并返回计算结果
子类:
Rectangle
属性:
private double width;宽
private double height;高
为上述变量提供getter()和setter()方法
构造方法:
设计构造方法为圆形的name,color,width和height初始化
方法:
实现findArea()方法用于计算矩形的面积并返回计算结果
测试类Main
方法:
public static void main(String[] args) {
创建圆形对象("长方形","蓝色",3.2,4.5)
输出圆形的颜色和面积
创建矩形对象("圆形","红色",3.4)
输出矩形的颜色和面积
}
public static void show(GeometricObject g){
//形参传入圆形或者矩形的对象,输出其面积
//判断传入的对象是圆形还是矩形
//如果是圆形就输出圆形的颜色和面积;
//如果是矩形就输出矩形的颜色和面积;
}
注意:1.所有类不用修饰词
2.测试类名称为“Main”,否则编译出错
在这里给出一组输入。例如:
输出样例:
在这里给出相应的输出。例如:
矩形的颜色是:蓝色,面积是:14.4
圆形的颜色是:红色,圆形的面积是:36.31681107549801
*/
public class Main {
public static void main(String[] args) {
// 创建矩形对象
Rectangle rectangle = new Rectangle("蓝色", "长方形", 3.2, 4.5);
// 输出矩形的颜色和面积
show(rectangle);
// 创建圆形对象
Circle circle = new Circle("红色", "圆形", 3.4);
// 输出圆形的颜色和面积
show(circle);
}
public static void show(GeometricObject g) {
// 判断传入的对象是圆形还是矩形
if (g instanceof Circle) {
Circle circle = (Circle) g;
System.out.printf("圆形的颜色是:%s,圆形的面积是:%.12f\n", circle.getColor(), circle.findArea());
} else if (g instanceof Rectangle) {
Rectangle rectangle = (Rectangle) g;
System.out.printf("矩形的颜色是:%s,面积是:%.1f\n", rectangle.getColor(), rectangle.findArea());
}
}
}
GeometricObject g
是什么意思
在 public static void show(GeometricObject g)
这个方法定义中,GeometricObject g
是方法的参数声明。下面详细解释:
-
GeometricObject
:这是参数的数据类型。GeometricObject
是一个抽象类,代表几何形状。这意味着该参数可以接收任何GeometricObject
类型的对象,或者是GeometricObject
子类的对象。因为在 Java 中,子类对象可以赋值给父类类型的引用变量,这是多态的一种体现。 -
g
:这是参数的名称,是一个引用变量,用于在方法内部引用传入的对象。在方法show
中,你可以使用g
来访问该对象的属性和方法。
Circle circle = (Circle) g
是什么意思
Circle circle = (Circle) g
是一个类型转换操作,下面详细解释:
-
(Circle)
:这是强制类型转换运算符。它告诉编译器将g
引用的对象当作Circle
类型来处理。因为g
是GeometricObject
类型的引用,它可能指向一个Circle
对象,也可能指向一个Rectangle
对象(因为Circle
和Rectangle
都是GeometricObject
的子类)。当你确定g
实际上指向一个Circle
对象时,就可以使用强制类型转换将其转换为Circle
类型。 -
Circle circle
:这是声明一个Circle
类型的引用变量circle
。 -
g
:是之前传入方法的GeometricObject
类型的引用变量。
示例代码解释
在你的 show
方法中,使用了类型判断和强制类型转换来处理不同的子类对象:
public static void show(GeometricObject g) {
// 判断传入的对象是圆形还是矩形
if (g instanceof Circle) {
Circle circle = (Circle) g;
System.out.printf("圆形的颜色是:%s,圆形的面积是:%.12f\n", circle.getColor(), circle.findArea());
} else if (g instanceof Rectangle) {
Rectangle rectangle = (Rectangle) g;
System.out.printf("矩形的颜色是:%s,面积是:%.1f\n", rectangle.getColor(), rectangle.findArea());
}
}
在这个方法中,首先使用 instanceof
运算符检查 g
引用的对象是否是 Circle
类型。如果是,则将 g
强制转换为 Circle
类型,并赋值给 circle
变量,然后就可以使用 circle
变量来调用 Circle
类特有的方法和属性。同样,如果 g
引用的对象是 Rectangle
类型,则将其强制转换为 Rectangle
类型,并进行相应的操作。
需要注意的是,如果 g
实际上不是 Circle
类型的对象,而你进行了 (Circle) g
这样的强制类型转换,会在运行时抛出 ClassCastException
异常。因此,在进行强制类型转换之前,通常需要使用 instanceof
进行类型检查。
2 与流相关的类
一些属于流相关的类,处理数据的输入输出操作:
BufferedWriter:是字符输出流类,继承自Writer,用于高效地将字符数据写入目的地,比如文件等,通过缓冲机制减少实际的I/O操作次数。
FileInputStream :属于字节输入流类,继承自InputStream,主要功能是从文件中按字节读取数据,适用于读取各种类型文件的原始字节内容。
ObjectInputStream:是对象输入流类,继承自InputStream,用于从输入流中反序列化对象,在实现对象持久化、网络传输对象等场景中使用。
InputStreamReader:是字符输入流类,作为字节流到字符流的桥梁,继承自Reader,可将字节流按照指定字符编码转换为字符流来读取数据。
3 字节流、字符流、以及类层次
做一个区分,例如 “java语言”,在字节流里面是8个字节,在字符流里面是6个字节
字节流
介绍:以字节(byte,1 字节 = 8 位)为基本处理单元的流。用于处理二进制数据,像图片、音频、视频等非文本类型的数据,以及不关注字符编码时对文本文件的读取 ,能处理所有类型数据。字节流操作时需手动进行编码转换。
- 类层次 :
- 字节输入流:基类是抽象类
InputStream
。常见子类有:ObjectInputStream
:用于反序列化对象 。DataInputStream
:能以与机器无关方式读取基本 Java 数据类型 。BufferedInputStream
:为其他输入流添加缓冲功能,提高读取效率 。ByteArrayInputStream
:从字节数组读取数据 。FileInputStream
:从文件读取字节数据 。- 字节输出流:基类是抽象类
OutputStream
。常见子类有:FileOutputStream
:向文件写入字节数据 。ByteArrayOutputStream
:向字节数组写入数据 。BufferedOutputStream
:为其他输出流添加缓冲功能 。DataOutputStream
:能以与机器无关方式写入基本 Java 数据类型 。ObjectOutputStream
:用于序列化对象并写入输出流 。
字符流
介绍:以 16 位的 Unicode 码表示的字符为基本处理单元的流,专门用于处理文本数据。读取数据时会按 JVM 默认编码自动将字节转换为字符,处理纯文本数据更方便,在处理多语言文本时很有用 。
- 类层次 :
- 字符输入流:基类是抽象类
Reader
。常见子类有:StringReader
:从字符串读取数据 。CharArrayReader
:从字符数组读取数据 。BufferedReader
:为字符输入流提供缓冲,提高读取效率,有readLine()
方法按行读取 。FileReader
:用于从文本文件读取字符数据 。InputStreamReader
:作为字节流到字符流的桥梁,可指定字符编码将字节流转换为字符流 。- 字符输出流:基类是抽象类
Writer
。常见子类有:OutputStreamWriter
:字符流到字节流的桥梁,可指定字符编码将字符流转换为字节流 。FileWriter
:用于向文本文件写入字符数据 。BufferedWriter
:为字符输出流提供缓冲,提高写入效率,有newLine()
方法写换行符 。CharArrayWriter
:向字符数组写入数据 。StringWriter
:向字符串写入数据 。
4 自定义异常类要创建类,extends
// 自定义异常类
class InvalidScoreException extends Exception {
// 构造方法和 toString 方法
}
该文件定义了一个自定义异常类 InvalidScoreException
,用于处理输入成绩无效的情况。
详细代码分析
java
package PTA_training.Test3_3;
public class InvalidScoreException extends Exception {
private int score;
public InvalidScoreException(int score) {
this.score = score;
}
@Override
public String toString() {
return score + "invalid!";
}
}
主要步骤
- 继承
Exception
类:InvalidScoreException
类继承自Exception
类,表明它是一个受检查异常。 - 存储无效分数:在构造函数中接收无效分数,并将其存储在私有变量
score
中。 - 重写
toString()
方法:返回一个包含无效分数的字符串,用于在异常发生时输出错误信息。
5 对比
原来错误百出的代码,甚至没有自定义异常类
package PTA_training.Test3_3;
import java.util.Scanner;
/*
7-3 成绩录入时的及格与不及格人数统计
编写一个程序进行一个班某门课程成绩的录入,
能够控制录入成绩总人数,
对录入成绩统计其及格人数和不及格人数。
设计一个异常类,当输入的成绩小0分或大于100分时,抛出该异常类对象,
程序将捕捉这个异常对象,
并调用执行该异常类对象的toString()方法,
该方法获取当前无效分数值,
并返回一个此分数无效的字符串。
输入格式:
从键盘中输入学生人数n
从键盘中输入第1个学生的成绩
从键盘中输入第2个学生的成绩
...
从键盘中输入第n个学生的成绩
(注:当输入的成绩无效时(即分数为小于0或大于100)可重新输入,且输出端会输出此分数无效的提醒。)
输出格式:
显示及格总人数
显示不及格总人数
输入样例:
在这里给出一组输入。例如:
3
100
30
60
输出样例:
在这里给出相应的输出。例如:
2
1
输入样例:
在这里给出一组输入。例如:
2
200
69
30
输出样例:
在这里给出相应的输出。例如:
200invalid!
1
1
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int []scores = new int[]{scanner.nextInt()};
int a = 0;
for (int i = 0; i < n; i++) {
try{
boolean b = scores[i] > 0 && scores[i] < 100;
} catch (Exception e) {
System.out.println(scores[i]+"invalid");
throw new RuntimeException(e);
}
if (scores[i] >= 60)
a++;
}
System.out.println(a);
System.out.println(n-a);
scanner.close();
}
}
现在写的:
package PTA_training.Test3_3;
import java.nio.InvalidMarkException;
import java.util.Scanner;
/*
7-3 成绩录入时的及格与不及格人数统计
编写一个程序进行一个班某门课程成绩的录入,
能够控制录入成绩总人数,
对录入成绩统计其及格人数和不及格人数。
设计一个异常类,当输入的成绩小0分或大于100分时,抛出该异常类对象,
程序将捕捉这个异常对象,
并调用执行该异常类对象的toString()方法,
该方法获取当前无效分数值,
并返回一个此分数无效的字符串。
输入格式:
从键盘中输入学生人数n
从键盘中输入第1个学生的成绩
从键盘中输入第2个学生的成绩
...
从键盘中输入第n个学生的成绩
(注:当输入的成绩无效时(即分数为小于0或大于100)可重新输入,且输出端会输出此分数无效的提醒。)
输出格式:
显示及格总人数
显示不及格总人数
输入样例:
在这里给出一组输入。例如:
3
100
30
60
输出样例:
在这里给出相应的输出。例如:
2
1
输入样例:
在这里给出一组输入。例如:
2
200
69
30
输出样例:
在这里给出相应的输出。例如:
200invalid!
1
1
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] scores = new int[n];
int a = 0;
int b = 0;
for (int i = 0; i < scores.length; i++) {
while (true) {
try {
scores[i] = scanner.nextInt();
if (scores[i] > 100 || scores[i] < 0)
throw new InvalidScoreException(scores[i]);
break;
} catch (InvalidScoreException e) {
throw new RuntimeException(e.toString());
}
}
if (scores[i] >= 60)
a++;
else
b++;
}
scanner.close();
System.out.println(a);
System.out.println(b);
}
}
package PTA_training.Test3_3;
public class InvalidScoreException extends Exception {
private int score;
public InvalidScoreException(int score) {
this.score = score;
}
@Override
public String toString() {
return score + "invalid!";
}
}
慢慢来,比较快,多实操