面向对象第三天:
潜艇游戏第一天:
- 创建了6个类,创建World类并测试
潜艇游戏第二天:
- 给6个类设计构造方法,并测试
潜艇游戏第三天:
-
设计侦察潜艇数组、鱼雷潜艇数组、水雷潜艇数组、水雷数组、炸弹数组,并测试
-
设计SeaObject超类,6个类继承超类
-
给SeaObject类设计两个构造方法,6个派生类分别调用
-
将三种潜艇统一造型到SeaObject数组中,并测试
建议练习顺序:2、3、(1+4)
回顾: -------------------7:40上晚课
-
构造方法:构造函数、构造器、构建器--------------复用给成员变量赋初始值的代码
给成员变量赋初值,与类同名,没有返回值类型(连void都没有),new对象时被自动调用
若自己不写构造,则编译器默认提供一个无参构造方法,若自己写了,则不再默认提供
可以重载
-
this:指代当前对象,哪个对象调用方法它指的就是哪个对象
-
this.成员变量名----------------访问成员变量
当成员变量与局部变量同名时,若想访问成员变量,则this不能省略
-
-
null:表示空,没有指向对象,若引用的值为null,则该引用不能再进行任何操作了,若操作则发生NullPointerException空指针异常。
-
引用类型数组(上):
- 区别1:给引用类型数组的元素赋值时,需要new个对象
精华笔记:
-
引用类型数组(下):
- 区别1:给引用类型数组的元素赋值时,需要new个对象
- 区别2:若想访问引用类型数组元素的数据,需要通过数组元素去打点
-
继承:
-
作用:代码复用
-
通过extends实现继承
-
超类/父类:共有的属性和行为
派生类/子类:特有的属性和行为
-
派生类可以访问派生类的+超类的,但超类不能访问派生类的
-
一个超类可以有多个派生类,但一个派生类只能有一个超类-----------单一继承
-
具有传递性
-
java规定:构造派生类之前必须先构造超类
-
在派生类的构造方法中若没有调用超类的构造方法,则编译器默认super()调用超类的无参构造方法
-
在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供
注意:super()调用超类的构造方法,必须位于派生类构造方法的第一行
-
-
-
super:指代当前对象的超类对象
super的用法:
-
super.成员变量名--------------------------访问超类的成员变量
注意:当超类与派生类中包含同名成员变量时,访问超类成员变量,则必须用super.
-
super.方法名()-------------------------------调用超类的方法-------明天讲方法的重写时详细讲
-
super()-----------------------------------------调用超类的构造方法
-
-
向上造型:
-
超类型的引用指向派生类的对象
-
能点出来什么,看引用的类型-----------------这是规定,记住就OK了
何时向上造型:
- 多种角色能干的事都一样的时候,可以将那多种角色统一造型到超类数组中,实现代码复用
- 例如:侦察潜艇、鱼雷潜艇、水雷潜艇都能移动、都能被炸弹打,说明干的事都一样,所以就可以将三种潜艇统一造型到SeaObject超类数组中,这样仅需1个for就OK。-----------实现代码复用
- 将超类作为参数或返回值,传递派生类对象或返回派生类对象,也是在向上造型–下周才能体会
- 多种角色能干的事都一样的时候,可以将那多种角色统一造型到超类数组中,实现代码复用
-
笔记:
-
引用类型数组(下):
-
区别1:给引用类型数组的元素赋值时,需要new个对象
-
区别2:若想访问引用类型数组元素的数据,需要通过数组元素去打点
ObserveSubmarine[] oses = new ObserveSubmarine[3]; oses[0] = new ObserveSubmarine(); oses[1] = new ObserveSubmarine(); oses[2] = new ObserveSubmarine(); System.out.println(oses[0].x); //输出第1个侦察潜艇的x坐标 oses[1].y = 250; //修改第2个侦察潜艇的y坐标为250 oses[2].move(); //第3个侦察潜艇移动 for(int i=0;i<oses.length;i++){ //遍历所有侦察潜艇 System.out.println(oses[i].x+","+oses[i].y+","+oses[i].speed); //输出每个侦察潜艇的x/y/speed oses[i].move(); //每个侦察潜艇移动 }
-
-
继承:
-
作用:代码复用
-
通过extends实现继承
-
超类/父类:共有的属性和行为
派生类/子类:特有的属性和行为
-
派生类可以访问派生类的+超类的,但超类不能访问派生类的
-
一个超类可以有多个派生类,但一个派生类只能有一个超类-----------单一继承
-
具有传递性
-
java规定:构造派生类之前必须先构造超类
-
在派生类的构造方法中若没有调用超类的构造方法,则编译器默认super()调用超类的无参构造方法
-
在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供
注意:super()调用超类的构造方法,必须位于派生类构造方法的第一行
public class SuperDemo { public static void main(String[] args) { Doo o = new Doo(); } } class Eoo{ Eoo(int a){ } } class Foo extends Eoo{ Foo(){ super(5); } /* //如下代码为默认的 Foo(){ super(); } */ } class Coo{ Coo(){ System.out.println("超类构造方法"); } } class Doo extends Coo{ Doo(){ super(); //默认的,调用超类的无参构造方法 System.out.println("派生类构造方法"); } }
-
-
-
super:指代当前对象的超类对象
super的用法:
-
super.成员变量名--------------------------访问超类的成员变量
注意:当超类与派生类中包含同名成员变量时,访问超类成员变量,则必须用super.
-
super.方法名()-------------------------------调用超类的方法-------明天讲方法的重写时详细讲
-
super()-----------------------------------------调用超类的构造方法
-
-
向上造型:
-
超类型的引用指向派生类的对象
-
能点出来什么,看引用的类型-----------------这是规定,记住就OK了
- 何时向上造型:
- 多种角色能干的事都一样的时候,可以将那多种角色统一造型到超类数组中,实现代码复用
- 例如:侦察潜艇、鱼雷潜艇、水雷潜艇都能移动、都能被炸弹打,说明干的事都一样,所以就可以将三种潜艇统一造型到SeaObject超类数组中,这样仅需1个for就OK。-----------实现代码复用
- 将超类作为参数或返回值,传递派生类对象或返回派生类对象,也是在向上造型–下周才能体会
- 多种角色能干的事都一样的时候,可以将那多种角色统一造型到超类数组中,实现代码复用
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(){ } }
- 何时向上造型:
-
补充:
-
继承要符号is(是)的关系
-
超类的意义:
- 封装共有的属性和行为---------------------------实现代码复用
- 为所有派生类提供了统一的类型---------------向上造型(代码复用)
-
明日单词:
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:状态