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 ...
随机推荐
- Netty系列之Netty高性能之道
转载自http://www.infoq.com/cn/articles/netty-high-performance 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Ne ...
- in_array,array_search的使用
写一个数组里面有小写a-z 大写A-Z 以及数字,把相似的数字和字母都剔除 无论大小写:将括号内的数字剔除(0,o,2,Z,1,i) $arr1 = range("a", ...
- 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 第一步 ...
- 远程执行shellcode
#include "Windows.h" #include <WinSock2.h> #include <stdio.h> #pragma comment( ...
- Web Service数据源
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 中国天气网放回json的解释
本文是出自David_Tang的,原文http://www.cnblogs.com/mchina/archive/2013/07/12/3170551.html {"weatherinfo& ...
- ASP.NET MVC bootstrap 3 ie 8兼容问题及错误解决(取消IE禁用IE脚本调试定位js文件错误)
因要做一个B/S架构的项目,使用MVC框架技术,本人不擅长页面设计美工,只好用bootstrap框架,在chrome内核系列的浏览器和IE 11中显示都没有问题,但是在 IE 8下显示却不正常,表格无 ...
- js 求点到直线的距离(由2点确定的直线,求到第三点的距离)
需要用到2个数学公式 1,已知2点求其直线方程 2,点到直线的距离 1,Y=kX+b 分别将两点带入以上方程,求出k 和b 例如: p0={x:?,y:?}, p1={x:?,y:?} 可解得方程: ...
- android面试题
1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...
- js获取当前日期
var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1 ...