(1)子类和父类定义了一模一样的方法
·结果是100、200、200、200、201
·父类调用了子类的方法,但是方法中调用的变量是子类的变量
·自我总结:子类中的方法,如果调用同名变量,则调用的是子类的。
总结:
·当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
·这个特性实际上就是面向对象“多态”特性的具体表现。
·如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
·如果子类被当作父类使用,则通过子类访问的字段是父类的!
二、动手动脑
(1)动物园中的一个开发场景:某动物园有一饲养员小李,每天需要给他所负责饲养的狮子、猴子和鸽子喂食。请用一个程序来模拟他喂食的过程。(使用接口代替抽象基类)
·源代码
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("我要减肥,所以每天只吃一点大米。");
}
}
·结果
(2)多态实现ATM
·源代码
import java.util.Scanner;
import java.io.*;
public class Money{
static Kehu[] stu=new Kehu[100];
static int n=0;
static int j=0;
static boolean state=true;
static Scanner str=new Scanner(System.in);
public static void main( String args[])
{//姓名,账户,密码,日期,余额
stu[0]=new Kehu("王帆","wf","wfs","20161115",10000);
stu[1]=new Kehu("志浩","wf","wfs","20161115",10000);
n=2;
boolean state=true;
System.out.println("输入登陆密码 ");
String mima=str.next();
int q;
for(q=0;q<n;q++)
{
if(mima.equals(stu[q].getmima()))
{
j=q;
System.out.println("登陆成功!");
break;
}
}
if(q==n)
{System.out.println("用户输入错误密码,则提示该卡已被锁定,无法操作!");state=false;}
while(state)
{
/*System.out.println("输入登陆账号密码 ");
for(int i=0;i<n;i++)
{
if(str.next().equals(stu[i].getnum()))
if(str.next().equals(stu[i].getmima())){
j=i;
System.out.println("登陆成功!");}
else
System.out.println("失败!");
break;
}*/
menu();
switch(str.nextInt()){
case 1:
{