一、多态
多态:可以理解为事物存在的多种体现形态。
人:男人,女人
动物:猫,狗
猫 x=new 猫();
动物 x=new 猫();
1.多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象,
2.多态的前提
必须是类与类之间有关系,要么继承,要买实现。
通常还有一个前提:存在覆盖。
3.多态的好处
多态的出现大大的提高程序的扩展性。
4.多态的弊端
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
人:男人,女人
动物:猫,狗
猫 x=new 猫();
动物 x=new 猫();
1.多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象,
2.多态的前提
必须是类与类之间有关系,要么继承,要买实现。
通常还有一个前提:存在覆盖。
3.多态的好处
多态的出现大大的提高程序的扩展性。
4.多态的弊端
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
示例:
abstract class Animal//定义一个抽象的类
{
abstract void eat();
}
class Cat extends Animal//子类继承父类
{
public void eat()//定义eat方法
{
System.out.println("吃鱼");
}
public void catchMouse()//定义catchMouse方法
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal//子类继承父类
{
public void eat()//定义eat方法
{
System.out.println("吃骨头");
}
public void kanJia()//定义kanJia方法
{
System.out.println("看家");
}
}
class DuotaiDemo
{
public static void main(String[] args)
{
Animal a= new Cat();//类型提升,向上转型。
a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用,转成子类类型,向下转型。
Cat c = (Cat)a ;
c.catchMouse();
//千万不要出现这样的操作,就是将父类对象转成子类类型。
//我们能转换的是父类引用指向了自己的子类对象时,该应用可以被提升,也可以强制转换。
//多态自始至终都是子类对象在做着变化。
}
}
instanceof:用于判断对象的具体类型,只能用于引用数据类型判断,通常在向下转型前用于健壮性的判断,如下:
class DuoTaiDemo
{
public static void main(String[] args)
{
}
public static void method(Animal a)
{
a.eat();
if(a instanceof Cat)
{
Cat c = (Cat )a;
c.catchMouse();
}
else if (a instanceof Dog)
{
Dog d = (Dog )a;
d.lookHome();
}
}
}
多态时,成员的特点:
1.成员变量
编译时:参考引用型变量所属的类中是否有调用的成员变量。有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。
2.成员函数(非静态)
编译时:参考引用型变量所属的类中是否有调用的函数。有,编译通过。没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。
3.静态函数
编译时:参考的是对象所属的类中是否有调用的函数。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译和运行看左边。
编译时:参考引用型变量所属的类中是否有调用的函数。有,编译通过。没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。
3.静态函数
编译时:参考的是对象所属的类中是否有调用的函数。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译和运行看左边。
二、Object类
Object:是所有对象的直接或者间接父类,传说中的上帝。
该类中定义的肯定是所有对象都具备的功能。
Object类中已经提供了对对象是否相同的比较方法。
如果自定义类中也有比较相同的功能,没有必要重新定义。
只要沿袭父类中的功能,建立自己特有比较内容即可,这就是覆盖。
示例:
class Demo //extends Object
{
private int num;
Demo(int num)
{
this.num = num;
}
public boolean equals(Object obj)//Object obj = new Demo();
{
if(!(obj instanceof Demo))
return false;
Demo d = (Demo)obj;
return this.num == d.num;
}
}
class ObjectDemo
{
public static void main(String[] args)
{
Demo d1 = new Demo(4);
Demo d2 = new Demo(4);
System.out.println(d1.equals(d2));
}
}