本帖最后由 jing3133920 于 2015-5-3 21:43 编辑
一、多态多态可以理解为事物存在的多种体现形态。
1.多态的体现:
父类的引用指向了自己的子类对象
父类的引用也可以接收自己的子类对象
2.多态的前提:
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提:存在覆盖。
3.多态的好处:
多态的出现大大的提高程序的扩展性。
4.多态的弊端:
但是只能使用父类的引用访问父类中的成员。
5.多态的应用:
可以对多个类实物进行抽取。导致了多态的产生,操作同一个大类型,并对大类型中的所有小类型都能进行操作。
6.多态的成员非静态函数特点:
在编译时期,参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期,参阅对象所属的类中是否有调用的方法。
简单总结:成员函数在多态调用时,编译看左边,运行看右边。
7.多态的成员静态函数特点:
无论编译还是运行,都参考左边
8.多态的成员变量特点:
无论编译还是运行,都参考左边(引用型变量所属的类)。
例:
abstract class Animal
{
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)
{
function(new Cat());
function(new Dog());
}
public static void function(Animal a)\\当参数传进来相当于 Animal a = new Cat();
{
a.eat();\\在这个方法中不能调用Cat和Dog类中特有的方法。因为只能使用父类的引用访问父类中的成员。
}
}
多态的转型:
Animal a = new cat(); 类型提升。向上转型。
如果想要调用猫的特有方法,该如何?
强制将父类的引用,转成子类类型。
Cat c=(Cat)a;\\这叫向下转型
介绍一个关键字:instanceof,判断某一类型引用,指向的对象到底符合什么类型。
注:
千万不要出现这样的操作,就是将父类对象转成子类类型。我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
多态自始至终都是子类对象在做着变化。
二、Object类
它是所有对象的直接或者间接父类。该类中定义的肯定是所有对象都具备的功能。
Object类中已经提供了比较相同的功能equals方法:它是通过比较地址来完成两个对象是否相同。
如果想要自定义一个比较功能,可以沿袭父类中的功能。也就是覆盖。
例:
public boolean equals(Object obj)
{
Demo d = (Demo)obj;\\Demo是一个子类,因为想要使用子类中的num变量所以对它进行向下转型。
return this.num == d.num;
}
toString方法:它就是由getClass().getName()+'@'+Integer.toHexString(hashCode())组成的。hashCode获取哈希码值。
每个对象都有自己的字符串表现形式。java中的很多类都有可能会被复写。
|
|