java多态动手动脑

实验任务一:多态实现ATM工作原理

1)源代码

package demo;

import java.util.Scanner;

class A{

String name;

String date;

String mima;

int yu;

String kahao;

public A(String name,String date,String mima,int yu,String kahao)

{

this.name=name;

this.date=date;

this.mima=mima;

this.yu=yu;

this.kahao=kahao;

}

public A(){}

public void way(){}

}

class Qukuan extends A{

public Qukuan(String str,String str1,String str2,int m,String str3){

name=str;

date=str1;

mima=str2;

yu=m;

kahao=str3;

}

public void way(){

System.out.println("100 200 1000 1500 2000 5000  1.其它金额   2. 退卡3.返回操作");

Scanner in=new Scanner(System.in);

int p=in.nextInt();

A a=new A(name,date,mima,yu,kahao);

if(p==100)

{

a.yu-=100;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==200)

{

a.yu-=200;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==500)

{

a.yu-=500;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==1000)

{

a.yu-=1000;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==1500)

{

a.yu-=1500;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==2000)

{

a.yu-=2000;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==5000)

{

a.yu-=5000;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==1)

{

System.out.println("请输入要取款的金额:");

int m=in.nextInt();

a.yu-=m;

System.out.println("取款成功,余额:"+a.yu);

}

else if(p==2){

return;

}

else if(p==3){

way();

}

}

}

class Cunkuan extends A{

public Cunkuan(String str,String str1,String str2,int m,String str3){

name=str;

date=str1;

mima=str2;

yu=m;

kahao=str3;

}

public void way(){

Scanner in=new Scanner(System.in);

System.out.println("请输入存款金额:");

int n=in.nextInt();

A a=new A(name,date,mima,yu,kahao);

a.yu+=n;

System.out.println("存款成功,余额:"+a.yu);

}

}

class Zhuanzhang extends A{

String kahao;

public Zhuanzhang(String str,String str1,String str2,int m,String str3){

name=str;

date=str1;

mima=str2;

yu=m;

kahao=str3;

}

public void way(){

A a=new A(name,date,mima,yu,kahao);

Scanner in=new Scanner(System.in);

System.out.println("请输入转账的卡号:");

String s=in.next();

A b=new A(name,date,mima,yu,s);

System.out.println("请输入转账的金额:");

int w=in.nextInt();

a.yu-=w;

b.yu+=w;

System.out.println("转账成功");

}

}

public class ATM {

public static void main(String args[]){

System.out.println("ATM系统\n选择语言:1 中文\t2 英文");

Scanner in=new Scanner(System.in);

int q=in.nextInt();

Qukuan a1=new Qukuan("zjx","2016.11.15","321165",6000,"45612354745");

Cunkuan a2=new Cunkuan("zjx","2016.11.15","321165",6000,"45612354745");

Zhuanzhang a3=new Zhuanzhang("zjx","2016.11.15","321165",6000,"45612354745");

if(q==1){

System.out.println("请输入密码:");

String str=in.next();

if(a1.mima.equals(str)){

System.out.println("1 取款\n2 存款\n3 转账\n4 退卡");

int t=in.nextInt();

if(t==1)

a1.way();

else if(t==2)

a2.way();

else if(t==3)

a3.way();

else

return;

}

else

System.out.println("密码错误");

}

else if(q==2)

{

System.out.println("Please input password:");

String str=in.next();

A a=new A("zjx","2016.11.15",str,6000,"654562346212");

if(a.mima==str){

System.out.println("1 qukuan\n2 cunkuan\n3 zhuanzhang\n4 tuika");

int t=in.nextInt();

if(t==1)

a1.way();

else if(t==2)

a2.way();

else if(t==3)

a3.way();

}

else

System.out.println("Password is not true.");

}

}

}

2)程序截图:

实验任务二:课堂动手动脑

1)源代码:

package demo;

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);

}

}

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();

}

}

2)实验结果截图:

3)程序分析:为何会得到这样的输出?

(1)父类分配空间,调用它的构造方法。

(2)子类分配空间,调用它自己的构造方法。

(3)子类赋值给父类,父类的子类有相同的方法,父类调用子类方法,并引用子类的对象,输出子类的值。

(4)父类中的变量值进行自加,但是只是父类中的值自加,调用的仍然是子类的方法,输出子类的值。

(5)将parent对象强制转化为Child,指向子类中的变量,调用子类方法并输出子类的值。

4)程序修改:

package demo;

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);

}

}

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();

((Child)parent).myValue++;

parent.printValue();

parent.myValue++;

parent.printValue();

}

}

截图:

分析:先将parent对象强制转化为Child,指向子类中的变量,输出子类的值。然后parent父类中的对象进行自加,对子类没有影响,调用子类方法,对象,输出子类的值。

时间: 2024-12-20 01:18:47

java多态动手动脑的相关文章

第八章多态动手动脑

[动手动脑一] "类型转换"知识点考核-2 下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m; 先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确. class Mammal{} class Dog extends Mammal {} class Cat extends Mammal {} public class TestCast { public stat

继承多态动手动脑

[1] 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 提示: 构造函数的主要作用是什么? 从这个方面去想! [答] 构造函数(constructor)是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载.构造函数的功能主要用于在类的对象创建时定义初始化的状态. 构造一个对象,先调用其构造方法

继承与多态 动手动脑

[1] 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 提示: 构造函数的主要作用是什么? 从这个方面去想! [答] 构造函数(constructor)是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载.构造函数的功能主要用于在类的对象创建时定义初始化的状态. 构造一个对象,先调用其构造方法

java的动手动脑10月20日

(1)动手动脑 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { /*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubInitializeBlockClass obj=new InitializeBlockClass();System.out.println(obj.field)

Java的动手动脑

动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARGE; //s和t引用同一个对象? System.out.println(s==t);  // //是原始数据类型吗? System.out.println(s.getClass().isPrimitive());

java异常处理动手动脑问题解决和课后总结

动手动脑 一.问题:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 1.源代码 import javax.swing.*; class AboutException { public static void main(String[] a) { int i=1, j=0, k; //k=i/j; try { k = i/j; // Causes division-by-zero exception throw new Exc

JAVA中动手动脑

第一个动手动脑: 首先用枚举类型定义两个变量,然后判断两个变量是否引用同一对象,在判断枚举类型是否是原始数据类型,再从字符串中转换,最后列出所有的对象. 很明显,这两个变量都是枚举类型,但是这两个变量引用的对象不一样,同样,枚举类型并不是原始数据类型. 得出的结论就是,同是枚举类型,但是引用的对象可以不同,枚举类型并不是原始数据类型. 我可能还是用不好枚举类型. 第二个动手动脑: 很明显,+a+b,只不过是先显示a再显示b, 而a+b+“  .. ”,就是先把a+b的结果显示出去,然后再加上要显

Java课堂动手动脑-截图集锦

课堂实践性问题 没有数据类型,名称与类名相同,没有返回值 类本身有自定义的构造方法,调用时应有参数,这时系统不再使用默认构造方法 类字段初始化顺序 1.执行类成员定义时指定的默认值或累的初始化块,执行哪一个看哪一个排在前面. 2.执行类的构造函数 动手动脑问题(类之间继承,创建子类对象导致父类初始化块的执行) 静态初始化执行顺序 1.静态初始化块只执行一次 2.创建子类的对象时,父类的初始化块也会执行 静态方法访问实例成员变量如下:

03继承与多态 动手动脑

动手实验:继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大! class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String st