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());
}
}