• 多态和异常分析课后


    1)编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。 要求程序必须具备足够的健壮性,不管用户输入什 么样的内容,都不会崩溃。

    源代码:

    package test;
    
    import javax.swing.*;
    import java.util.*;
    
    public class Grade
    {
        public static void main(String[] args)
        {
            int n=0;
            while(n!=1)
            {
                try
                {
                    String a = JOptionPane.showInputDialog("请输入成绩");
                    double grade = Double.parseDouble(a);
                    if(grade<0 || grade>100)
                        JOptionPane.showMessageDialog(null, "您输入的不是正确的分数", "提示", JOptionPane.INFORMATION_MESSAGE);
                    else if(grade<60)
                    {
                        JOptionPane.showMessageDialog(null, "不及格", "提示", JOptionPane.INFORMATION_MESSAGE);
                        n=1;
                    }
                    else if(grade>=60 && grade<70)
                    {
                        JOptionPane.showMessageDialog(null, "及格", "提示", JOptionPane.INFORMATION_MESSAGE);
                        n=1;
                    }
                    else if(grade>=70 && grade<80)
                    {
                        JOptionPane.showMessageDialog(null, "中", "提示", JOptionPane.INFORMATION_MESSAGE);
                        n=1;
                    }
                    else if(grade>=80 && grade<90)
                    {
                        JOptionPane.showMessageDialog(null, "良", "提示", JOptionPane.INFORMATION_MESSAGE);
                        n=1;
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null, "优", "提示", JOptionPane.INFORMATION_MESSAGE);
                        n=1;
                    }
                }
                catch(NumberFormatException e)
                {
                    JOptionPane.showMessageDialog(null, "输入不正确", "提示", JOptionPane.INFORMATION_MESSAGE);
                }
            }
            
        }
    }

    2)怎样判断对象是否可以转换?可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:。例子:TestInstanceof.java

     

    3)下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

              m=d;//正确,因为子类对象可以直接赋给基类变量。

              d=m;//错误,基类对象要赋给子类对象变量,必须执行类型转换

              d=(Dog)m;//正确,基类对象要赋给子类对象变量,必须执行类型转换

              d=c;//错误,不同子类之间不能复制

              c=(Cat)m;//m已经转换成DogDogCat之间不能转换

    先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确

    4)请看以下“变态”的类(参看示例ParentChildTest.java

    public class ParentChildTest {

         public static void main(String[] args) {

              Parent parent=new Parent();

              parent.printValue();

              Child child=new Child();

              child.printValue();    

              parent=child;

              parent.printValue(); 

              parent.myValue++;

              parent.printValue();

              ((Child)parent).myValue++;

              parent.printValue();

         }

    }

    回答问题:

    1. 1.   左边的程序运行结果是什么?

    Parent.printValue(),myValue=100

    Child.printValue(),myValue=200

    Child.printValue(),myValue=200

    Child.printValue(),myValue=200

    Child.printValue(),myValue=201

    1. 2.   你如何解释会得到这样的输出?

    第一个创建一个Parent对象,调用的是父类构造方法

    第二个创建一个Child对象,调用的是子类的构造方法

    第三个将子类child的值赋给了parent,调用的是子类的构造方法

    第四个parent.myValue++是对父类中的变量进行自加运算,而parent.printValue()实际上调用的还是子类的构造方法

    第五个((Child)parent).myValue++是将parent对象强制转化成Child,所以指向的是Child类中的变量,进行自加运算之后输出。

    1. 3.   计算机是不会出错的,之所以得 到这样的运行结果也是有原因的,那么从这些运行结果中,你能总 结出Java的哪些语法特性?

    (1)当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

    (2)这个特性实际上就是面向对象“多态”特性的具体表现。

    (3)如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

    (4)如果子类被当作父类使用,则通过子类访问的字段是父类的!

    5)辨析:finally语句块一定会执行吗?

    请通过 SystemExitAndFinally.java示例程序回答上述问题

     finally不一定执行,当try从句或者catch()从句中有System.exit()语句时,finally()不会被执行。

    6)归纳与总结:依据对本讲多个示例程序的分析,请自行归纳总结出Java多层嵌套异常处理的基本流程。

    一、Throwable类有两个直接子类:

    1Exception:出现的问题是可以被捕获的;

    2Error:系统错误,通常由JVM处理。

    可捕获的异常又可以分为两类:

    1check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出

    2runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象

    当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机。当有多层嵌套的finally时,异常在不同的层次抛出,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

    二、try-catch-finally相互嵌套时,先处理最内层的try-catch-finally。当try抛出了与catch匹配的异常,则代码到相应的catch()中执行。如果catch也出现了异常,程序会检测finally中是否有异常,若有,则覆盖。如果只有try-finally,那么先执行finally,如果finally没有异常,则返回处理try中的异常,如果finally有异常,则覆盖try中的异常。

  • 相关阅读:
    41. 缺失的第一个正数
    40. 组合总和 II
    39. 组合总和
    38. 外观数列
    35. 搜索插入位置
    设计模式(1)单例模式
    一篇文章彻底搞懂Java的大Class到底是什么
    Vue实现一个MarkDown编辑器
    7 二分搜索树的原理与Java源码实现
    6 手写Java LinkedHashMap 核心源码
  • 原文地址:https://www.cnblogs.com/kt97458/p/4965204.html
Copyright © 2020-2023  润新知