黑马程序员——多态

来源:互联网 发布:adobe mac 破解版 编辑:程序博客网 时间:2024/05/16 08:14

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


多态:可以理解为事物存在的多种体现形态。


人:男人,女人


动物:猫,狗


猫 x = 猫();


动物 x = 猫();


1,多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。
2,多态的前提
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提:存在覆盖。
3,多态的好处
多态的出现大大的提高了程序的扩展性。
4,多态的弊端
提过了扩展性的,但是只能使用父类的引用访问父类中的成员。
5,多态的应用


6,多态的出现代码中的特点(多态使用的注意事项)


Fu f = new Zi();
多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。即 参阅上述代码中的Fu
在运行时期:参阅对象所属的类中是否有调用的方法。即参阅上述代码中的Zi
简单总结:成员函数在多态调用时,编译看左边,运行看右边。


在多态中,成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。


在多态中,静态成员函数的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。







/*
动物:
猫,狗。
*/




// instanceof 关键字,a instanceof String 判断a是不是String类型
abstract class Animal
{
public abstract void eat();
public abstract void talk();
}


class Cat extends Animal
{
public void eat()
{
System.out.println("吃鱼");
}
public void talk()
{
System.out.println("喵喵~");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}


class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
public void talk()
{
System.out.println("汪汪~");
}
public void kanJia()
{
System.out.println("看家");
}
}


class Pig extends Animal
{
public void eat()
{
System.out.println("饲料");
}
public void talk()
{
System.out.println("空空~");
}
public void gongDi()
{
System.out.println("拱地");
}
}


class DuoTaiDemo
{
public static void main(String[] args)
{
/*
Cat c = new Cat();
function(c);


Dog d = new Dog();
function(d);


Pig p = new Pig();
function(p);
*/


//Animal a = new Cat();  //类型提升。 向上转型。
//a.eat();


//如果想要调用猫的特用方法时,如何操作?
//强制将父类的引用,转成子类类型。   向下转型。
//Cat c = (Cat)a;//向下转型
//c.catchMouse();
/*
千万不要出现这样的操作,就是将父类对象转成子类对象。
我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被转换。
多态自始至终都是子类对象在变化。
Animal a = new Animal();   //错误
Cat c = (Cat)a;
*/
/*
function(new Cat());
function(new Dog());
function(new Pig());
*/
/*
String a = "abc";
System.out.println(a instanceof String);
关键字instanceof,判断a是不是String类型
*/
}
public static void function(Animal a)
{
a.eat();
a.talk();
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog d = (Dog)a;
d.kanJia();
}
else if(a instanceof Pig)
{
Pig p = (Pig)a;
p.gongDi();
}
}



/*
public static void function(Cat c)
{
c.eat();
}
public static void function(Dog d)
{
d.eat();
}
public static void function(Pig p)
{
p.eat();
}
*/
}



0 0