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

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. Netty系列之Netty高性能之道

    转载自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Ne ...

  2. in_array,array_search的使用

    写一个数组里面有小写a-z 大写A-Z 以及数字,把相似的数字和字母都剔除     无论大小写:将括号内的数字剔除(0,o,2,Z,1,i) $arr1 = range("a", ...

  3. vnc连接kali 2.0 报错:A problem has occurred and the system can't recover.

    kali版本: root@kali:~# uname -a Linux kali -kali1-amd64 # SMP Debian -7kali2 (--) x86_64 GNU/Linux 第一步 ...

  4. 远程执行shellcode

    #include "Windows.h" #include <WinSock2.h> #include <stdio.h> #pragma comment( ...

  5. Web Service数据源

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. 中国天气网放回json的解释

    本文是出自David_Tang的,原文http://www.cnblogs.com/mchina/archive/2013/07/12/3170551.html {"weatherinfo& ...

  7. ASP.NET MVC bootstrap 3 ie 8兼容问题及错误解决(取消IE禁用IE脚本调试定位js文件错误)

    因要做一个B/S架构的项目,使用MVC框架技术,本人不擅长页面设计美工,只好用bootstrap框架,在chrome内核系列的浏览器和IE 11中显示都没有问题,但是在 IE 8下显示却不正常,表格无 ...

  8. js 求点到直线的距离(由2点确定的直线,求到第三点的距离)

    需要用到2个数学公式 1,已知2点求其直线方程 2,点到直线的距离 1,Y=kX+b 分别将两点带入以上方程,求出k 和b 例如: p0={x:?,y:?}, p1={x:?,y:?} 可解得方程: ...

  9. android面试题

    1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...

  10. js获取当前日期

    var myDate = new Date();myDate.getYear();        //获取当前年份(2位)myDate.getFullYear();    //获取完整的年份(4位,1 ...