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();
}
}
截图: