7 动手动脑及小程序

1.PPT  9页)http://dev.21tx.com/2004/12/15/12360.shtml

现在有三个类:

class Mammal{}//

class Dog extends Mammal {}//

class Cat extends Mammal{}//

针对每个类定义三个变量并进行初始化

Mammal m=null ;

Dog d=new Dog();

Cat c=new Cat();

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

m=d;

d=m;

d=(Dog)m;

d=c;

c=(Cat)m;

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

1)事前判断

     m=d是可以的,表示我定义了一个Mammal类型的引用,指向新建的 Dog类 型的对象,即父类的引用指向了自己的子类的对象。由于 Dog是继承自它的父类Mammal,所以Mammal类型的引用是可以指向Cat类型的对象的。。但是d=m不行,因为不能把父类对象引用赋给子类对象引用变量,除非进行强制转化,也就是向下转型(父类转子类)d=(Dog)m

     d=c也会引起编译错误(把d=m注释掉),父类型的引用必须指向子类的对象,即指向谁才能转换成谁,则因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。

2)运行结果

  

2.运行以下测试代码(PPT  10页)

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

     

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

    public class ParentChildTest {

public static void main(String[] args) {

Parent parent=new Parent();

parent.printValue();//输出100

Child child=new Child();

child.printValue();//输出200

        /*父类的引用指向自己的子类对象,所以输出200*/

parent=child;

parent.printValue();

        /*在上列中父类parent的引用指向自己的子类对象child,由于printValue()方法在父类与子类中都有定义,则子类child覆写了这个方法,输出200*/

        parent.myValue++;

parent.printValue();

        /*通过强制转换,把父类对象的引用赋给子类对象,然后加1,所以输出201*/

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

}

}

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

     父类的引用可以指向了自己的子类的对象,而该引用只能调用父类中定义的方法和变量;如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。

3.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识。(PPT  17页)

  

4.阅读以下代码(CatchWho.java),写出程序运行结果:(PPT  24页)

  

5.写出CatchWho2.java程序运行的结果。(PPT  25页)

6.请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结。(PPT 26页)

 

7.辨析:finally语句块一定会执行吗?请通过 SystemExitAndFinally.java示例程序回答上述问题。(PPT 27页)

 

只有与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。如果在try语句块之前返回(return)或者抛出异常,try对应的finally语句块就不会执行。

8.如何跟踪异常的传播路径?

 Ø   当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。

Ø可使用printStackTrace 和 getMessage方法了解异常发生的情况:

Ø    printStackTrace:打印方法调用堆栈。

Ø    每个Throwable类的对象都有一个getMessage方法,它返回一个字串,这个字串是在    Exception构造函数中传入的,通常让这一字串包含特定异常的相关信息。

9.PrintExpressionStack.java运行结果:

  

10.动手动脑

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

   1)源代码

    

import java.util.*;

public class GradeScore {

    public static void Chuli(){

          
           try{
               Scanner sc = new Scanner(System.in);
               System.out.print("请输入分数:");
               int score=sc.nextInt();
               if(score>100||score<0)
               {
                   System.out.println("请输入正整数!");
                   score=sc.nextInt();
                   }
               else{
                   if(score>=0&&score<60)   System.out.println("不及格");
                      else if(score>=60&&score<70)   System.out.println("及格");
                      else if(score>=70&&score<80)   System.out.println("中");
                      else if(score>=80&&score<90)   System.out.println("良");
                      else    System.out.println("优");
               }
               
           }catch(InputMismatchException e){
               System.out.println("请输入正整数!");
               Chuli();
               }
    
         
    }
    public static void main(String[] args){
        Chuli();
    }
    }

  ①输入符合要求的正整数

   

  ②输入负数

   

  ③输入小数

   

  ④输入特殊字符

   

原文地址:https://www.cnblogs.com/LL66/p/4966939.html