1.多态
1)表现
- 同一个对象被造型为不同的类型时,有不同的功能–对象的多态:我、你、水…—所有对象都是多态的
- 同一类型的引用指向不同的对象时,有不同的实现—行为的多态:cut(),move(),getImage()–所有抽象方法都是多态的
2)向上造型/自动类型转换:------代码复用
- 超类型的引用指向派生类的对象
- 能点出来什么,看引用的类型
- 能造型成为的数据类型有:超类+所实现的接口
3)强制类型转换,成为的条件只有如下两种:
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口或继承了该类
4)强转时若不符合如上条件,则发生ClassCastException类型转换异常
建议:在强转之前先通过instanceof来判断引用的对象是否是该类型
public class MultiTypeDemo {
public static void main(String[] args) {
Aoo o = new Boo();
Boo o1 = (Boo)o; //引用o所指向的对象,就是Boo类型
Inter o2 = (Inter)o; //引用o所指向的对象,实现了Inter接口
//Coo o3 = (Coo)o; //运行时ClassCastException类型转换异常
if(o instanceof Coo){ //false
Coo o4 = (Coo)o;
}else{
System.out.println("o不是Coo类型");
}
/*
System.out.println(o instanceof Boo); //true
System.out.println(o instanceof Inter); //true
System.out.println(o instanceof Coo); //false
*/
}
}
interface Inter{ }
class Aoo{ }
class Boo extends Aoo implements Inter{ }
class Coo extends Aoo{ }
2.碰撞检测算法:
(潜水艇游戏项目基础上)
/** 检测碰撞 this:当前对象 other:另一个对象 */
public boolean isHit(SeaObject other){
//假设:this指代潜艇,other指代炸弹
int x1 = this.x-other.width; //x1:潜艇的x-炸弹的宽
int x2 = this.x+this.width; //x2:潜艇的x+潜艇的宽
int y1 = this.y-other.height; //y1:潜艇的y-炸弹的高
int y2 = this.y+this.height; //y2:潜艇的y+潜艇的高
int x = other.x; //x:炸弹的x
int y = other.y; //y:炸弹的y
return x>=x1 && x<=x2
&&
y>=y1 && y<=y2; //x在x1与x2之间,并且,y在y1与y2之间,即为撞上了
}
补充:
1)接口可以继承多个接口:
interface Inter1{
void show();
}
interface Inter2{
void test();
}
interface Inter3 extends Inter1,Inter2{
void say();
}
2)何时需要强转?
想访问的属性/行为在超类中没有,必须强转,强转之前先instanceof判断
3)ArrayIndexOutOfBoundsException:数组下标越界异常
NullPointerException:空指针异常
ClassCastException:类型转换异常
4)碰撞检测图