zoukankan      html  css  js  c++  java
  • JAVA多态与异常处理课后作业

    1.运行以下代码.

    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();

    }
    }

    class Parent{
    public int myValue=100;
    public void printValue() {
    System.out.println("Parent.printValue(),myValue="+myValue);
    }
    }
    class Child extends Parent{
    public int myValue=200;
    public void printValue() {
    System.out.println("Child.printValue(),myValue="+myValue);
    }
    }

    a)左边的程序运行结果是什么?

    Parent.printValue( ).myValue=100

    Child.printValue( ).myValue=200

    Child.printValue( ).myValue=200

    Child.printValue( ).myValue=200

    Child.printValue( ).myValue=201

    b)你如何解释会得到这样的输出?

    第一个父类分配了空间,调用自己的构造方法,输出;第二个子类分配了空间,调用自己的构造方法,输出;第三个子类赋值给父类,当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象,由于对象是子类,父类调用的是子类的方法,输出子类的值;

    第四个parent.myValue++是对父类中的变量进行自加运算,而parent.printValue()实际上调用的还是子类的构造方法;第五个((Child)parent).myValue++是将parent对象强制转化成Child,所以指向的是Child类中的变量,进行自加运算之后输出

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

    请务必动脑总结,然后修改或编写一些代码进行测试,验证自己的想法,最后再看 后面的PPT给出的结论。

    当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。如果子类与父类有相同的的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段,而不是父类中的字段。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。如果子类被当作父类使用,则通过子类访问的字段是父类的。

    修改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();

    ((Child)parent).myValue++;

    parent.printValue();

    parent.myValue++;

    parent.printValue();

    }

    }

    class Parent{

    public int myValue=200;

    public void printValue() {

    System.out.println("Parent.printValue(),myValue="+myValue);

    }

    }

    class Child extends Parent{

    public int myValue=300;

    public void printValue() {

    System.out.println("Child.printValue(),myValue="+myValue);

    }

    }

    2.动手动脑:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识

    import javax.swing.*;

    class AboutException {  

      public static void main(String[] a)  

      {    

       int i=1, j=0, k;      

       k=i/j;

      try

     {   

      k = i/j;    // Causes division-by-zero exception  

     //throw new Exception("Hello.Exception!");  }    

    catch ( ArithmeticException e)

     {   

    System.out.println("被0除.  "+ e.getMessage());

     }  

     catch (Exception e)

     {

      if (e instanceof ArithmeticException)  

      System.out.println("被0除");   

    else { 

       System.out.println(e.getMessage());    

      }  

    }

    finally
         {
           JOptionPane.showConfirmDialog(null,"OK");
         }
      
      }
    }

    catch语句块中的代码用于处理错误。当异常发生时,程序控制流程由try语句块跳转到catch语句块。不管是否有异常发生,finally语句块中的语句始终保证被执行。

    可以有多个catch语句块,每个代码块捕获一种异常。在某个try块后有两个不同的catch 块捕获两个相同类型的异常是语法错误。

    使用catch语句,只能捕获Exception类及其子类的对象。因此,一个捕获Exception对象的catch语句块可以捕获所有“可捕获”的异常。

    将catch(Exception e)放在别的catch块前面会使这些catch块都不执行,因此Java不会编译这个程序。

    3.动手动脑:多层的异常捕获-1,阅读以下代码(CatchWho.java),写出程序运行结果:

    运行结果:

    ArrayIndexOutOfBoundsException/内层try-catch

    发生ArithmeticException

    4.动手动脑:多层的异常捕获-2,写出CatchWho2.java程序运行的结果

    ArrayIndexOutOfBoundsException/外层try-catch

    5.请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。

    运行结果如下

    当有多层嵌套的finally时,异常在不同的层次抛出 ,在不同的位置抛出,可能会导致不同的finally语句块执行顺序。

    6.辨析:finally语句块一定会执行吗?

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

    public class SystemExitAndFinally {

        public static void main(String[] args)  {

     try{

                 System.out.println("in main");           

               throw new Exception("Exception is thrown in main");                    //System.exit(0);

               }       

    catch(Exception e)        

    {                   

    System.out.println(e.getMessage());                

        System.exit(0);       

      }     

      finally       

        {         

        System.out.println("in finally");     

         }   

     }

    }

    finally语句块一定会执行

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

    import javax.swing.JOptionPane;

    public class Test{

         public static void main(String[] args) {

         // TODO 自动生成的方法存根

           double n=0.0;

           for(int i=0;i<1000000000;i++)

           {

              String input=JOptionPane.showInputDialog("请输入学生成绩");

              try{

              n=Double.valueOf(input);

              if(n<0)

              {

               JOptionPane.showMessageDialog(null, "输入不正确");

              }

              else if(n<60)

              {

               JOptionPane.showMessageDialog(null,"该学生成绩为不及格");

              }

              else if(n<70)

              {

               JOptionPane.showMessageDialog(null,"该学生成绩为及格");

              }

              else if(n<80)

              {

               JOptionPane.showMessageDialog(null,"该学生成绩为中等");

              }

                  

              else if(n<90)

               {

                 JOptionPane.showMessageDialog(null,"该学生成绩为良好");

               }

              else if(n<=100)

              {

               JOptionPane.showMessageDialog(null,"该学生成绩为优秀");

              }

              else if(n>100)

              {

             JOptionPane.showMessageDialog(null, "输入不正确"); 

            }

          }

                  

            catch(NumberFormatException e)//NumberFormatException异常

             {

               JOptionPane.showMessageDialog(null, "输入不正确");

             }

           }  

      }

    }

  • 相关阅读:
    可变长参数
    函数的参数
    函数
    文件操作
    字符编码
    数据类型的内置方法:集合
    数据类型的内置方法:元组
    数据类型的内置方法:字典
    数据类型内置方法:列表
    js对对象引用
  • 原文地址:https://www.cnblogs.com/qianxia/p/4961813.html
Copyright © 2011-2022 走看看