1.PPT  P9 

现在有三个类:

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  P11

1)程序的运行结果为:

2)结果原因:第一个直接输出父类parent的值,第二个直接输出子类child的值,第三个是把子类的值赋给父类,从而输出结果为子类的语句,第四句是把parent的value++,但是输出的依然是子类的语句,引用的依然是子类的myvalue,所以输出值依然是200,第五个是把parent强制类型转化为child,之后再进行++运算,值也跟着变化,输出结果为201。

3)总结:  当父类和子类具有相同的方法时,调用那个方法是根据对象自己的真实类型所决定的。

2.PPT  P24

截图:

3.PPT P27

不会,因为源程序中有系统退出语句,在catch到错误之后,运行完相应的语句之后,System.exit(0);,使得系统直接退出,不再执行finally中的语句。

4.

动手动脑:

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

package chengjipaiming;
import java.util.Scanner;
class score
{
int score;
void get()
{

try{
Scanner a=new Scanner(System.in);
System.out.print("输入成绩(0~100):");
score=a.nextInt();
if(score<0||score>100)
{
System.out.println("输入的数超出定义的范围");
get();
}
}
catch(Exception e)
{
System.out.println("输入有误,核对后输入;");
get();
}
}
void show()
{

if(score>=0&&score<=60)System.out.print(" 不及格");
if(score>60&&score<=70)System.out.print(" 及格");
if(score>70&&score<=80)System.out.print(" 中");
if(score>80&&score<=90)System.out.print(" 良");
if(score>90&&score<=100)System.out.print(" 优");
}
}
public class Range {

public static void main(String[] args) {
// TODO Auto-generated method stub
score c=new score();
c.get();
c.show();
}
}

截图: