重写(Override):
定义:子类可以通过重写来解决父类中不适用的方法!重写一定是发生在父子的关系中!
重写的条件:
1.子类如果要重写父类不适用的方法,首先方法的定义要跟父类保持一致。方法体中的内容根据自己的逻辑来实现。重写不是必要的,具体看需求!
2.若子类重写了父类的方法,在运行之前调用的方法是父类的,但是运行之后执行的则是子类重写后的方法。 现象:调用父执行子!
3.遵循两同两小一大原则:
两同:方法名要相同,参数列表要相同。
两小:子类重写父类方法时,返回值类型要等于或者小于父类中的那个方法。
子类重写父类方法时,抛的异常要等于或小于父类中的那个方法(第二阶段会讲异常)
一大:子类重写父类方法时的访问权限要等于或大于父类中的那个方法(后续会讲)
测试类子类重写:
Student类重写
@Override
void sayHi() {
System.out.println("大家好,我叫" + this.name + ",今年已经" + this.age + "岁了!我的性别:"+this.sex+"我的学号是:"+stuId );
}
Teacher类重写
@Override
void sayHi() {//重写父类中的sayHi方法
System.out.println("大家好,我叫" + this.name + ",今年已经" + this.age + "岁了!我的性别:"+this.sex+"我的工资是:"+salary );
}
Doctor类重写
@Override
void sayHi() {
System.out.println("大家好,我叫" + this.name + ",今年已经" + this.age + "岁了!我的性别:"+this.sex+"我的职称是:"+ level );
}
修改项目中所有的子类 重写 父类的step方法
@Override
void step() {
System.out.println("战舰通过键盘左右运动...");
}
@Override
void step() {
System.out.println("深水炸弹y向下运动....");
}
@Override
void step() {
System.out.println("水雷y向上运动....");
}
@Override
void step() {
System.out.println("水雷潜艇x向右运动....");
}
@Override
void step() {
System.out.println("侦察潜艇x向右运动....");
}
@Override
void step() {
System.out.println("鱼雷y向上运动....");
}
@Override
void step() {
System.out.println("鱼雷潜艇x向右运动....");
}
重写强化:
重写的情况分类:
情况一:Boo子类 只想吃西餐 -----------不需要重写!
情况二:Boo子类 只想喝果汁 -----------需要重写!
情况三:Boo子类 又想吃西餐又想喝果汁 --------需要重写!
```java
class Aoo{ //父类
void eat(){
System.out.println("吃西餐");
}
}
class Boo extends Aoo{//子类
void eat(){
//情况三:
super.eat();//调用父类的eat方法
System.out.println("喝果汁");
}
}
-----------------------------
main{
Boo b = new Boo();
//b.eat();//吃西餐
情况二:
b.eat();//喝果汁
}
面试题:重写与重载的区别:
重写(Override/Overrideing):发生在父子关系中,方法名和参数列表要相同!
重载(Overload/Overloading):发生在同类中(继承过来的内容也算自己),方法名相同,参数列表不同。
class Aoo{
void show(){
}
}
class Boo extends Aoo{
void show(){ //发生了重写
}
}
------------------------------
class Aoo{
void show(){
}
}
class Boo extends Aoo{
void show(int a){ //发生了重载,因为Boo继承了Aoo Boo也有无参的show方法
}
}
解释:父类的step方法还是有用的,我们通过向上造型通过父类来管理子类时,可以为子类提供一个统一的”入口“step行为,具体执行时,具体看对象!
画窗口:
界面绘制相关的内容 不要求掌握,工作不用。
1.在GameWorld类上方导入两个功能:
javax.swing.JFrame 和 javax.swing.Jpanle
2.GameWorld类继承JPanle
3.在GameWorld类中写一个paintWorld方法,并在main中调用
/**
* 绘制窗口的方法
* */
void paintWorld(){
JFrame frame = new JFrame();
setFocusable(true);
frame.add(this);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口并结束程序.
frame.setSize(641+16,479+39);//设置窗口大小
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
GameWorld gw = new GameWorld();
gw.paintWorld();//调用绘制窗口的方法
gw.action();//调用action方法进行创建各类对象
}
package(包)
如果仅仅类名为唯一标识的话,很有可能会冲突。
1000个类的话,要起1000个类名,所以java设计了包(package)。
作用:避免类命名的冲突。
现象:同一个包是不可以起同名类。
包的命名:建议全小写
域名反写.项目名称.模块名称.类名。
import(导入)
1.当前使用的类,是属于同一个包下的,那么不需要导包直接可以访问。
2.不同包下的类,若想使用,需要通过import类的全名(包名.类名)来进行才可以用!
package day01;
class A{ // day01.A
}
--------------
package day02;
class A{// day02.A
}