动手实验一:下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

m=d;

d=m;

d=(Dog)m;

d=c;

c=(Cat)m;

先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确:

java中基类对象不能当做子类对象使用,需要用强制转换来实现,子类对象变量=(子类名)基类对象名;错误的代码是d=m; d=c;

错误原因:类型不匹配:不能从 Mammal 转换为 Dog。

动手实验二:运行以下测试代码

 

 

 

 

上边的程序运行结果是什么?.你如何解释会得到这样的输出?计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?请务必动脑总结,然后修改或编写一些代码进行测试,验证自己的想法,最后再看后面的PPT给出的结论。

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

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

第一个value调用的是父类的方法,输出值为100

第二个value调用的是子类的方法,输出值为200

第三个中子类赋值给父类,因此调用了子类的方法,输出值为200

第四个中调用了子类的构造方法,但是value值为100,所以没有影响

第五个中调用的是子类的方法,value的值也是子类的

改写一:

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++;

System.out.println(parent.myValue);

System.out.println(child.myValue);

parent.printValue();

/*((Child)parent).myValue++;

System.out.println(parent.myValue);

System.out.println(child.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);

}

}

改写二:

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++;

System.out.println(parent.myValue);

System.out.println(child.myValue);

parent.printValue();*/

((Child)parent).myValue++;

System.out.println(parent.myValue);

System.out.println(child.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);

}

}

运行截图2:

编译器在编译上述代码时,采用的方法是“滞后绑定(late bind) ”,因为它在编译时无法知道到底调用哪个方法。

请使用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);

}

}

结果:

I'm father
100
I'm son
100
I'm daughter
100

◆强制的:一种隐 式做类型转换的方法。

◆重载的:将一个标志符用作多个意义。

◆参数的:为不同类型的参数提供相同的操作。

◆包含的:类包含关系的抽象操作。

多态依赖于类型和实现的分离,多用来把接口和实现分离。

ATM:import java.util.*;

//ATM的界面类

abstract class QuKuan

{

abstract int qukuan();

}

class ATMview extends QuKuan{

public Scanner sc = new Scanner(System.in);

public User user =new User(20153197,123456,20000.00);

//欢迎界面

public void welcome(){

System.out.println("请选择语言界面 1汉语  2英语");

int yuyan=sc.nextInt();

System.out.println("欢迎使用ATM自动取款机");

login();

}

//登陆

public void login(){

for(int i=3;i>0;i--){

System.out.println("请输入账号:");

int account = sc.nextInt();

System.out.println("请输入密码:");

int pwd = sc.nextInt();

if(account==20153197 && pwd==123456){

System.out.println("登陆成功!请继续你的操作");

menu();

}  else{

System.out.println("账号密码有误该卡已被锁定!");

}

}

System.exit(0);

}

public class User {

//账号

public int account;

//密码

public int pwd;

//余额

public double money;

//建立User的有参构造器

public User(int account,int pwd,double money){

this.account = account;

this.pwd = pwd;

this.money = money;

}

//存款

public void save(double money){

this.money+=money;

}

//取款

public void get(double money){

this.money-=money;

}

//查询

public double search(){

this.money=money;

return money;

}

public void zhuanzhang(double money)

{

this.money=money;

}

}

//菜单

public void menu(){

System.out.print("1存款2取款3查询余额4转账汇款5修改密码6退出");

int input = sc.nextInt();

switch(input){

//存款

case 1: saveView();

break;

//取款

case 2: getView();

break;

//查询余额

case 3: searchView();

break;

//转账汇款

case 4: zhuanzhangView();

break;

//修改密码

case 5: xiugaiView();

break;

case 6:System.out.println("系统已退出!欢迎下次光临");

break;

}

}

//存款的界面

public void saveView(){

System.out.println("请输入存款金额: ");

double money = sc.nextInt();

user.save(money+sc.nextInt());

menu();

}

//取款的界面

public void getView(){

System.out.println("请输入取款金额:1.100元   2.500元  3.1000元 4.1500元 5.2000元 6.5000元 7.其他金额 8.选择其他金额 9.退卡");

int qukuan=sc.nextInt();

if(sc.nextInt()==1);

double money=0;

if(money>user.money){

System.out.println("你的余额不足");

menu();

}else{

user.get(money+100);

System.out.println("已经取出100元");

System.out.println("请选择其他服务!!!");

}

menu();

}

//查询余额的界面

public void searchView(){

double money = user.search();

System.out.println("你的余额为:"+money);

menu();

}

//转账汇款的界面

public void zhuanzhangView()

{

System.out.println("请输入要存的账号");

int account=sc.nextInt();

System.out.println("请输入要转账的钱数");

int money=sc.nextInt();

}

//修改密码的界面

public void xiugaiView()

{

System.out.println("输入新的密码");

int pwd=sc.nextInt();

System.out.println("新的密码为:"+sc.nextInt());

System.out.println("请选择其他服务!!!");

menu();

}

int qukuan() {

// TODO Auto-generated method stub

return 0;

}

}

//Main方法调用

public class Testmain {

public static void main(String[]args){

ATMview view = new ATMview();

view.welcome();

}

}

JAVA动手动脑多态的更多相关文章

  1. Java动手动脑——多态和继承

    Java动手动脑——继承和多态 实验一 预估输出答案:100  200  201  202 输出结果:100  200  201  202 输出答案分析:100 创建parent类的对象,调用对象的方 ...

  2. java动手动脑和课后实验型问题String类型

    1.请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? true true false 总结: 使用new关键字创建字符串对象时, 每次申请 ...

  3. java 动手动脑7

    ---恢复内容开始--- 一.动手动脑:多层的异常捕获-1 阅读以下代码(CatchWho.java),写出程序运行结果: ArrayIndexOutOfBoundsException/内层try-c ...

  4. java动手动脑和动手实验

    动手动脑一: EnumTest.java: 程序代码: public class EnumTest { public static void main(String[] args) { Size s= ...

  5. java动手动脑和课后实验型问题第四讲

    1.完全"手写代码实现"随机数生成 动手动脑: 编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. Modulus=231-1=int.MaxValue Mult ...

  6. Java动手动脑第四讲课堂作业

    动手动脑1 完全“手写代码实现”随机数生成 纯随机数发生器

  7. JAVA动手动脑异常处理

    1>请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. import javax.swing.*; class AboutEx ...

  8. JAVA动手动脑

    1.运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是 ...

  9. java动手动脑和课后实验型问题

    1.以下代码的输出结果是什么?为什么会有这个结果? int[] a = { 5, 7, 20 }; System.out.println("a数组中的元素:"); // 循环输出a ...

随机推荐

  1. Discuz!模板解析语法

    <!--{eval echo autostart("); }--> PHP中使用template()函数显示已存在模板 在Discuz!程序执行中可以通过 include tem ...

  2. informix(懒得通用)

    1.create view  444(...)  as select ...from... 2.insert into select.......union  select     不支持 请分开写 ...

  3. 讯时网关IP对接PBX

    先配置呼入 1.在网关的中继线绑定号码 2.在路由表写入到PBX 路由到 pbx  IP     绑定的号码和路由的 fxo后面的数字要一致 3.在PBX 建一个sip中继,host为网关IP 4.创 ...

  4. Jquery页面初始化的4种方式

    <script src="Scripts/jquery-1.8.2.min.js"></script> <script type="text ...

  5. Silverlight安装成功后,提示安装

    Silverlight安装成功后,提示安装. 解决方法1: 刷新浏览器,重新打开. 解决方法2: 打开>控制面板>添加删除程序>找到Sliverlight那个,卸载它就对了,那些 S ...

  6. arguments的理解

    (function(){ return typeof arguments; })(); 无聊的时候看看网上的面试题.个人认为通过面试题可以对某个知识点能够更加认识,踩过坑才会明白坑是有多大.代码中经常 ...

  7. consul模板的说明2

    保证模板的正常执行 使用||true $ consul-template -template "in.ctmpl:out.file:service nginx restart || true ...

  8. 虚拟现实外包公司—焰火工坊CTO团队外包难把VR真正做起来,讲故事可能将伤害产业链

    CTO王明杨,带着他的焰火工坊,正在为自家VR播放器和系统的上线做最后准备.不少投资机构,有传言称包括小米在内巨头都试图染指VR领域,而上月上市的暴风影音正是倚靠VR的概念成功助推了其高股价.对此,王 ...

  9. Win7快速启动栏

    http://jingyan.baidu.com/article/456c463bbc1d140a583144cf.html 1. 在任务栏上右键 -> 工具栏 -> 新建工具栏.   在 ...

  10. 【A Global Line Matching Algorithm for 2D Laser Scan Matching in Regular Environment】

    只看了前面的部分,灭有看实验,觉得整体风格比较傻白甜,与我的想法不谋而合.简单明了,用起来应该比较方便. 初步探测:如果有直线,就给线性插值一下. 分级聚类:利用简单的阈值给聚类了一下,分成了段段. ...