您的位置:首页 > 编程语言 > Java开发

100天JAVA学习计划06-多态

2016-04-09 11:03 405 查看
今天我们学习面向对象的最后一个特征,多态(polymorphism)!

产生多态的原因是编译时类型和运行时类型的不一样。在之前的文章出现的代码中,两种类型都是一样的。比如Dog d = new Dog()这句话的意思是我们把一个Dog类的对象赋给了d这个变量,很开心的是,d也是一个Dog类的对象,所以并没有什么奇怪的。那么我们把声明该变量的类型叫做编译时类型,这很好理解,比如int i,我们告诉计算机,在编译的时候把i当做整型处理!所以Dog d就是编译时类型;我们把实际赋给该变量的对象类型叫做运行时类型,也就是new Dog(),这也很好理解,比如int i=0;现在计算机已经知道i我要把他当整型,那么如果在运行代码的时候i到底是多少呢,那么我们告诉计算机,运行时把i当0看,很容易懂吧!

首先给出简单多态的实现代码:

class Dog{//父类
public String say = "我是一只狗";
public void bark(){
System.out.println("我会叫");
}
public void live(){
System.out.println("生活就是玩耍");
}
}

public class JinMao extends Dog{//子类
public String say = "我是一只金毛";
public void live(){
System.out.println("生活就是卖萌");
}
public void work(){
System.out.println("我还会工作");
}

public static void main(String[] args){
Dog dog = new Dog();//不发生多态
System.out.println(dog.say);
dog.bark();
dog.live();

JinMao jm = new JinMao();//不发生多态
System.out.println(jm.say);
jm.bark();//从父类继承的方法
jm.live();
jm.work();

Dog jmDog = new JinMao();//编译时类型和运行时类型不一样,发生多态
System.out.println(jmDog.say);//实例变量不具备多态性,所以输出父类的say
jmDog.bark();//方法具有多态性,总是表现出子类的行为,而此处子类的bark行为是从父类继承而来
jmDog.live();//指向子类的live方法
//jmDog.work();//父类中没有提供work,编译出错
}
}


程序运行结果如图:



在Java中是允许把子类对象直接付给父类的引用变量,这是一种向上的转型,在实际的代码编译过程中,计算机知道jmDog是一个父类的引用变量(编译时类型决定),但是在实际的运行过程中,确实一个子类的对象,总是指向子类方法!当然仅限于方法,实例变量(代码中的say)是不具有多态性的!是不是很简单!

最后,简单介绍一下instanceof运算符,instanceof运算符的前一个操作数通常是一个引用变量,后一个操作数通常是一个类或者接口(接口可以看成一个特殊的类,后面会讲到),它用来判断前面的对象是否是后面的类,或者其子类,实现类的实例,是返回true,不是返回false,那么举个例子,在之前代码的main方法最后加上这么一句话:

//instanceof的例子
System.out.println("jmDog是否是JinMao类的实例"+(jmDog instanceof JinMao));


就会有这样的结果:



使用instanceof要注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面具有父子继承关系,否则编译出错。

instanceof的作用呢是在进行类型转换之前首先判断一下是否可以成功转换,让代码更加健壮!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: