一、
现在有三个类: class Mammal{} class Dog extends Mammal {} class Cat extends Mammal{} 针对每个类定义三个变量并进行初始化 Mammal m=null ; Dog d=new Dog(); Cat c=new Cat();下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么? m=d; d=m; d=(Dog)m; d=c; c=(Cat)m;先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确。
错误在: d=m; d=c;基类给子类赋值时没有进行强制类型转化。不是继承关系的类之间不能进行赋值。
二、
1. 左边的程序运行结果是什么? 2. 你如何解释会得到这样的输出? 3. 计算机是不会出错的,之所以得 到这样的运行结果也是有原因的, 那么从这些运行结果中,你能总 结出Java的哪些语法特性?
(1)结果:
Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201
(2)解释原因与Java语法特性:
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。 这个特性实际上就是面向对象“多态”特性的具体表现。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如果子类被当作父类使用,则通过子类访问的字段是父类的!
三、
让我们看一个开发场景: 某动物园有一饲养员小李, 每天需要给他所负责饲养的狮子、猴子和鸽子喂食。 请用一个程序来模拟他喂食的过程。三种动物对应三个类,每个类定义一个eat()方法,表示吃饲养员给它们的食物再设计一个Feeder类代表饲养员,其name字段保存饲养员名字,三个方法分别代表喂养三种不同的动物,其参数分别引用三种动物对象。
这种编程方式有什么不合理的地方吗?
编写语句太复杂,麻烦。进行修改时,需要进行大规模的变动。
4.ATM机:
源代码:
package K;
import java.util.Scanner;
abstract class A{
abstract void qukuan();
abstract void cunkuan();
abstract void zhuan(ATM a);
}
class ATM extends A{
Scanner scanner =new Scanner(System.in);
double money;
String kahao;
int mima;
String name;
String getkahao()
{
return kahao;
}
void showmoney()
{
System.out.println("1 100元"+" 2 500元"+" 3 1000元");
System.out.println("4 1500元"+" 5 2000元"+" 6 5000元");
}
void setmoney(double a)
{
money = a;
}
double getmoney()
{
return money;
}
void setmima(int a)
{
mima = a;
}
int getmima()
{
return mima;
}
void setkahao(String a)
{
kahao = a;
}
String getname()
{
return name;
}
void setname(String a)
{
name = a;
}
void show()
{
System.out.println("姓名"+" "+name+" 卡号"+" "+kahao+" ");
}
void qukuan()
{
showmoney();
System.out.println("请输入取款数额:");
int j = scanner.nextInt();
setmoney(getmoney()-j);
System.out.println("取款成功!");
}
void cunkuan()
{
System.out.println("请输入存款的数额:");
double b = scanner.nextDouble();
setmoney(getmoney()+b);
System.out.println("存款成功!");
}
void zhuan(ATM a1)
{
System.out.println("请输入卡号:");
String e = scanner.next();
if(a1.getkahao().equals(e))
{
System.out.println("请输入转的数额:");
double b = scanner.nextDouble();
a1.setmoney(a1.getmoney()+b);
setmoney(getmoney()-b);
System.out.println("转账成功!");
}
else{System.out.println("转账失败!");}
}
}
public class DIII {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int i;int l = 1;
ATM a = new ATM();
ATM a1 = new ATM();
a.setmima(000000);a.setname("迪迦");a.setmoney(10000000);a.setkahao("sssssssssss1");
a1.setmima(000000);a1.setname("卡布达");a1.setmoney(100000000);a1.setkahao("qqqqqqqqqqq1");
a.show();
a1.show();
while(l==1)
{
System.out.println("请输入密码(000000):");
int y = scanner.nextInt();
if(y==a.getmima())
{
System.out.println(" 1取款");
System.out.println(" 2退卡");
System.out.println(" 3存款");
System.out.println(" 4转账");
System.out.println("请输入操作前的数字:");
i = scanner.nextInt();
switch(i)
{
case 1:{a.qukuan();
break;
}
case 2:{
break;
}
case 3:{
a.cunkuan();break;
}
case 4:{
a.zhuan(a1);
break;
}
}
}
else
{
System.out.println("密码错误!");
}
}
}
}