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

m=d;

d=m;

d=(Dog)m;

d=c;

c=(Cat)m;

结论:

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

1.   左边的程序运行结果是什么?
2.   你如何解释会得到这样的输出?
3.   计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

运行结果截图:

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

}

}

结论:

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
这个特性实际上就是面向对象“多态”特性的具体表现。

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

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

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

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

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

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

请使用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操作流程。

package dome;
//2016.11.18    20153314    严鹏    多态法
import java.util.*;
public class S2{public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner in=new Scanner(System.in);
ATM atm=new ATM();
int choose=0,num=0,p2=1;
String pw;
System.out.println("输入账户密码:");
pw=in.next();
if(atm.ifPass(pw)){
while(p2==1){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("请选择:");
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;}
}
}
else
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{                //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{          //ATM继承抽象类来并实现抽象方法
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/ypbk/p/6078524.html

2016.11.18多态相关推荐

  1. 2016/11/18

    转载于:https://www.cnblogs.com/ccssnn/p/6078925.html

  2. Ubuntu 16.04 RTL8111/8168/8411 不能上网 经常断网解决办法 Author 时鹏亮 | 11/18/2016 = =这奇葩情况发生在从14.04升级到16.04之后,开始以

    Ubuntu 16.04 RTL8111/8168/8411 不能上网 经常断网解决办法 修改了其中wget的部分: 替换wget 这一段: 去这里下载 : https://github.com/mt ...

  3. U3D笔记11:47 2016/11/30-15:15 2016/12/19

    U3D笔记11:47 2016/11/30-15:15 2016/12/19 技术BLOG:http://www.unity.5helpyou.com/2373.html#comment-43108 ...

  4. 11.18 Apache用户认证 11.19/11.20 域名跳转 11.21 Apache访问日志

    2019独角兽企业重金招聘Python工程师标准>>> 11.18 Apache用户认证 htpasswd命令 >htpasswd命令是Apache的Web服务器内置工具,用于 ...

  5. [2020多校A层11.18] 三角田地(因式分解)

    [2020多校A层11.18] 三角田地 对于平面上一些点,求解所有与含有边与x轴平行和与y轴平行的三角形面积和 n<=100000 显然我们可以讨论每个直角顶点的贡献,然后本质上就是一个经典的 ...

  6. java 18.9_Oracle: Java 11 (18.9 LTS) 正式上线!

    美国时间9月25日,Oracle 官方表示, Java 11 (18.9 LTS) 正式上线!这是自 Java 8 后的第一个长期支持版本. Java 11 版本说明 按照 Oracle 公布的支持路 ...

  7. 问题六十七:ray tracing学习总结(2016.11.13, 2017.02.05)

    从2016.11.13开始接触ray tracing到今天2017.02.05,差不多80天的时间.截至当前,学习ray tracing的过程,也是我重新找回自己或者说是"find what ...

  8. Typora免费版本0.11.18

    Typora免费版本0.11.18 软件下载 mac版(0.11.18) 链接: https://pan.baidu.com/s/1VAPZ1ozA4CaBU6FnkoHRQw 提取码:9527 wi ...

  9. 针对Typora for Win v0.11.18最后一个免费版本安装后提示更新解决办法This beta version of Typora Q is expired

    安装Typora for Win v0.11.18打开后提示更新到最新版 This beta version of Typora Q is expired, please download and i ...

最新文章

  1. lsmod modinfo ....
  2. 浅析图片XSS中的哪些技术问题
  3. 第一篇文章,,测试效果,
  4. 密码学在区块链隐私保护中的应用学习
  5. 机器学习中qa测试_如何对机器学习做单元测试
  6. python字典文件,python-文件转字典,字典转文件
  7. SQL服务器引擎组件概览
  8. 免疫优化算法 matlab,基于人工免疫克隆选择算法的调度优化MATLAB源码
  9. LeetCode 96.不同的二叉搜索树(卡特兰数)
  10. 微服务框架和工具大全
  11. 关于Lambda表达式的简单理解,以及基础使用,仅限新手
  12. Openstack Nova network
  13. 黎曼的zeta函数(0)
  14. 2019-06-12-pintos 实验1
  15. 树莓派2022-04-04bullseye版本安装
  16. CDA数据分析师携手万宝盛华开启人才培训新篇章
  17. 《位置大数据隐私管理》—— 1.4 隐私泄露威胁
  18. win10 电脑右下角一直有小广告闪烁
  19. 最新最安全代理服务搭建(Websocket-Web-TLS)
  20. H3C 路由器智能选路NQA策略

热门文章

  1. 一些设计模式阐述,偏JAVA实现
  2. 实验室GPU管理神器Determined
  3. c语言程序代码中的间隔,printf()函数输出后 默认的间隔是多少
  4. 小红书 程序员七夕礼物 - 微信每日早安推送,简单无坑的最新教程
  5. Redis主从复制哨兵模式自动切换
  6. AutoCAD2014打开闪退的解决办法
  7. 【洛谷3110】【USACO14DEC】驮运Piggy Back
  8. 大数据算法在诸多领域“弄潮”
  9. 三维重建02技术介绍及学习路径
  10. 帮助文档的使用和制作