1.多态的意义:
1)同一类型的引用指向不同的对象时
----行为多态
public static void main(String[] args){
Person i = new Person();
Person o = new barber();
Person p = new doctor();
o.cut();//理发师的剪头发行为
p.cut();//演员的演戏行为
}
abstract class Person{
abstract void cut();
}
class barber extends Person{
public void cut(){
System.out.println("剪头发");
}
}
class doctor extends Person{
public void cut(){
System.out.println("手术刀裁剪");
}
}
/**
在超类中有个抽象cut方法,可以理解为人的cut行为,在不同职业中cut的意思也不
同,在理发师中,cut作为动词是剪头发的动作,在医生职业cut就是由手术刀或者其
他进行手术,他们的施法者都是人,也就是超类,是同一类型,对象不同。*/
2)同一对象被造型为不同类型时,有不同功能
----对象的多态
public static void main(String[] args){
water w = new water();
liquidWater o = w;
solidWater p = w;
o.effect();
p.function();
}
}
interface solidWater{
void function();
}
abstract class liquidWater{
abstract void effect();
}
class water extends liquidWater implements solidWater{
public void effect(){
System.out.println("液态水可以喝");
}
public void function(){
System.out.println("固态水是冰块,作用很多");
}
/**水可以作为一个对象,但他可以有多种形态,分别被造型为液态水和固态水,那么他们的引用o,p就可以点出他们的方法,也就是作用。*/
抽象方法都是多态,Java中凡是对象都是多态的
3)向上造型
3.1)超类型的引用指向派生类对象
3.2)能造型成为的类型有:超类+所实现的接口
3.3)能点出来什么,看引用类型
4)强制类型转换,成功的条件只有如下两种:
4.1)引用所指向的对象就是该类型
4.2)引用所指向的对象,实现了该接口或者继承的类
5)强转时若不符合如上两个条件,则会发生ClassCastExcption类型转换异常
6)在进行类型转换之前“instanceof”操作符可以检测是否成功的转换
public class MutilTypeDemo {
public static void main(String[] args) {
TQQ o = new YQQ();
YQQ o1 = (YQQ)o;//o所指向的对象就是YQQ类型
Inter1 o2 = (Inter1)o;//o所指向的对象YQQ是实现Inter1的接口
//UQQ o3 = (UQQ)o;//ClassCastException
System.out.println(o instanceof YQQ);//true
if(o instanceof UQQ) {
UQQ o3 = (UQQ)o;
}else {
System.out.println("没有转换成功");
}
}
}
interface Inter1{}
class TQQ{}
class YQQ extends TQQ implements Inter1{}
class UQQ extends TQQ{}
强转一定是和instanceof一起!