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

原文地址:https://www.cnblogs.com/gong123/p/6079167.html