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);
}
}
结果:
分析:
第一个new的parent类的对象,所以在调用时调用的是parent的构造方法以及parent的value值。第二个new的child的类的对象,所以在调用构造方法时调用child的构造方法以及child的value值。第三个是将子类的child赋值给了他的父类parent,在调用构造方法时也就是调用子类child的构造方法,但是在子类的构造方法时的value是子类child的value值,所以是子类child的构造方法加上value=200。第四个是parent的value值加一,但是parent仍是前面的child赋过值的,所以调用的仍然是child的构造方法,value也是child中的value所以仍是200。第五个是将parent赋给child类,所以parent也是child的一部分,所以调用时是调用子类的构造方法,并且之前value值加1,所以输出201。
2.用多态的方法模拟ATM操作流程
//课堂测试: ATM机
//Sun Qiwen,2016.11.15
import java.util.Scanner;
class ATM{
String biaoshi;
String name;
String Date;
int mima;
double yue;
public ATM(String a,String b,String c,int d,double e)
{
biaoshi=a;
name=b;
Date=c;
yue=e;
mima=d;
}
}
public class Account {
public static void main(String[] args) {
ATM acc=new ATM("abc12345678","sqw","2016.11.15",000000,100.0);
int mi,yu;
System.out.println("请选择语言:(1.中文 2.英文)");
Scanner in =new Scanner(System.in);
yu=in.nextInt();
System.out.println("请输入密码:");
Scanner in1 =new Scanner(System.in);
mi=in1.nextInt();
if(mi==acc.mima)
{
while(true)
{
int choose;
System.out.println("*************************");
System.out.println("**********ATM机*************");
System.out.println("*************************");
System.out.println(" 1.存款 ");
System.out.println(" 2.取款 ");
System.out.println(" 3.转账汇款 ");
System.out.println(" 4.修改密码 ");
System.out.println(" 5.查询余额 ");
System.out.println("*************************");
Scanner in2 =new Scanner(System.in);
choose=in2.nextInt();
if(choose==1)
{
System.out.println("请输入存款金额:");
Scanner in3 =new Scanner(System.in);
double cun=in3.nextInt();
acc.yue=acc.yue+cun;
continue;
}
else if(choose==2)
{
System.out.println("取款金额有:100、500、1000、1500、2000、5000、其他");
System.out.println("请输入取款金额:");
Scanner in4=new Scanner(System.in);
double qu=in4.nextDouble();
acc.yue=acc.yue-qu;
continue;
}
else if(choose==3)
{
System.out.println("请输入卡号:");
Scanner in6=new Scanner(System.in);
String hang=in6.nextLine();
if(hang.equals(acc.biaoshi))
{
System.out.println("请输入转账金额:");
Scanner in5=new Scanner(System.in);
double zhuan=in5.nextDouble();
acc.yue=acc.yue-zhuan;
}
}
else if(choose==4)
{
System.out.println("请输入原密码:");
Scanner in7=new Scanner(System.in);
int mim=in7.nextInt();
if(mim==acc.mima)
{
System.out.println("请输入新密码:");
Scanner in8=new Scanner(System.in);
int mim2=in8.nextInt();
acc.mima=mim2;
System.out.println("修改成功");
}
}
else if(choose==5)
{
System.out.println("您的余额为:"+acc.yue);
}
else System.out.println("无此功能!");
}
}
else System.out.println("此卡已经被锁定,无法操作!");
}
}
abstract class aATM{
public abstract void QuKuan(); //取款
public abstract void CunKuan(); //存款
public abstract void Zhuanzhang(); //转账汇款
public abstract void mima(); //修改密码
public abstract void yue(); //查询余额
}
结果:
3.下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?
运行以下代码:
class Mammal{}
class Dog extends Mammal {}
class Cat extends Mammal{}
public class TestCast{
public static void main(String args[]){
Mammal m;
Dog d=new Dog();
Cat c=new Cat();
m=d;
//d=m;
d=(Dog)m;
//d=c;
//c=(Cat)m;
}
}
结果:
分析:
d=m,d=c引发错误。
因为d是dog的对象,m是Mammal的对象,所以这相当于直接将父类对象给子类要用强制类型转换,c,d是同一级,同为子类,不能相互赋值。