作业归档8 多态
1、运行下列测试代码:
package demo;
public class TestInstanceof
{
public static void main(String[] args)
{
//声明hello时使用Object类,则hello的编译类型是Object,Object是所有类的父类
//但hello变量的实际类型是String
Object hello = "Hello";
//String是Object类的子类,所以返回true。
System.out.println("字符串是否是Object类的实例:" + (hello instanceof Object));
//返回true。
System.out.println("字符串是否是String类的实例:" + (hello instanceof String));
//返回false。
System.out.println("字符串是否是Math类的实例:" + (hello instanceof Math));
//String实现了Comparable接口,所以返回true。
System.out.println("字符串是否是Comparable接口的实例:" + (hello instanceof Comparable));
String a = "Hello";
//String类既不是Math类,也不是Math类的父类,所以下面代码编译无法通过
//System.out.println("字符串是否是Math类的实例:" + (a instanceof Math));
}
}
运行结果:
字符串是否是Object类的实例:true
字符串是否是String类的实例:true
字符串是否是Math类的实例:false
字符串是否是Comparable接口的实例:true
总结:可以使用instanceof运算符判断一个对象是否可以转换为指定的类型。
2、运行下列测试代码:
package demo;
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;
}
}
分析:
第一个注释掉的代码错误:Type mismatch: cannot convert from Mammal to Dog。
第二个注释掉的代码错误:Type mismatch: cannot convert from Cat to Dog。
第三个注释掉的代码错误:没有编译错误,但是无法运行。
3、运行下列测试代码:
package demo;
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);
}
}
①程序运行结果是什么?
②你如何解释会得到这样的输出?
③计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?
答:①运行结果:
Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201
②第一个,调用的是父类的方法,父类的属性。第二个,调用的是子类的方法与属性。然后,parent=child;后,parent.printValue()调用的将是子类的方法与属性。parent.myValue++;使得父类的属性加1(100+1),parent.printValue();将与上一个调用相同,调用的是子类的方法与属性。之后,((Child)parent).myValue++;将父类的对象强制转化为子类的对象,并将属性加1(200+1),parent.printValue();就会调用子类的方法属性。
③当子类与父类的方法一样时,并让父类对象引用子类对象时,调用哪个方法,对象的“真实”类型决定。如果子类与父类的字段相同,那么子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段。如果子类方法想访问父类中被隐藏的字段,需用关键字super来访问。如果子类被当作父类使用,则通过子类访问的字段是父类的。
4、运行下列测试代码:
package demo;
class Parent2
{
public int value=100;
public void Introduce()
{
System.out.println("I'm father");
}
}
class Son extends Parent2
{
public int value=101;
public void Introduce()
{
System.out.println("I'm son");
}
}
class Daughter extends Parent2
{
public int value=102;
public void Introduce()
{
System.out.println("I'm daughter");
}
}
public class TestPolymorphism
{
public static void main(String args[])
{
Parent2 p=new Parent2();
p.Introduce();
System.out.println(p.value);
p=new Son();
p.Introduce();
System.out.println(p.value);
p=new Daughter();
p.Introduce();
System.out.println(p.value);
}
}
运行结果:
I'm father
100
I'm son
100
I'm daughter
100
5、用多态的方法模拟ATM操作流程。
package demo;
import java.util.Scanner;
public class TestATM {
public static void main(String []args){
Account user=new Account("Marry","2016.11.15",1,"123456",500);
Scanner cin=new Scanner(System.in);
int choose;
while(true){
menu();
choose=cin.nextInt();
user.setType(choose);
if(choose==1){
user.saveMoney();
}
if(choose==2){
user.drawMoney();
}
if(choose==3){
user.zhuanMoney();
}
if(choose==4){
user.updateMima();
}
if(choose==5){
user.chaxun();
}
if(choose==6){
break;
}
}
}
public static void menu(){
System.out.println("1、存款");
System.out.println("2、取款");
System.out.println("3、转账汇款");
System.out.println("4、修改密码");
System.out.println("5、查询余额");
System.out.println("6、退卡");
System.out.println("请选择:");
}
}
abstract class ATM{
abstract public void saveMoney();
abstract public void drawMoney();
abstract public void zhuanMoney();
abstract public void updateMima();
abstract public void chaxun();
}
class Account extends ATM{
private String name;//用户名
private String date;
private int type;
private String mima;//密码
private double money;
public Account(String na,String da,int ty,String mi,double mo){
name=na;
date=da;
type=ty;
mi=mima;
money=mo;
}
//set函数
public void setName(String na){
name=na;
}
public void setDate(String da){
date=da;
}
public void setType(int ty){
type=ty;
}
public void setMima(String mi){
mima=mi;
}
public void setMoney(double mo){
money=mo;
}
//get函数
public String getName(){
return name;
}
public String getDate(){
return date;
}
public int getType(){
return type;
}
public String getMima(){
return mima;
}
public double getMoney(){
return money;
}
//存款
public void saveMoney(){
Scanner cin1=new Scanner(System.in);
System.out.print("请输入存款的金额:");
double qian=cin1.nextDouble();
money+=qian;
System.out.println("存款成功,当前余额为:"+money);
}
//取款
public void drawMoney(){
Scanner cin2=new Scanner(System.in);
Scanner cin22=new Scanner(System.in);
System.out.print("请输入取款的金额:1、100。2、500。3、1000。4、1500。5、2000。6、5000。7、其他");
int xuan=cin22.nextInt();
if(xuan==1){
if(money>=100){
money-=100;
System.out.println("取款成功,当前余额为:"+money);
}
else
System.out.println("抱歉,您的余额不足100元。");
}
if(xuan==2){
if(money>=500){
money-=500;
System.out.println("取款成功,当前余额为:"+money);
}
else
System.out.println("抱歉,您的余额不足500元。");
}
if(xuan==3){
if(money>=1000){
money-=1000;
System.out.println("取款成功,当前余额为:"+money);
}
else
System.out.println("抱歉,您的余额不足1000元。");
}
if(xuan==4){
if(money>=1500){
money-=1500;
System.out.println("取款成功,当前余额为:"+money);
}
else
System.out.println("抱歉,您的余额不足1500元。");
}
if(xuan==5){
if(money>=2000){
money-=2000;
System.out.println("取款成功,当前余额为:"+money);
}
else
System.out.println("抱歉,您的余额不足2000元。");
}
if(xuan==6){
if(money>=5000){
money-=5000;
System.out.println("取款成功,当前余额为:"+money);
}
else
System.out.println("抱歉,您的余额不足5000元。");
}
if(xuan==7){
double qian=cin2.nextDouble();
if(money<qian)
System.out.println("抱歉,您的余额不足"+qian+"元。");
else
money-=qian;
System.out.println("取款成功,当前余额为:"+money);
}
}
//转账汇款
public void zhuanMoney(){
Scanner cin3=new Scanner(System.in);
Scanner input=new Scanner(System.in);
System.out.println("请输入对方账户:");
String toUser=input.nextLine();
System.out.print("请输入转账的金额:");
double qian=cin3.nextDouble();
if(money<qian)
System.out.println("抱歉,您的余额不足"+qian+"元。");
else
money-=qian;
System.out.println("转账成功,当前余额为:"+money);
}
//
public void updateMima(){
Scanner sc=new Scanner(System.in);
//System.out.print("请输入原密码:");
//String oldMima = sc.nextLine();
// if(mima.equals(oldMima))
//{
System.out.println("请输入新密码:");
String newMima1 = sc.nextLine();
System.out.println("请再次输入新密码:");
String newMima2 = sc.nextLine();
if(newMima1.equals(newMima2)){
mima=newMima1;
System.out.println("修改密码成功");
}
else
System.out.println("两次新密码不一致,修改密码失败");
// }
//else{
//System.out.println("原密码不正确,修改密码失败!");
// }
}
public void chaxun(){
System.out.println("您当前余额为:"+money);
}
}
运行结果:
1、存款
2、取款
3、转账汇款
4、修改密码
5、查询余额
6、退卡
请选择:
1
请输入存款的金额:5000
存款成功,当前余额为:5500.0
1、存款
2、取款
3、转账汇款
4、修改密码
5、查询余额
6、退卡
请选择:
2
请输入取款的金额:1、100。2、500。3、1000。4、1500。5、2000。6、5000。7、其他4
取款成功,当前余额为:4000.0
1、存款
2、取款
3、转账汇款
4、修改密码
5、查询余额
6、退卡
请选择:
3
请输入对方账户:
5968515154
请输入转账的金额:200
转账成功,当前余额为:3800.0
1、存款
2、取款
3、转账汇款
4、修改密码
5、查询余额
6、退卡
请选择:
4
请输入新密码:
569412
请再次输入新密码:
569412
修改密码成功
1、存款
2、取款
3、转账汇款
4、修改密码
5、查询余额
6、退卡
请选择:
5
您当前余额为:3800.0
1、存款
2、取款
3、转账汇款
4、修改密码
5、查询余额
6、退卡
请选择:
6