很久没有更新博客了,今晚要更新几篇。。。也帮助自己回忆回忆。。。
多态:可以理解为事物存在的多种体现形态。
简单举个例子:
猫 x=new 猫();
动物 y=new 猫();
目录
1.多态的体现
父类的引用指向自己的子类对象;
父类的引用也可以接收自己的子类对象。
2.多态的前提
必须是类与类之间的关系,要么是继承(extends),要么是实现(implements),通常还有一个前提,就是存在覆盖(重写)。
3.多态的好处
多态的出现大大的提高了程序的可扩展性。但是只能使用父类的引用,访问父类的成员。
4.类型转换(向上转型,向下转型)
Anmial a=new Cat();//类型提升,向上转型
Cat c=(Cat)a;//强制将父类的引用转成子类的类型,向下转型
/*
Anmial a=new Anmial();
Cat c=(Cat)a;
此段代码有误;
原因:不能将以前有的东西强制转为现有的东西。
*/
总结:能转换的是父类应用指向自己的子类对象时,该用用可以被提升,也可以被强制转换。
5.多态的应用
instanceof-------一般用于子类的类型有限,当传的类型需要进行其他操作时,必须要确定它的类型,即用到它的特有方法,这时用instaceof进行比较。
多态示例一:
abstract class Animal{
public abstract void eat();
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void kanJia(){
System.out.println("狗看家");
}
}
class duotaiDemo{
public static void main(String[] args){
funcation(new Dog());
funcation(new Cat());
public static void funcation(Animal a){
a.eat();
if(a instanceof Cat){
Cat c=(Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog d=(Dog)a;
d.kanJia();
}
}
}
}
输出结果为:
狗吃骨头
狗看家
猫吃鱼
猫抓老鼠
多态示例二:
abstract class Student
{
public abstract void study();
public void sleep(){
System.out.println("正常休息");
}
}
class basicStudent extends Student
{
public void study(){
System.out.println("学习java");
}
}
class advanceStudent extends Student
{
public void study(){
System.out.println("学习java、c++");
}
public void sleep(){
System.out.println("废寝忘食");
}
}
class doStudent
{
public void function(Student stu){
stu.study();
stu.sleep();
}
}
class duoTaiDemo2
{
public static void main(String[] args){
doStudent ds=new doStudent();
ds.function(new basicStudent());
}
}
输出结果为:
学习java
正常休息
多态示例三:
class Fu
{
public void method1(){
System.out.println("Fu...Method1");
}
public void method2(){
System.out.println("Fu...Method2");
}
}
class Zi extends Fu
{
public void method1(){
System.out.println("Zi...Method1");
}
public void method3(){
System.out.println("Zi...Method3");
}
}
class duoTaiDemo3
{
public static void main(String[] args){
Fu f=new Zi();
f.method1();
f.method2();
f.method3();
}
}
输出结果为:
报错的原因就在于:Fu类中没有method3()这个方法。
在多态成员函数的特点:
在编译时期:参阅引用类型所属的类中是否有调用方法。如果有,编译通过;如果没有,编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
《--------------------------------------------总结---------------------------------------------》
成员函数在多态调用时,编译看左,运行看右;
成员变量:无论编译还是运行,都看左(引用型变量所属的类)。
静态成员函数的特点:无论编译还是运行,都看左边。