JSD-2204-面向对象-方法重写-潜艇游戏--Day10
1. 向上造型:
- 超类型的引用指向派生类的对象
- 能点出来什么,看引用的类型-------------这是规定,记住就可以了
package ooday04;//向上造型的演示public class UploadDemo {public static void main(String[] args) {Aoo o1 = new Aoo();o1.a = 1;o1.show();//o1.b = 2; //编译错误,超类不能访问派生类的//o1.test(); //编译错误Boo o2 = new Boo();o2.b = 1;o2.test();o2.a = 2; //正确,派生类可以访问超类的o2.show(); //正确Aoo o3 = new Boo(); //向上造型o3.a = 1;o3.show();//o3.b = 2; //编译错误,能点出来什么,看引用的类型//o3.test(); //编译错误}}class Aoo{int a;void show(){}}class Boo extends Aoo{int b;void test(){}}
Person[] ps = new Person[7];ps[0] = new Student("zhangsan",25,"LF","111"); //向上造型ps[1] = new Student("lisi",24,"JMS","222");ps[2] = new Student("wangwu",26,"SD","333");ps[3] = new Teacher("zhaoliu",36,"SX",20000.0);ps[4] = new Teacher("sunqi",45,"LF",30000.0);ps[5] = new Doctor("qinba",46,"JMS","主任医师");ps[6] = new Doctor("gaojiu",35,"SD","主治医师");for(int i=0;i<ps.length;i++){ //遍历所有人ps[i].sayHi(); //每个人都跟大家问好}
2. 方法的重写(override/overriding):重新写、覆盖
- 发生在父子类中,方法名相同,参数列表相同
- 重写方法被调用时,看对象的类型-------这是规定,记住就可以了
class 餐馆{void 做餐(){ 做中餐 }}//1)我还是想做中餐---------------不需要重写class Aoo extends 餐馆{}//2)我想改做西餐-----------------需要重写class Aoo extends 餐馆{void 做餐(){ 做西餐 }}//3)我想在中餐基础之上加入西餐-----需要重写(先super中餐,再加入西餐)class Aoo extends 餐馆{void 做餐(){super.做餐();做西餐}}
public class Test {public static void main(String[] args) {//将学生/老师/医生统一装到Person数组中,只需要一个for即可//向上造型的好处----实现了代码复用,后期扩展、维护也相当方便Person[] ps = new Person[7];ps[0] = new Student("zhangsan",25,"LF","111"); //向上造型ps[1] = new Student("lisi",24,"JMS","222");ps[2] = new Student("wangwu",26,"SD","333");ps[3] = new Teacher("zhaoliu",36,"SX",20000.0);ps[4] = new Teacher("sunqi",45,"LF",30000.0);ps[5] = new Doctor("qinba",46,"JMS","主任医师");ps[6] = new Doctor("gaojiu",35,"SD","主治医师");for(int i=0;i<ps.length;i++){ //遍历所有人ps[i].sayHi(); //每个人都跟大家问好}//能点出什么来,和,到底调用的是哪个-----一定要分开看//重写方法被调用时,看对象的类型Student z = new Student("zhangsan",25,"LF","111");Person p = new Student("zhangsan",25,"LF","111");z.sayHi(); //调用Student类的sayHi()p.sayHi(); //调用Student类的sayHi()}}class Person{String name;int age;String address;Person(String name,int age,String address){this.name = name;this.age = age;this.address = address;}void sayHi(){System.out.println("大家好,我叫"+name+",今年"+age+"岁了,家住"+address);}}class Student extends Person{String stuId; //学号Student(String name,int age,String address,String stuId){super(name,age,address);this.stuId = stuId;}void sayHi(){System.out.println("大家好,我叫"+name+",今年"+age+"岁了,家住"+address+",学号为"+stuId);}}class Teacher extends Person{double salary; //工资Teacher(String name,int age,String address,double salary){super(name,age,address);this.salary = salary;}void sayHi(){System.out.println("大家好,我叫"+name+",今年"+age+"岁了,家住"+address+",工资为"+salary);}}class Doctor extends Person{String level; //职称Doctor(String name,int age,String address,String level){super(name,age,address);this.level = level;}}
- 重写需要遵循"两同两小一大"原则:-------了解,一般都是一模一样的
- 两同:
- 方法名相同
- 参数列表相同
- 两小:
- 派生类方法的返回值类型小于或等于超类方法的
- void和基本类型时,必须相同
- 引用类型时,小于或等于
- 派生类方法抛出的异常小于或等于超类方法的---------------API时讲
- 派生类方法的返回值类型小于或等于超类方法的
- 一大:
- 派生类方法的访问权限大于或等于超类方法的---------------下次课讲
//超类大,派生类小class Coo{void show(){}double test(){ return 0.0; }Student say(){ return null; }Person sayHi(){ return null; }}class Doo extends Coo{//int show(){ return 1; } //编译错误,void时必须相同//int test(){ return 0; } //编译错误,基本类型时必须相同//Person say(){ return null; } //编译错误,引用类型时必须小于或等于Student sayHi(){ return null; } //正确,Student小于Person}
3. 重写与重载的区别:
- 重写(override/overriding):
- 发生在父子类中,方法名相同,参数列表相同
- 重载(overload/overloading):
- 发生在同一类中,方法名相同,参数列表不同
4. 潜艇游戏第四天:
- 将侦察潜艇数组、鱼雷潜艇数组、水雷潜艇数组统一组合成SeaObject数组,并测试
- 在6个派生类中重写move()移动,并测试
- 画窗口:----------在World类中
- import JFrame+JPanel
- 设计World类继承JPanel-----------这步特别容易忘记
- main中代码:CV大法
4.1列表展示
4.2Battleship类
package cn.tedu.submarine;import java.util.Objects;/*** 战舰*/
public class Battleship extends SeaObject{/*** 命*/private int life;public Battleship() {super(66,26,270,124,5);this.life = 5;}@Overridepublic void move() {}/*** 发射炸弹的方法*/public void shootBomb(){}}
4.3Bomb类
package cn.tedu.submarine;import java.util.Objects;/*** 炸弹*/
public class Bomb extends SeaObject{public Bomb(int x , int y) {super(9,12,x,y,3);}/*** 炸弹移动的方法*/@Overridepublic void move() {y += speed;}}
4.4Mine类
package cn.tedu.submarine;import java.util.Objects;/*** 水雷*/
public class Mine extends SeaObject{public Mine(int x , int y) {super(11,11,x,y,1);}/*** 水雷移动的方法*/@Overridepublic void move() {y-=speed;}}
4.5MineSubMarine类
package cn.tedu.submarine;import java.util.Objects;
import java.util.Random;/*** 水雷潜艇*/
public class MineSubmarine extends SeaObject{public MineSubmarine() {super(63,19);}@Overridepublic void move() {x+=speed;}}
4.6ObserverSubMarine类
package cn.tedu.submarine;import java.util.Objects;
import java.util.Random;/*** 侦察潜艇*/
public class ObserverSubmarine extends SeaObject{public ObserverSubmarine() {super(63,19);}@Overridepublic void move() {x+=speed;}
}
4.7TorpedoSubmarine类
package cn.tedu.submarine;import java.util.Objects;
import java.util.Random;/*** 鱼类潜艇*/
public class TorpedoSubmarine extends SeaObject{public TorpedoSubmarine() {super(64,20);}/*** 鱼类潜艇移动的方法*/@Overridepublic void move() {x+=speed;}}
4.8SeaObject类
package cn.tedu.submarine;import java.util.Random;/*** 海洋对象*/
public abstract class SeaObject {/*** 宽*/protected int width;/*** 高*/protected int height;/*** x轴*/protected int x;/*** y轴*/protected int y;/*** 速度*/protected int speed;public SeaObject(int width,int height,int x , int y,int speed){this.width = width;this.height = height;this.x = x;this.y = y;this.speed = speed;}public SeaObject(int width,int height){this.width = width;this.height = height;Random rand = new Random();x = -width;y = rand.nextInt(479-height-150+1 ) +150;this.speed = rand.nextInt(3)+1;}/*** 移动的方法*/public abstract void move();
}
4.9World(测试类)
package cn.tedu.submarine;import javax.swing.*;/*** 整个游戏世界*/
public class World extends JPanel {public static void main(String[] args) {JFrame frame = new JFrame();World world = new World();world.setFocusable(true);frame.add(world);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(641+16,479+39);frame.setLocationRelativeTo(null);frame.setVisible(true);/*ObserverSubmarine os = new ObserverSubmarine();System.out.println("原始数据---- x:"+os.x+",y:"+os.y+",speed:"+os.speed);os.move();System.out.println("移动后数据---- x:"+os.x+",y:"+os.y+",speed:"+os.speed);TorpedoSubmarine ts = new TorpedoSubmarine();System.out.println("原始数据---- x:"+ts.x+",y:"+ts.y+",speed:"+ts.speed);ts.move();System.out.println("移动后数据---- x:"+ts.x+",y:"+ts.y+",speed:"+ts.speed);MineSubmarine ms = new MineSubmarine();System.out.println("原始数据---- x:"+ms.x+",y:"+ms.y+",speed:"+ms.speed);ms.move();System.out.println("移动后数据---- x:"+ms.x+",y:"+ms.y+",speed:"+ms.speed);Bomb b = new Bomb(150,300);System.out.println("原始数据---- x:"+b.x+",y:"+b.y+",speed:"+b.speed);b.move();System.out.println("移动后数据---- x:"+b.x+",y:"+b.y+",speed:"+b.speed);Mine m = new Mine(100,120);System.out.println("原始数据---- x:"+m.x+",y:"+m.y+",speed:"+m.speed);m.move();System.out.println("移动后数据---- x:"+m.x+",y:"+m.y+",speed:"+m.speed);// Battleship s = new Battleship();
// System.out.println(s.x+","+s.y+","+s.speed);
// s.move();
// SeaObject[] subMarines = new SeaObject[5];
// subMarines[0] = new ObserverSubmarine();
// subMarines[1] = new MineSubmarine();
// subMarines[2] = new TorpedoSubmarine();
// subMarines[3] = new ObserverSubmarine();
// subMarines[4] = new TorpedoSubmarine();
//
// for (int i = 0; i < subMarines.length; i++) {//遍历所有的潜艇
// SeaObject so = subMarines[i];
// System.out.println(so.x+","+so.y+","+so.speed);
// subMarines[i].move();
// }
//
// ObserverSubmarine[] oses = new ObserverSubmarine[3];
// oses[0] = new ObserverSubmarine();
// oses[1] = new ObserverSubmarine();
// oses[2] = new ObserverSubmarine();
// for (int i = 0; i < oses.length; i++) {
// System.out.println(oses[i].x+","+oses[i].y+","+oses[i].speed);//输出每个侦察挺的x和y坐标
// oses[i].move();
// }
// Bomb[] bs = new Bomb[3];
// bs[0] = new Bomb(100,522);
// bs[1] = new Bomb(145,243);
// bs[2] = new Bomb(113,443);
// for (int i = 0; i < bs.length; i++) {
// Bomb b = bs[i];
// System.out.println(b.x+","+b.y+","+b.speed);
// bs[i].move();
// //炸弹移动
// //炸弹打潜艇
// }
//
// Mine[] ms = new Mine[2];
// ms[0] = new Mine(241,22);
// ms[1] = new Mine(341,112);
// for (int i = 0; i < ms.length; i++) {
// Mine m = ms[i];
// System.out.println(m.x+","+m.y+","+m.speed);
// ms[i].move();
// }*/}
}
5. 补充:
继承要符合is(是)的关系
5.1超类的意义:
- 封装共有的属性和行为------------------代码复用
- 为所有派生类提供统一的类型---------向上造型(代码复用)
5.2 明日单词:
1)override:重写2)package:包3)import:导入4)public:公开的5)protected:受保护的6)private:私有的7)card:卡8)id:号码9)password/pwd:密码10)balance:余额11)pay:支付12)money:金额13)check:检查14)static:静态的15)image:图片16)icon:图标17)get:获取18)status:状态
JSD-2204-面向对象-方法重写-潜艇游戏--Day10相关推荐
- Java面向对象学习练习———潜艇游戏(飞机游戏)
潜艇游戏需求: 所参与的角色: 战舰.深水炸弹.侦察潜艇.鱼雷潜艇.水雷潜艇.水雷 角色间的关系: 战舰发射深水炸弹 深水炸弹可以打潜艇(侦察潜艇.鱼雷潜艇.水雷潜艇),若打中: 潜艇消失.深水炸弹消 ...
- 第三次学JAVA再学不好就吃翔(part32)--方法重写
学习笔记,仅供参考 文章目录 面向对象 方法重写 方法重写的注意事项 面向对象 方法重写 什么是方法重写 重写:子父类出现了一模一样的方法 方法重写的应用: 当子类需要父类的功能,而功能主体子类有自己 ...
- day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上/下造型,main方法,抽象类,接口,设计模式,异常,内部类
1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...
- 面向对象实战(潜艇大战小游戏)
潜艇游戏需求: 所参与的角色: 战舰.深水炸弹.侦察潜艇.鱼雷潜艇.水雷潜艇.水雷 角色间的关系: 战舰发射深水炸弹 深水炸弹可以打潜艇(侦察潜艇.鱼雷潜艇.水雷潜艇),若打中: 潜艇消失.深水炸弹消 ...
- day03--java基础编程:面向对象,构造方法,代码块讲解,this super,static,final,访问修饰符,方法重写,向上_下造型,main方法,抽象类,接口,设计模式,异常,内部类
1 Day06–面向对象1 1.1 面向对象 1.1.1 概念 推荐看的书:Thinking in java 概念:所谓的面向对象是一种编程思想,通过这种思想可以把生活中的复杂事情变得简单化,从原来的 ...
- 27、Python 面向对象(创建类、创建实例对象、访问属性、内置类属性、对象销毁、类的继承、方法重写、基础重载方法、运算符重载、类属性与方法、下划线双下划线)
27Python面向对象(Python2) Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. ...
- 20面向对象三特征 之继承 方法重写 super
继承是:多个类有重复内容,把重复内容放到一个新类中,就可以通过extends关键词去让原来的类和新类产生继承关系,子类只能拿到父类一部分信息.通过extends关键词去指明类与类之间的关系,一个父类可 ...
- Java-Day12 面向对象的三大特征之封装、继承,单例模式(饿汉式、懒汉式)、方法重写 (覆盖)、注解 (annotation)、super关键字、对象的创建流程超详细
目录 1. 面向对象的三大特征之封装 1.1 封装的含义 1.2 封装的目的 1.3 封装的优点 1.4 封装的实现过程 1.5 拓展知识:JavaBean 2. 面向对象的三大特征之继承 2.1 继 ...
- Java基础【之】面向对象编程(封装、继承(extends、方法重写、super)、多态(动态绑定、重载/重写)、代码实现)
Java基础[之]面向对象编程(封装.继承.多态.代码实现) 1.封装 2.继承 2.1.extends 2.2.方法重写 2.3.super 3.多态 3.1.对象的多态.方法的多态 3.2.动态绑 ...
最新文章
- 笔试算法题(55):快速排序实现之三路划分, 三元中值法和插入排序处理小子文件...
- 英国政府开源了其大规模监控软件
- 场景创新,推动金融行业数字化转型
- python 按从小到大的顺序组合成一个字典_Python实现字典排序、按照list中字典的某个key排序的方法示例...
- 收集实用的MySQL使用技巧
- Java版大顶堆的实现
- python创建二维空列表_python定义二维空数组
- phpstorm如何同时打开两个文件夹_iPhone如何同时添加两个不同的面容ID?
- 六石管理学:你觉得别人错了,应该怎么办
- MongoDB的性能优化
- 刷流量php网站源码,在线模拟刷网站PV流量源码
- 感性电路电流计算_三相电的电功率的计算公式_200KW三相四线制线路,需要多少A电源空开?...
- ECMAScript 面试题目
- libapache2-mod-php5 apache,Debian Etch libapache2-mod-php5 with bundled libgd
- php小偷cookie,ptcms小说小偷程序 最新EXP漏洞
- 2022/1/17 位运算
- 关于安卓启动模拟器时出现~~~~have you declared this activity in your AndroidMainfest.xml?问题
- Microsoft Office SharePoint Server 2007的文件目录结构
- 计算机教师格言座右铭,教师人生格言座右铭
- jquery仿凡客诚品图片切换的效果实例代码
热门文章
- stylegan2 浅层实现
- amd 显卡 linux驱动程序,狂追NV AMD发布新版Linux开源显卡驱动
- Windows 10 快速检查修复系统
- 游戏计算机概率,不是学霸都不好意思玩游戏了!玩家用高数和概率学计算收益...
- cpc按点击计算怎么算_如何计算快递运费、物流运费报价怎么算?
- 爱尔眼科四川省区2023“集善扶困(贫)健康行”公益行动圆满收官
- 暗影格斗三一直显示没有服务器,暗影格斗31.25.5
- 初学爬虫-veer图片下载
- 香港贸发局香港玩具展即将于2019新年揭幕
- android-魔法泡泡动画分析(附源码)