JAVA动手动脑多态
动手实验一:下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?
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动手动脑多态的更多相关文章
- Java动手动脑——多态和继承
Java动手动脑——继承和多态 实验一 预估输出答案:100 200 201 202 输出结果:100 200 201 202 输出答案分析:100 创建parent类的对象,调用对象的方 ...
- java动手动脑和课后实验型问题String类型
1.请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? true true false 总结: 使用new关键字创建字符串对象时, 每次申请 ...
- java 动手动脑7
---恢复内容开始--- 一.动手动脑:多层的异常捕获-1 阅读以下代码(CatchWho.java),写出程序运行结果: ArrayIndexOutOfBoundsException/内层try-c ...
- java动手动脑和动手实验
动手动脑一: EnumTest.java: 程序代码: public class EnumTest { public static void main(String[] args) { Size s= ...
- java动手动脑和课后实验型问题第四讲
1.完全"手写代码实现"随机数生成 动手动脑: 编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数. Modulus=231-1=int.MaxValue Mult ...
- Java动手动脑第四讲课堂作业
动手动脑1 完全“手写代码实现”随机数生成 纯随机数发生器
- JAVA动手动脑异常处理
1>请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. import javax.swing.*; class AboutEx ...
- JAVA动手动脑
1.运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是 ...
- java动手动脑和课后实验型问题
1.以下代码的输出结果是什么?为什么会有这个结果? int[] a = { 5, 7, 20 }; System.out.println("a数组中的元素:"); // 循环输出a ...
随机推荐
- Protobuf3 + Netty4: 在socket上传输多种类型的protobuf数据
Protobuf序列化的字节流数据是不能自描述的,当我们通过socket把数据发送到Client时,Client必须知道发送的是什么类型的数据,才能正确的反序列化它.这严重影响限制了C/S功能的实现, ...
- tomcat 7+ 启动慢 熵池阻塞变慢详解
原因: Tomcat 7/8都使用org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom类产生安全随机类SecureRan ...
- VS2015 使用 Web Deploy 发布网站到 WindowsServer2008 R2服务器详解
使用原因:由于开发期间需要将开发出的网站随时提交到服务器以便公司高层随时访问所以要求将开发出的网站每天发布到服务器,频繁度比较高,因此不能再使用之前的方式(发布到本地后再拷贝文件到服务器),所以想到了 ...
- Spring和EJB3的技术对比
随着EJB3规范以及支持EJB3的Java EE应用服务器的即将发布,全新Java EE体系架构的新战争将拉开帷幕,在过去3年中如火如荼的Spring占据了Java EE应用开发基础平台的大半江山,面 ...
- Echarts_1:水平柱体
Echarts:http://echarts.baidu.com/index.html 这下面是我自己总结的一些配置注释,分享~ 效果图: 小白小白小白小白小白小白小白小白小白小白小白小白小白小白小白 ...
- 注册码_EditPlus3
1.来自"http://jingyan.baidu.com/article/67508eb4d78cfe9cca1ce488.html" Name: www.cnzz.cc Co ...
- Web后台开发技术 经验路线图
一篇文章:http://www.cnblogs.com/Hiker/archive/2012/11/04/houtaijishu.html
- 一个View的子类实例化
View子类的实例化.如果是在activity中通过findViewById的形式实例化,那么它的具体的构造函数是什么呢,看看父类View的源码就容易发现是 通过这个构造函数实例化的 public V ...
- [WPF]TextTrimming截断后,ToolTip显示完整信息
文本过长被截断后,用ToolTip显示完整信息. 文本未被截断,则不显示ToolTip. 值转换器: public class TrimmedTextBlockVisibilityConverter ...
- swift_Dictionary 字典
// // main.Swift // 字典 // // Created by zhangbiao on 14-6-15. // Copyright (c) 2014年 理想. All rig ...