多态
一、课堂动脑总结
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);
}
}
2、结果截图
3、总结
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段,而不是父类中的字段。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。如果子类被当作父类使用,则通过子类访问的字段是父类的!
二、多态Atm
1、源代码
package Guidang8;
import java.util.Scanner;
class Qukuan1 extends Manager{
Qukuan1(String kahao,String name,String Date,int mima,double yue){
super(kahao,name,Date,mima,yue);
}
void qukuan(){
yue=yue-100;
if(yue>=0){
setyue(yue);
}
else
System.out.println("余额不足!");
}
}
class Qukuan2 extends Manager{
Qukuan2(String kahao, String name, String Date, int mima, double yue) {
super(kahao, name, Date, mima, yue);
// TODO 自动生成的构造函数存根
}
void qukuan(){
yue=yue-500;
if(yue>=0){
setyue(yue);
}
else
System.out.println("余额不足!");
}
}
class Qukuan3 extends Manager{
Qukuan3(String kahao, String name, String Date, int mima, double yue) {
super(kahao, name, Date, mima, yue);
// TODO 自动生成的构造函数存根
}
void qukuan(){
yue=yue-1000;
if(yue>=0){
setyue(yue);
}
else
System.out.println("余额不足!");
}
}
class Qukuan4 extends Manager{
Qukuan4(String kahao, String name, String Date, int mima, double yue) {
super(kahao, name, Date, mima, yue);
// TODO 自动生成的构造函数存根
}
void qukuan(){
yue=yue-1500;
if(yue>=0){
setyue(yue);
}
else
System.out.println("余额不足!");
}
}
class Qukuan5 extends Manager{
Qukuan5(String kahao, String name, String Date, int mima, double yue) {
super(kahao, name, Date, mima, yue);
// TODO 自动生成的构造函数存根
}
void qukuan(){
yue=yue-2000;
if(yue>=0){
setyue(yue);
}
else
System.out.println("余额不足!");
}
}
class Qukuan6 extends Manager{
Qukuan6(String kahao, String name, String Date, int mima, double yue) {
super(kahao, name, Date, mima, yue);
// TODO 自动生成的构造函数存根
}
void qukuan(){
yue=yue-5000;
if(yue>=0){
setyue(yue);
}
else
System.out.println("余额不足!");
}
}
class Qukuan7 extends Manager{
Qukuan7(String kahao, String name, String Date, int mima, double yue) {
super(kahao, name, Date, mima, yue);
// TODO 自动生成的构造函数存根
}
void qukuan(){
Scanner in = new Scanner(System.in);
System.out.println("请输入取款金额:");
int d=in.nextInt();
yue=yue-d;
if(yue>=0){
setyue(yue);
}
else
System.out.println("余额不足!");
}
}
class Manager {
private String kahao;
private String name;
private String Date;
private int mima;
protected double yue;
Manager(String kahao,String name,String Date,int mima,double yue){
this.kahao=kahao;
this.name=name;
this.Date=Date;
this.mima=mima;
this.yue=yue;
}
public void setkahao(String kahao){
this.kahao=kahao;
}
public String getkahao(){
return kahao;
}
public void setname(String name){
this.name=name;
}
public String getname(){
return name;
}
public void setDate(String Date){
this.Date=Date;
}
public String getDate(){
return Date;
}
public void setmima(int mima){
this.mima=mima;
}
public int getmima(){
return mima;
}
public void setyue(double yue){
this.yue=yue;
}
public double getyue(){
return yue;
}
void jiemian(){
System.out.println("******************************************************");
System.out.println("\t\t ATM ");
System.out.println("******************************************************");
System.out.println("\t\t1、存款");
System.out.println("\t\t2、取款");
System.out.println("\t\t3、汇款");
System.out.println("\t\t4、修改密码");
System.out.println("\t\t5、查询余额");
System.out.println("\t\t6、退出程序");
System.out.println("******************************************************");
}
void cunkuan(){
Scanner in = new Scanner(System.in);//定义一个Scanner对象
Scanner in1 = new Scanner(System.in);
System.out.println("请输入存款金额:");
double yu1 = in.nextInt();
yue=yue+yu1;
setyue(yue);
}
void qukuan(){}
void mima(){
Scanner in = new Scanner(System.in);
System.out.println("请输入修改的密码:");
int mi=in.nextInt();
setmima(mi);
System.out.println("修改成功!");
}
void zhuanzhang(){
System.out.println("请输入转账帐号:");
Scanner in = new Scanner(System.in);
String b=in.next();
System.out.println("请输入转账金额:");
int c=in.nextInt();
yue=yue-c;
if(yue>=0){
setyue(yue);
System.out.println("转账成功");
}
else
System.out.println("余额不足,转账失败!");
}
void chaxun(){
System.out.println("余额:"+getyue());
}
}
public class Atm {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("请输入密码:");
Scanner in0 = new Scanner(System.in);
int ma=in0.nextInt();
Manager A=new Manager("123","li","1111",123,1000);
if(ma==A.getmima()){
A.jiemian();
int i=1;
while(i==1){
Scanner in = new Scanner(System.in);//定义一个Scanner对象
System.out.println("请输入数字(1:存款 2:取款 3:汇款 4:修改密码 5:查询余额 6:退出):");
int n = in.nextInt();
if(n==1)
A.cunkuan();
if(n==2){
System.out.println("请输入取款金额:");
Scanner in1 = new Scanner(System.in);//定义一个Scanner对象
System.out.println("请输入选项:(1:100 2:500 3:1000 4:1500 5:2000 6:5000 7:其他金额)");
int a=in1.nextInt();
double yu=A.getyue();
if(a==1)
{ yu=A.getyue();
A=new Qukuan1("123","li","1111",123,yu);A.qukuan();}
if(a==2)
{ yu=A.getyue();
A=new Qukuan2("123","li","1111",123,yu);A.qukuan();}
if(a==3)
{ yu=A.getyue();
A=new Qukuan3("123","li","1111",123,yu);A.qukuan();}
if(a==4)
{ yu=A.getyue();
A=new Qukuan4("123","li","1111",123,yu);A.qukuan();}
if(a==5)
{ yu=A.getyue();
A=new Qukuan5("123","li","1111",123,yu);A.qukuan();}
if(a==6)
{ yu=A.getyue();
A=new Qukuan6("123","li","1111",123,yu);A.qukuan();}
if(a==7)
{ yu=A.getyue();
A=new Qukuan7("123","li","1111",123,yu);A.qukuan();}
}
if(n==3)
A.zhuanzhang();
if(n==4)
A.mima();
if(n==5)
A.chaxun();
if(n==6)
{
i=0;
System.out.println("欢迎再次使用!!!");
}
}
}
else
System.out.println("密码错误,该卡已被锁定!");
}
}
2、结果截图
·这个特性实际上就是面向对象“多态”特性的具体表现。
·如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
·如果子类被当作父类使用,则通过子类访问的字段是父类的!