08多态

Posted 解昊兴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了08多态相关的知识,希望对你有一定的参考价值。

程序运行结果是什么? 如何解释会得到这样的输出?

 

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。如果子类被当作父类使用,则通过子类访问的字段是父类的

 

 

 这种编程方式有什么不合理的地方吗?

每一个动物都是分别写一次喂养程序,那么当被要求写多个动物时,将会有非常大的工作量

 

 动物园程序

package wsd;

import java.util.Vector;
public class Zoo {
    public static void main(String[] args) {
         Feeder f = new Feeder("小李");
         Vector<Animal> ans = new Vector<Animal>();

         //饲养员小李喂养一只狮子
         ans.add(new Lion());
         //饲养员小李喂养十只猴子
         for (int i = 0; i < 10; i++) {
             ans.add(new Monkey());
         }
         //饲养员小李喂养5只鸽子
         for (int i = 0; i < 5; i++) { 
             ans.add(new Pigeon());
         }
                
         f.feedAnimals(ans);
   }
}

class Feeder {//饲养员类
    public String name;
    Feeder(String name) {
        this.name = name;
    }
    public void feedAnimals(Vector<Animal> ans) {
        for (Animal an : ans) {
            an.eat();
            }
        }
}

interface Animal {//动物基类
    public abstract void eat();
        }

class Lion implements Animal {//狮子类
    public void eat() {
        System.out.println("我不吃肉谁敢吃肉!");
            }
}

class Monkey implements Animal {//猴子类
    public void eat() {
        System.out.println("我什么都吃,尤其喜欢香蕉。");
            }
}

class Pigeon implements Animal {
    public void eat() {
        System.out.println("我要减肥,所以每天只吃一点大米。");
        }
}

实验结果截图、

 

import java.util.Scanner;
interface fangfa{

public void show();
public void qukuan();
public void cunkuan();
public void zhuanzhang();
public void setAcount(String string, String string2, String string3, String string4, double i);
public String getMima();
}
class atm implements fangfa{
String kahao; //私有变量
String name;
String riqi;
double yue;
String mima;

public atm(){ //无参构造函数

}
public atm(String kahao,String name,String riqi,String mima,double yue){ //有参构造函数

this.kahao=kahao;
this.name=name;
this.riqi=riqi;
this.mima=mima;
this.yue=yue;
}

public void setAcount(String kahao,String name,String riqi,String mima,double yue){ //赋值

this.kahao=kahao;
this.name=name;
this.riqi=riqi;
this.mima=mima;
this.yue=yue;
}
public String getkahao(){ return kahao;}//获得值

public String getName(){return name;}
public String getRiqi(){return riqi;}
public String getMima(){return mima;}
public double getYue(){return yue;}

public void show()
{
System.out.println("余额为:"+yue);
}
public void cunkuan(){
System.out.println("请输入存款金额:");
Scanner s=new Scanner(System.in);
yue+=s.nextDouble();
show();
}

public void zhuanzhang()
{
atm q=new atm();
Scanner s=new Scanner(System.in);
System.out.println("请输入对方卡号:");
q.kahao=s.nextLine();
System.out.println("请输入转账金额:");
double zhuan=s.nextDouble();
yue=yue-zhuan;
q.yue=q.yue+zhuan;
show();
}
public void qukuan(){
boolean f=true;
while(f){
System.out.println("1、100元");
System.out.println("2、500元");
System.out.println("3、1000元");
System.out.println("4、1500元");
System.out.println("5、2000元");
System.out.println("6、5000元");
System.out.println("7、其他金额");
System.out.println("8、退卡");
System.out.println("9、返回");
System.out.println("请选择");
Scanner s=new Scanner(System.in);
int ch=s.nextInt();
switch(ch){
case 1:
yue=yue-100;
show();
break;
case 2:
yue=yue-500;
show();
break;
case 3:
yue=yue-1000;
show();
break;
case 4:
yue=yue-1500;
show();
break;
case 5:
yue=yue-2000;
show();
break;
case 6:
yue=yue-5000;
show();
break;
case 7:
System.out.println("请输入取款金额:");
double qu=s.nextDouble();
yue=yue-qu;
show();
break;
case 8:
f=false;
break;
case 9:
f=false;
break;

}
}
}

}
public class Atmduotai {


public static void main(String[] args) {
// TODO Auto-generated method stub

fangfa a=new atm();
a.setAcount("111111111111", "nasdf", "199508030048", "123456", 20000);
System.out.println("请输入密码:");
Scanner aa=new Scanner(System.in);
String ba=aa.nextLine();
if(ba.equals(a.getMima()))

while(true){

System.out.println("1、取款");
System.out.println("2、存款");
System.out.println("3、转账");
System.out.println("4、查询");
System.out.println("请选择:");
Scanner s=new Scanner(System.in);
int b=s.nextInt();
switch(b){
case 1:
a.qukuan();
break;
case 2:
a.cunkuan();
break;
case 3:
a.zhuanzhang();
break;
case 4:
a.show();
}
}
}
}

结果截图、

 

以上是关于08多态的主要内容,如果未能解决你的问题,请参考以下文章

每个人单核苷酸多态性(SNP)形成的原因是啥?

java中封装,继承,多态,接口学习总结

08 多态与异常处理

08 多态课后作业

java-08多态与异常处理

Java面向对象 ——多态