zoukankan      html  css  js  c++  java
  • Java 课后作业

     

    一.可以使用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));

       }

    }

      结果截图:

      

    二.下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?        

            Mammal m=null ;

                     Dog d=new Dog();

                     Cat c=new Cat();

                                         m=d;

                                         d=m;

                                          d=(Dog)m;

                                          d=c;

                                          c=(Cat)m;

    源代码:

    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;

    }
    }

      第二句和第三句会引起编译错误。原因:子类对象可以直接赋给基类变量。基类对象要赋给子类对象变量,必须执行类型转换,其语法是:子类对象变量=(子类名)基类对象名;第五句会引起运行错误。原因:转换混乱。

    三.

      1.左边的程序运行结果是什么?

        

              程序结果:

      

      2.   你如何解释会得到这样的输出?

      前两个都是parent和child分别调用的自己方法,输出自己的值。第三个parent引用子类child类的对象则调用child的方法。第四个是parent里面的Value加一,但是child里面的Value并没有加1还是调用child的方法,值不会变。第五个进行了类型转换,结果是child里面的Value+1输出结果为201

     3.  计算机是不会出错的,之所以得 到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

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

    如果子类被当作父类使用,则通过子类访问的字段是父类的!

    四. javap查看编译器为TestPolymorphism.java生成的字节码指令,然后通过互联网搜索资料,尝试从底层开始理解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);

           }  

    }

        结果截图:

                

      在 java 语言中,多态性体现在两个方面:由方法重载实现的静态多态性(编译时多态)和方法重写实现的动态多态性(运行时多态)。

      (1)编译时多态

        在编译阶段,具体调用哪个被重载的方法,编译器会根据参数的不同来静态确定调用相应的方法。  

      (2)运行时多态

        由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序

        中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用
        子类的方法。

        重写方法的调用原则(为重点):java 运行时系统根据调用该方法的实例,来决定调用哪个方法。

        对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了
        父类的方法(未重写),则运行时系统调用父类的方法。

    五.zoo1

      代码:

                               public class Zoo

    {

           public static void main(String args[])

           {

                  Feeder f = new Feeder("小李");

                  // 饲养员小李喂养一只狮子

                  f.feedLion(new Lion());

                  // 饲养员小李喂养十只猴子

                  for (int i = 0; i < 10; i++)

                 {

                         f.feedMonkey(new Monkey());

                  }

                 

                  // 饲养员小李喂养5只鸽子

                  for (int i = 0; i < 5; i++)

                 {

                         f.feedPigeon(new Pigeon());

                  }

          

           }

    }

    class Feeder

    {

           public String name;

           public Feeder(String name)

           {

                  this.name = name;

           }   

           public void feedLion(Lion l)

           {

                  l.eat();

      }

      public void feedPigeon(Pigeon p)

           {

                  p.eat();

           }

           public void feedMonkey(Monkey m)

           {

                  m.eat();

           }

    }

    class Lion

    {

           public void eat()

           {

                  System.out.println("我不吃肉谁敢吃肉!");

           }

    }

    class Monkey

    {

           public void eat()

           {

                  System.out.println("我什么都吃,尤其喜欢香蕉。");

           }

    }

    class Pigeon

    {

           public void eat()

           {

                  System.out.println("我要减肥,所以每天只吃一点大米。");

           }

    }

      结果截图:

         

                         public class Zoo

    {

           public static void main(String args[])

           {

                  Feeder f = new Feeder("小李");

                  // 饲养员小李喂养一只狮子

                  f.feedLion(new Lion());

                  // 饲养员小李喂养十只猴子

                  for (int i = 0; i < 10; i++)

                 {

                         f.feedMonkey(new Monkey());

                  }

                 

                  // 饲养员小李喂养5只鸽子

                  for (int i = 0; i < 5; i++)

                 {

                         f.feedPigeon(new Pigeon());

                  }

          

           }

    }

    class Feeder

    {

           public String name;

           public Feeder(String name)

           {

                  this.name = name;

           }

          

           public void feedLion(Lion l)

           {

                  l.eat();

           }

          

           public void feedPigeon(Pigeon p)

           {

                  p.eat();

           }

          

           public void feedMonkey(Monkey m)

           {

                  m.eat();

           }

    }

    class Lion

    {

           public void eat()

           {

                  System.out.println("我不吃肉谁敢吃肉!");

           }

    }

    class Monkey

    {

           public void eat()

           {

                  System.out.println("我什么都吃,尤其喜欢香蕉。");

           }

    }

    class Pigeon

    {

           public void eat()

           {

                  System.out.println("我要减肥,所以每天只吃一点大米。");

           }

    }

      结果截图:

         

      zoo2:

      代码:

          

    public class Zoo

    {

     

       

       public static void main(String args[])

       {

     

               Feeder f = new Feeder("小李");

     

               //饲养员小李喂养一只狮子

     

               f.feedAnimal(new Lion());

               //饲养员小李喂养十只猴子

     

               for (int i = 0; i < 10; i++)

          {

     

                   f.feedAnimal(new Monkey());

      

            }

     

               //饲养员小李喂养5只鸽子

     

               for (int i = 0; i < 5; i++)

          {

     

                   f.feedAnimal(new Pigeon());

     

               }

     

        }

     

    }

     

     

    class Feeder

    {

     

     

        public String name;

     

     

        Feeder(String name)

        {

     

            this.name = name;

     

        }

     

       

        public void feedAnimal(Animal an)

       {

     

            an.eat();

     

        }

     

    }

     

     

    abstract class Animal

    {

     

     

        public abstract void eat();

     

    }

     

     

    class Lion extends Animal

    {

     

     

        public void eat()

       {

     

            System.out.println("我不吃肉谁敢吃肉!");

     

        }

     

    }

     

     

    class Monkey extends Animal

    {

     

     

        public void eat()

        {

     

            System.out.println("我什么都吃,尤其喜欢香蕉。");

     

        }

     

    }

     

     

    class Pigeon extends Animal

    {

     

       

        public void eat()

        {

     

            System.out.println("我要减肥,所以每天只吃一点大米。");

     

        }

     

    }

      结果截图:

     

      zoo3:

      代码:

          

    public class Zoo {

     

        public static void main(String args[]) {

            Feeder f = new Feeder("小李");

            Animal[] ans = new Animal[16];

     

            //饲养员小李喂养一只狮子

            ans[0] = new Lion();

            //饲养员小李喂养十只猴子

            for (int i = 0; i < 10; i++) {

                ans[1 + i] = new Monkey();

            }

            //饲养员小李喂养5只鸽子

            for (int i = 0; i < 5; i++) {

                ans[11 + i] = new Pigeon();

            }

     

            f.feedAnimals(ans);

        }

    }

     

    class Feeder {

     

        public String name;

     

        Feeder(String name) {

            this.name = name;

        }

     

        public void feedAnimals(Animal[] ans) {

            for (Animal an : ans) {

                an.eat();

            }

        }

    }

     

    abstract class Animal {

     

        public abstract void eat();

    }

     

    class Lion extends Animal {

     

        public void eat() {

            System.out.println("我不吃肉谁敢吃肉!");

        }

    }

     

    class Monkey extends Animal {

     

        public void eat() {

            System.out.println("我什么都吃,尤其喜欢香蕉。");

        }

    }

     

    class Pigeon extends Animal {

     

        public void eat() {

            System.out.println("我要减肥,所以每天只吃一点大米。");

        }

    }

           结果截图:

      zoo4:

        代码:

            

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

            }

        }

    }

     

    abstract class Animal {

     

        public abstract void eat();

    }

     

    class Lion extends Animal {

     

        public void eat() {

            System.out.println("我不吃肉谁敢吃肉!");

        }

    }

     

    class Monkey extends Animal {

     

        public void eat() {

            System.out.println("我什么都吃,尤其喜欢香蕉。");

        }

    }

     

    class Pigeon extends Animal {

     

        public void eat() {

            System.out.println("我要减肥,所以每天只吃一点大米。");

        }

    }

        结果截图:

    五.用多态方法模拟ATM操作流程

    import java.util.*;
    public class ShowATM {
    @SuppressWarnings("resource")
    public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
    ATM atm=new ATM();
    int choose=0,num=0;
    String pw="";
    next:while(true){
    System.out.println("是否进入账户(0否1是):");
    int kk=in.nextInt();
    if(kk==0) break;
    else if(kk!=1){
    System.out.println("输入错误!");
    continue;
    }
    System.out.println("输入账户密码:");
    pw=in.next();
    if(atm.ifPass(pw)){
    while(true){
    showFace();
    choose=in.nextInt();
    switch(choose){
    case 1:
    System.out.println("输入存款金额:");
    num=in.nextInt();
    atm.save(num);
    System.out.println("存款成功!");
    System.out.println("当前余额:"+atm.getRest()+"元");
    break;
    case 2:
    System.out.println("请选择:");
    int a[]={100,500,1000,1500,2000,5000};
    for(int i=0;i<a.length;i++)
    System.out.println((i+1)+"."+a[i]+"元");
    System.out.println("7.其他");
    int ch=in.nextInt();
    if(ch>=1&&ch<=6){
    if(atm.withdraw(a[ch-1]))
    System.out.println("取款成功!");
    else
    System.out.println("余额不足!");
    }
    else if(ch==7){
    System.out.println("请输入取款金额:");
    num=in.nextInt();
    if(atm.withdraw(num))
    System.out.println("取款成功!");
    else 
    System.out.println("余额不足!");
    }
    else 
    System.out.println("输入有误!");
    System.out.println("当前余额:"+atm.getRest()+"元");
    break;
    case 3:
    System.out.println("账户号:");
    String s=in.next();
    System.out.println("转账金额:");
    int i=in.nextInt();
    if(atm.transfer(s, i))
    System.out.println("转账成功!");
    else
    System.out.println("转账失败!");
    System.out.println("当前余额:"+atm.getRest()+"元");
    break;
    case 4:
    System.out.println("输入六位数密码:");
    String p=in.next();
    atm.setPassword(p);
    break;
    case 5:
    System.out.println("当前余额:"+atm.getRest()+"元");
    break;
    default:
    continue next;
    }
    }
    }
    else
    System.out.println("密码错误!");
    }
    }
    //显示菜单方法
    public static void showFace(){
    System.out.println("********************");
    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("********************");
    System.out.println("请选择:");
    }
    }

    class PersonalAccount{
    private String passWord="123456";
    @SuppressWarnings("unused")
    private String number;//银行卡号
    private int money=0;
    public int getMoney(){return money;}
    public void setPw(String s){passWord=s;}
    public void addMoney(int x){money+=x;}
    public void minusMoney(int x){money-=x;}
    public boolean whetherPwTrue(String s){
    if(s.equals(passWord))
    return true;
    else return false;
    }
    }
    abstract class PATM{
    public abstract boolean withdraw(int x);
    public abstract void save(int x);
    public abstract boolean transfer(String s,int x);
    public abstract boolean ifPass(String s);
    public abstract int getRest();
    public abstract void setPassword(String s);//设置密码
    }
    class ATM extends PATM{
    private String numbers[]={"3235635","3256894",
    "3265894","6589458"};
    private PersonalAccount account=new PersonalAccount();
    public boolean withdraw(int x) {
    if(x>account.getMoney())
    return false;
    else{
    account.minusMoney(x);
    return true;
    }
    }
    public void save(int x) {
    account.addMoney(x);
    }
    public boolean transfer(String s, int x) {

    boolean flag=false;
    for(int i=0;i<numbers.length;i++)
    if(s.equals(numbers[i])) flag=true;
    if(x>account.getMoney()) flag=false;
    if(x<=account.getMoney()&&flag) account.minusMoney(x);;
    return flag;
    }
    public boolean ifPass(String s) {
    return account.whetherPwTrue(s);
    }
    public int getRest() {
    return account.getMoney();
    }
    public void setPassword(String s) {
    account.setPw(s); 
    }
    }

  • 相关阅读:
    ceph 网络配置
    Centos7.2 下DNS+NamedManager高可用部署方案完整记录
    Mysql多实例数据库
    Mysql 基础
    搭建本地YUM仓库
    Go实现线程安全的缓存
    KubeEdge安装详细教程
    Kubeedge实现原理
    Go语言中new()和make()的区别
    Go语言中append()函数的源码实现在哪里?
  • 原文地址:https://www.cnblogs.com/gong123/p/6079167.html
Copyright © 2011-2022 走看看