(1)怎样判断对象是否可以转换?参看实例: TestInstanceof.java
运行结果:
(2)运行TestCast.java
d=m;d=c;c=(Cat)m;出现错误
(3)运行ParentChildTest.java
1.程序运行结果是什么?
- 你如何解释会得到这样的输出?
第一个输出创建了一个Parent对象,所以调用父类的构造函数。
第二个输出创建了一个Child对象,所以调用子类的构造函数。
将子类child对象赋值给父类,将父类覆盖调用了子类的创建方法。
第四个parent.myValue++是对父类的变量进行运算,而parent.myValue()实际上调用的还是子类的构造方法。
第五个((Child)parent).myValue++强制类型转化。
子类和父类具有相同的方法和字段,定义的parent为父类,child为子类,所以parent调用父类的方法,child调用子类型的方法。子类中的myValue值代替或隐藏父类值。
3. 计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?
当子类与父类拥有一样的方法,并且让父类变量引用一个子类对象时,到底调用那个方法,由对象自己真实类型决定:对象时子类的,它就调用子类的方法,是父类型的,它就调用父类型的方法。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的。
阅读并运行AboutException.java示例
EmbedFinally.java程序运行的结果
辨析:finally语句块一定会执行吗?
请通过 SystemExitAndFinally.java示例程序回答上述问题
不一定执行。Try块中有System.exit(0);这样的语句,finally语句不会执行。
PrintExpressionStack.java示例
Java异常处理总结:
一般构造如下
try{程序代码}catch(异常类型1 异常的变量名1){程序代码}catch(异常类型2 异常的变量名2){程序代码} finally{程序代码}
catah可以有多个,用来匹配多个异常,匹配上多个中的一个后,执行catch语句块时仅仅执行匹配的异常。Catch的类型是自己定义的,表示代码抛出异常类型,异常的变量名表示抛出的异常对象的引用。
ExceptionLinkInRealWorld.java运行
动手动脑:
实验要求:
编写一个程序,此程序在运行时要求用户输入一个 整数,代表某门课的考试成绩,程序接着给出“不及格”、“及格”、“中”、“良”、“优”的结论。
源代码:
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int n;
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个整数(0~100):");
int i=0; //控制出入正确时,判断完成结束程序
for(;;) //循环,直到输入正确
{
try
{
n=sc.nextInt();
if(n<0||n>100){ //判断整数范围是否正确
System.out.println("输入整数不在范围!");
}
else{
i=1;
if(n<60&&n>=0){
System.out.println("不及格");
}
else if(n<70){
System.out.println("及格");
}
else if(n<80){
System.out.println("中");
}
else if(n<90){
System.out.println("良");
}
else if(n<=100){
System.out.println("优");
}
}
}
catch(InputMismatchException e)
{
sc.next();//读取到有效字符后才可以结束输入
System.out.println("输入格式不正确,请输入整数(0~100)!");
}
if(i==1)//结束循环
{
break;
}
}
}
}
运行结果截图: