java多态
class Dog extends Animal
{
public void eat()
{
System.out.println(“bone”);
}
public void lookHome()
{
System.out.println(“lookhome”);
}
}
class Cat extends Animal
{
public void eat()
{
System.out.println(“fish”);
}
public void catchMouse()
{
System.out.println(“catchmouse”);
}
}
//进行抽取,将共性的功能抽取到父类Animal中
abstract class Animal
{
public abstract void eat();
}
class Demo
{
public static void main(String[] args)
{
Dog d=new Dog();
method(d);
Cat c=new Cat();
method(c);
}
//只要建立Animal的引用就可以接收所有的dog、cat对象进来,提高了程序的扩展性
public static void method(Animal a)
{
a.eat();
}
}
多态:
Animal a=new Dog();
Animal b=new Cat();
父类的引用变量指向了子类的对象
C++中的父类的指针指向了子类的对象,父类是抽象类
Animal *a=new Dog();
Animal *b=new Cat();
Java三种引用变量:数组名,接口,类
父类定义的指向子类对象的引用变量在调用父类和子类同名的方法时,因为覆盖的关系,调用的是子类的方法
而C++中父类定义的指向子类对象的指针在调用父类和子类同名的方法时,调用的是父类的方法。
除非这个方法被定义为虚函数。Java中只有抽象方法=纯虚函数,而没有虚函数。java默认所有成员函数都是虚函数。
为了调用子类方法的向下转型
class A
{
public void teach
{System.out.println(“Manage”);}
public void fishing()
{System.out.println(“fishing”);}
}
class B extends A
{
public void teach()
{System.out.println(“Java”);}
public void look()
{System.out.println(“look”);}
}
class Test
{
public static void main(String[] args)
{
A x=new B();//多态,向上转型
x.teach();
//x是父类定义的引用变量指向了子类对象
//这里的teach调用的是子类的方法,因为子类覆盖了父类的同名方法,但是x是父类的引用变量本应该调用的是父类的方法
//在C++中,这里调用的是父类的方法,如果父类中的方法是虚函数,调用的将是子类的方法
//Java中没有虚函数,Java自动将父类中和子类同名的方法全部置为了虚函数,但是静态函数除外,因为静态和虚函数不兼容
x.fishing();//父类中的方法,因为x是父类类型的引用变量
//x.look();//子类的方法,不能调用
//想要调用子类的特有方法时,需要向下转型
if(x instanceof B)
//x指向的是子类B的对象
{
B y=(B)x;
//将A类型的引用变量x强制转换类型为子类B类型,向下转型
y.look();
//在C++中应该这样写:A *p=new B(); B *q=(B*)p; q->look();
}
}
}
|
|