Java新手小白入门篇 Java面向对象(三)

# 面向对象第3天:

## 潜艇游戏第一天:

1. 创建6个类,创建World类并测试

## 潜艇游戏第二天:

1. 给6个类添加构造方法,并测试

## 潜艇游戏第三天:

1. 设计侦察潜艇数组、鱼雷潜艇数组、水雷潜艇数组、水雷数组、炸弹数组,并测试

2. 设计SeaObject超类,设计6个类继承超类

3. 给SeaObject设计两个构造方法,6个类分别调用

4. 将三种潜艇统一造型为SeaObject数组,并测试

   > 建议练习顺序:2、3、(1+4)

## 回顾:

1. 构造方法:

   ​    给成员变量赋初始值,与类同名,没有返回值类型(连void都没有),创建(new)对象时被自动调用

   ​    若自己不写,则编译器默认提供一个无参构造方法,若自己写了,则不再默认提供,可以重载

2. this:指代当前对象,哪个对象调用方法它指的就是哪个对象

   - this.成员变量名-----------------------访问成员变量

     > 当成员变量与局部变量同名时,若想访问成员变量,则this不能省略

3. null:表示空,没有指向对象。若引用的值为null,则该引用不能进行任何操作了,若操作则发生   NullPointerException空指针异常

4. 引用类型数组(上):

   - 区别1:给引用类型数组的元素赋值时,需要new个对象
   - ......

## 精华笔记:

1. 引用类型数组(下):

   - 区别1:给引用类型数组的元素赋值时,需要new个对象
   - 区别2:若想访问引用类型数组元素的数据,需要通过数组元素去打点

2. 继承:

   - 作用:代码复用

   - 通过extends实现继承

   - 超类/父类:共有的属性和行为

     派生类/子类:特有的属性和行为

   - 派生类可以访问派生类的+超类的,但超类不能访问派生类的

   - 一个超类可以有多个派生类,一个派生类只能继承一个超类----------单一继承

   - 具有传递性

   - java规定:构造派生类之前必须先构造超类

     - 在派生类的构造方法中若没有调用超类的构造方法,则编译器默认super()调用超类的无参构造方法

     - 在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供

       > 注意:super()调用超类构造方法,必须位于派生类构造方法的第一行

3. super:指代当前对象的超类对象

   super的用法:

   - super.成员变量名----------------------访问超类的成员变量

     > 当超类和派生类中的成员变量同名时,若想访问超类的成员变量,则super不能省略

   - super.方法名()--------------------------调用超类的方法

   - super()------------------------------------调用超类的构造方法

4. 向上造型:

   - 超类型的引用指向派生类的对象

   - 能点出来什么,看引用的类型---------------这是规定,记住就OK了

     > 何时向上造型:
     >
     > - 多种角色能干的事都一样的时候,可以将多种角色统一造型到超类数组中,实现代码复用
     >   - 例如:侦察潜艇、鱼雷潜艇、水雷潜艇都能移动、都能被炸弹打-------说明干的事都一样
     >     - 就可以将三种潜艇统一造型到SeaObject超类数组中,这样一个for就OK----代码复用
     > - 将超类作为参数或返回值,传递派生类对象或返回派生类对象,依然在向上造型

## 笔记:

1. 引用类型数组(下):

   - 区别1:给引用类型数组的元素赋值时,需要new个对象

   - 区别2:若想访问引用类型数组元素的数据,需要通过数组元素去打点

     ```java
     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(); //每个侦察潜艇移动
     }
     ```

2. 继承:

   - 作用:代码复用

   - 通过extends实现继承

   - 超类/父类:共有的属性和行为

     派生类/子类:特有的属性和行为

   - 派生类可以访问派生类的+超类的,但超类不能访问派生类的

   - 一个超类可以有多个派生类,一个派生类只能继承一个超类----------单一继承

   - 具有传递性

   - java规定:构造派生类之前必须先构造超类

     - 在派生类的构造方法中若没有调用超类的构造方法,则编译器默认super()调用超类的无参构造方法

     - 在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供

       > 注意:super()调用超类构造方法,必须位于派生类构造方法的第一行

3. super:指代当前对象的超类对象

   super的用法:

   - super.成员变量名----------------------访问超类的成员变量

     > 当超类和派生类中的成员变量同名时,若想访问超类的成员变量,则super不能省略

   - super.方法名()--------------------------调用超类的方法---------------------下周一讲

   - super()------------------------------------调用超类的构造方法

     ```java
     package ooday03;
     //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); //调用Eoo的有参构造方法
         }
         /*
         //如下代码为默认的
         Foo(){
             super();
         }
          */
     }
     
     class Coo{
         Coo(){
             System.out.println("超类构造方法");
         }
     }
     class Doo extends Coo{
         Doo(){
             super(); //默认的,调用超类的无参构造方法
             System.out.println("派生类构造方法");
         }
     }
     ```

4. 向上造型:

   - 超类型的引用指向派生类的对象

   - 能点出来什么,看引用的类型---------------这是规定,记住就OK了

     > 何时向上造型:
     >
     > - 多种角色能干的事都一样的时候,可以将多种角色统一造型到超类数组中,实现代码复用
     >   - 例如:侦察潜艇、鱼雷潜艇、水雷潜艇都能移动、都能被炸弹打-------说明干的事都一样
     >     - 就可以将三种潜艇统一造型到SeaObject超类数组中,这样一个for就OK----代码复用
     > - 将超类作为参数或返回值,传递派生类对象或返回派生类对象,依然在向上造型

     ```java
     package ooday03;
     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(){
         }
     }
     ```

## 补充:

1. 继承要符合is(是)的关系

2. 超类的意义:

   - 封装共有的属性和行为--------------------实现代码复用
   - 为所有派生类提供了统一的类型--------向上造型(实现代码复用)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值