java上机测试错题回顾(3)

就算是下午一点钟才开始学,也不会怎么样哦。其实一天还有很久,睡多了就睡多了,玩了就玩了,要开始做就赶紧吧别焦虑自责,还有很多事情要做呢,不要慌一件一件做吧!

其实每次前面写一点是为了方便保存草稿和哄自己学...天啊时间不等人,快去!

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!";
    }
}
主要步骤
  1. 继承 Exception 类InvalidScoreException 类继承自 Exception 类,表明它是一个受检查异常。
  2. 存储无效分数:在构造函数中接收无效分数,并将其存储在私有变量 score 中。
  3. 重写 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!";
    }
}

慢慢来,比较快,多实操 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值