Java笔记之多态的详解
Java多态——提高代码的拓展性
简单说:就是一个对象对应着不同类型
多态在代码中的体现:父类或者接口的引用指向其子类的对象。
Animal a =子类对象;能调用父类里面子类共有的方法或者变量。
多态的好处:提高了代码的扩展性,前期定义的代码可以使用后期的内容。
多态的前提:
1、必须有关系、继承、实现
2、要有覆盖
abstract class Animal
{
abstract void eat();
}
class dog extends Animal
{
void eat()
{
System.out.println("啃骨头");
}
void lookhome()
{
System.out.println("看家");
}
}
class cat extends Animal
{
void eat()
{
System.out.println("吃鱼");
}
void catchMouse()
{
System.out.println("抓老鼠");
}
}
class pig extends Animal
{
void eat()
{
System.out.println("吃饲料");
}
}
class DuotaiDemo
{
public static void main (String[] args)
{
cat c =new cat();
dog d =new dog();
method(c);
method(d);
method(new pig());
}
public static void method(Animal a)
{
a.eat();
}
}
Animal a =new cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法访问。
//作业就是限制了对特有功能的访问
// 专业讲:向上转型
如果还想用具体动物猫的特头功能,你可以将该对象向下转型
向下转型的目的是为了使用子类中特有的方法。
cat c=(cat) a; // 向下转型的目的是为了使用子类中的特有方法。
c.eat(); c.catchMouse();
注意:对于转型,自始至终都是子类对象在做着类型的变化。
狗不能转化为猫,假设动物可以创建对象,动物也不能转化为猫。
转型就是,猫对象有两种类型,在这两种类型之间进行转化。
instanceof:用于判断对象的具体类型,只能用于引用数据类型判断 如:if(a instanceof Cat ){ }
多态时成员的特点:
1、成员变量(没有覆盖一说)
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号左边。
2、成员函数(非静态)
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边
3、静态函数
编译时:参考引用型变量所属的类中的是否有调用的静态方法
运行时:参考引用型变量所属的类中的是否有调用的静态方法
简单说:编译和运行都看左边。
其实对于静态方法,是不需要对象的,直接用类名进行调用即可。
上一篇: 详解Java多态的概念、注意事项和用法