Java有关多态类的小程序

1.使用instanceof运算符判断一个对象是否可以转换为指定的类型:

代码:

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

运行结果:

2.关于类型转换:

下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m;进行判断并运行结果证明:

d=m;d=c;有错误

程序运行及解释如下图:

3.子类和父类定义同样的函数,运行结果会怎样?

代码示例:

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

输出结果为(原因如程序注释):

Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201

 由此可得Java的一些语法特性(多态):

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如果子类被当作父类使用,则通过子类访问的字段是父类的。

因此,我们进行程序设计时应避免子类与父类同名的字段!

 4.多态代码即:当多个类实现同一接口(或派生自同一抽象类)时,针对这些类所创建的对象调用接口所定义的方法时,会分别调用相应的类的具体实现代码。

编译器在编译多态diamante时采用滞后绑定的方法。

使用javap查看编译器为TestPolymorphism.java生成的字节码指令。

程序代码:

class Parent       
{
    public int value=100;    
    public void Introduce()
    {
            System.out.println("I'm father");
    }
}
class Son extends Parent
{
    public int value=101;
         public void Introduce()
          {
            System.out.println("I'm son");
          }
}

class Daughter extends Parent
{
    public int value=102;
    public void Introduce()
    {
            System.out.println("I'm daughter");    
    }
}

public class TestPolymorphism
{
    public static void main(String args[])
    {
        Parent p=new Parent();
        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);
   }

}

程序运行结果:

5.在编程中应用多态,可以使我们的代码具有更强的适用性。当需求变化时,多态特性可以帮助我们将需要改动的地方减少到最低限度。 多态编程有两种主要形式:继承多态和接口多态。

使用多态最大的好处是: 当你要修改程序并扩充系统时,你需要修改的地方较少,对其它部分代码的影响较小!千万不要小看这两个“较”字!程序规模越大,其优势就越突出。

6.使用接口代替抽象类(接口多态):

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());
        }     
        for (int i = 0; i < 5; i++) {     //饲养员小李喂养5只鸽子
            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("我要减肥,所以每天只吃一点大米。");
    }
}

7.用多态的方法模拟ATM机。

多态编程有两种主要形式: (1)继承多态(2)接口多态

(程序仍有错误)

代码:

import java.util.Scanner;
public class Accountduotai extends Account2{
       public void input(Account2 account){
            int a;
            String b;
            int choose;    
            System.out.println("请选择语言:1.汉语;2.英语"+'\n'+"(Please select :1.Chinese;2.English)");
            Scanner in =new Scanner(System.in);
            a=in.nextInt();     //语言
            if(a==1)         //汉语
            {        
            Scanner in1 =new Scanner(System.in);    
            System.out.println("请输入密码:");
            Scanner in2=new Scanner(System.in); //密码
            b=in2.nextLine();
            while(b.equals(account.password)){
            System.out.println("请选择操作:1.取款;2.存款;3.转账;4.查询余额;5:退卡");
            choose=in1.nextInt();  //操作
        
                if(b.equals(account.password))
                {
                   if(choose==1)//取款
                    {
                       System.out.println("请选择:1.100;2.500;3.1500;4.2000;4.5000;5.其他;6.退卡;7.返回");
                       account.qukuan(account);
                       continue;
                    
                    }
                   else if(choose==2)  //存款
                    {
                       System.out.println("请输入存款金额:");
                       account.cunkuan(account);
                    
                    }
                   else if(choose==3)  //转账
                    {
                    account.zhuanzhang(account);
                    }
                 /*  else if(choose==4)   //修改密码
                    {
                        account.xiugai(null);
                    }*/
                    else if(choose==4)   //查询余额
                    {
                        //account.chaxun(null);
                        System.out.println("您的余额为:"+account.yue);
                    }
                    else if(choose==5)
                    {
                        System.out.println("请取出您的卡!");
                        break;
                    }
                    else System.out.println("无此功能");              
               }
                
           }  if(!b.equals(account.password))
                System.out.println("该卡已被锁定,无法操作!");
        }
            else        //英语
            {
                Scanner in1 =new Scanner(System.in);    
                System.out.println("Please input the password:");
                Scanner in2=new Scanner(System.in); //密码
                b=in2.nextLine();
                while(b.equals(account.password)){
                System.out.println("Please select:1.qukuan;2:cunkuan;3.zhuanzhang;4.chauxunyue;5.break");
                choose=in1.nextInt();  //操作
                
                    if(b.equals(account.password))
                    {
                       if(choose==1)//取款
                        {
                          System.out.println("Please select:1.100;2.500;3.1500;4.2000;4.5000;5.else;6:exit;7.return");
                          account.qukuan(account);    
                        }
                       else if(choose==2)  //存款
                        {
                           System.out.println("Please input the save money:");
                         account.cunkuan(account);
                    
                        }
                       else if(choose==3)  //转账
                        {
                        account.zhuanzhang(account);
                        
                        }    
                       /*else if(choose==4)   //修改密码
                        {
                            account.xiugai(null);
                        }*/
                        else if(choose==4)   //查询余额
                        {
                            //account.chaxun(null);
                            System.out.println("The rest is:"+account.yue);
                        }
                        else if(choose==5)
                        {
                            System.out.println("Take the card away!");
                            break;
                        }
                        else System.out.println("Without this function");
                        
                   }                      
                                                    
            }
                 if(!b.equals(account.password))
                        System.out.println("Wrong!");
  }
       }
       public static void main(String[] args) {
           Accountduotai A=new Accountduotai(); 
           Account2 account=new Account2();
           account.setAccount1("12345678901","20161115","000000",5000);
           A.input(account);
         }
    
}
abstract class Atm{
    public void qukuan() {};
    public void cunkuan(){};
    public void zhuanzhang(){};
    public void chaxun(){};
}
class Account2 extends Atm{
    String name;
    String data;
    String password;
    int caozuo;
    double yue;
    public void setName(String n){name=n;}
    String getNmae(){return name;}
    
    public void setData(String d){data=d;}
    String getData(){return data;}
    
    public void setPassword (String p){password=p;}
    String getPassword(){return password;}
    
    public void setCaozuo (int i){caozuo=i;}
    int getCaozuo(){return caozuo;}
    
    public void setYue(double y){yue=y;}
    double getYue(){return yue;}
    public void setAccount1(String string, String string2,  String string3, int j) {
        name=string;
        data=string2;
    //    caozuo=i;
        password=string3;
        yue=j;    
    }
    /*public void xiugai(Account2 account){
        System.out.println("请输入原密码:");
        Scanner in7=new Scanner(System.in);
        String m=in7.nextLine();
        if(m.equals(account.password))
        {
            System.out.println("请输入新密码:");
            Scanner in8=new Scanner(System.in);
            String n=in8.nextLine();
            account.password=n;
            System.out.println("修改成功");
        }
        else System.out.println("密码输入错误!");
    }*/
    /*public void chaxun(Account2 account)
    {
        System.out.println("您的余额为:"+account.yue);
    }*/    
    public void zhuanzhang(Account2 account) {
        //Account2 account=new Account2("12345678901","20161115",1,"000000",5000);
        System.out.println("请输入本人卡号:");
        Scanner in6=new Scanner(System.in);
        String hang=in6.nextLine();
        if(hang.equals(account.name))
        {
            System.out.println("转账卡号:");
            Scanner in4=new Scanner(System.in);
            double money=in4.nextDouble();
            System.out.println("请输入转账金额:");
            Scanner in5=new Scanner(System.in);
            double zhuan=in5.nextDouble();
            account.yue=account.yue-zhuan;
            System.out.println("转账成功!本身余额为:"+account.yue);
        }    
    }
    public void cunkuan(Account2 account) {
        //Account2 account=new Account2("12345678901","20161115",1,"000000",5000);
        //System.out.println("请输入存款金额:");
        Scanner in3 =new Scanner(System.in);
        double cun=in3.nextInt();
        account.yue=account.yue+cun;
         System.out.println("本身余额为:"+account.yue);        
    }    
    public void qukuan(Account2 account){
        //Account2 account=new Account2("12345678901","20161115",1,"000000",5000);
        while(true){
        //System.out.println("请选择:1.100;2.500;3.1500;4.2000;4.5000;5.其他;6.退卡;7.返回");
        int b;    
        Scanner in1=new Scanner(System.in);    
        b=in1.nextInt();
            if(b==1)
            {
                account.yue=account.yue-100;
                System.out.println("本身余额为:"+account.yue);          
            }
            if(b==2)
            {
                account.yue=account.yue-500;
                System.out.println("本身余额为:"+account.yue);
                 
            }
            if(b==3)
            {
                account.yue=account.yue-1500;
                System.out.println("本身余额为:"+account.yue);
                
            }
            if(b==4)
            {
                account.yue=account.yue-2000;
                System.out.println("本身余额为:"+account.yue);
                 
            }
            else if(b==5) //其他金额
                {
                    int c;
                    Scanner in2=new Scanner(System.in);
                    c=in2.nextInt();
                    account.yue=account.yue-c;
                    System.out.println("本身余额为:"+account.yue);
                    
                }
            else if(b==6){ //退卡
                System.out.println("请取走您的卡!");
                break;
            }
            else if(b==7){ //返回
                break;
            }
        
    }
    }
}

    

运行结果:

 

posted @ 2016-11-18 21:38  暖心系  阅读(1574)  评论(0编辑  收藏  举报