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

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

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

2. 继承:

   - 作用:代码复用

   - 通过extends实现继承

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

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

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

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

   - 具有传递性

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

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

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

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

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

   super的用法:

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

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

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

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

4. 向上造型:

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

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

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

5. 方法的重写(override/overriding):重新写、覆盖

   - 发生在父子类中,方法名相同,参数列表相同
   - 重写方法被调用时,看对象的类型----------------------这是规定,记住就可以了
   - 遵循"两同两小一大"原则:----------------了解即可,一般都是一模一样的
     - 两同:
       - 方法名相同
       - 参数列表相同
     - 两小:
       - 派生类方法的返回值类型小于或等于超类方法的
         - void和基本类型时,必须相等
         - 引用类型时,小于或等于
       - 派生类方法抛出的异常小于或等于超类方法的---------------API时讲
     - 一大:
       - 派生类方法的访问权限大于或等于超类方法的

     >-注意:当创建对象时,对象中有重写方法,引用.方法()的时候出来的是重写之后的方法

6. package和import:

   - package:声明包
     - 作用:避免类的命名冲突
     - 同包中的类不能同名,但不同包中的类可以同名
     - 类的全称:包名.类名
     - 建议:包名所有字母都小写,并且常常有层次结构
   - import:导入类
     - 同包中的类可以直接访问,但不同包中的类不能直接访问,若想访问:
       - 先import导入类再访问类------------建议
       - 类的全称-----------------------------------太繁琐、不建议

7. 访问控制修饰符:--------------------保护数据的安全

   - public:公开的,任何类

   - private:私有的,本类

   - protected:受保护的,本类、派生类、同包类

   - 默认的(default):什么也不写,本类、同包类---------------------java不建议默认权限

     > 说明:
     >
     > 1. 类的访问权限,只能是public或默认的,而类中成员的访问权限,如上4种都可以
     > 2. 访问权限由低到高依次为:private<默认的<protected<public

8. static:静态的

   - 静态变量:

     - 由static修饰

     - 属于类,存储在方法区中,只有一份

     - 常常通过类名点来访问

     - 何时用:所有对象所共享的数据(图片、音频、视频等)

- 静态方法:

     - 由static修饰

     - 属于类,存储在方法区中,只有一份

     - 常常通过类名点来访问

     - 静态方法中没有隐式this传递,不能直接访问实例成员

     - 何时用:方法的操作与对象无关(不需要访问对象的属性/对象的方法)

- 静态块:

     - 由static修饰

     - 属于类,在类被加载期间自动执行,一个类只被加载一次,所以静态块也只执行一次

     - 何时用:加载/初始化静态资源(图片、音频、视频等)

补充:

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

2. 超类的意义:

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

3. 数据(成员变量)私有化(private),行为(方法)大部分公开化(public)

4. 成员变量的分类:

   - 实例变量:没有static修饰,属于对象的,存储在堆中,有几个对象就有几份,通过对象/引用打点来访问
   - 静态变量:有static修饰,属于类的,存储在方法区中,只有一份,常常通过类名点来访问

5. 内存管理:由JVM来管理的

   - 堆:new出来的对象(包括实例变量、数组的元素)

   - 栈:局部变量(包括方法的参数)

   - 方法区:.class字节码文件(包括静态变量、所有方法)

6.给实例变量初始化建议写在构造方法中,给静态变量初始化建议写在静态块中

7. 顺序:先package、再import、最后class

package cn.tedu.submarine;

import java.util.Random;

//海洋对象;
public class SeaObject {
    protected int width;//宽
    protected int hight;//高
    protected int x;//x坐标
    protected int y;//y坐标
    protected int speed;//速度
    //专门给潜艇们提供的
    //因为三种潜艇的宽高不一样所以数据不能写死,需要传参写活;
    public SeaObject(int width,int hight){//给,鱼雷潜艇,水雷潜艇,侦察潜艇
        this.width=width;
        this.hight=hight;
        x=-width;
        Random rand=new Random();
        y= rand.nextInt(479-hight-150+1)+150;
        speed=rand.nextInt(3)+1;
    }
    public SeaObject(int width,int hight,int x,int y,int speed){
        this.width=width;
        this.hight=hight;
        this.x=x;
        this.y=y;
        this.speed=speed;
    }
    public void  move(){//移动
        System.out.println("海洋对象移动啦!");
    }

}





package cn.tedu.submarine;
//战舰类
public class Battleship extends SeaObject{

    private int life;//生命值

    public  Battleship(){
        super(66,26,270,124,20);

        life=5;
    }
    public void move(){
        System.out.println("战舰x左右移动啦!");
    }
}





package cn.tedu.submarine;
import javax.swing.ImageIcon;
/**
 * 图片类
 * 图片位置:点项目名称,右键,new一个Directory,命名为img,将八个图片复制到img中
 */
public class Images {
//  公开的   静态的   图片类型  变量名
    public static ImageIcon sea;  //海洋图
    public static ImageIcon gameover;  //游戏结束图
    public static ImageIcon battleship; //战舰图
    public static ImageIcon obsersubm;  //侦察潜艇图
    public static ImageIcon torpesubm;  //鱼雷潜艇图
    public static ImageIcon minesubm;  //水雷潜艇图
    public static ImageIcon mine;  //水雷图
    public static ImageIcon bomb; //炸弹图

    static {  //初始化静态图片的
        sea=new ImageIcon("img/sea.png");
        gameover=new ImageIcon("img/gameover.png");
        battleship=new ImageIcon("img/battleship.png");
        obsersubm=new ImageIcon("img/obsersubm.png");
        torpesubm=new ImageIcon("img/torpesubm.png");
        minesubm=new ImageIcon("img/minesubm.png");
        mine=new ImageIcon("img/mine.png");
        bomb=new ImageIcon("img/bomb.png");
    }
    //返回8表示图片读取成功,返回其余的表示读取图片失败
    public static void main(String[] args) {
        System.out.println(sea.getImageLoadStatus());
        System.out.println(gameover.getImageLoadStatus());
        System.out.println(battleship.getImageLoadStatus());
        System.out.println(obsersubm.getImageLoadStatus());
        System.out.println(torpesubm.getImageLoadStatus());
        System.out.println(minesubm.getImageLoadStatus());
        System.out.println(mine.getImageLoadStatus());
        System.out.println(bomb.getImageLoadStatus());
    }


}