java多态
多态定义:
1.必须要有继承
2.必须要有方法的重写
3.父类引用指向子类对象,如下代码中,父类引用指Father f。new Son()会在jvm运行时数据区中的堆内存中开辟一个空间用于存放这个对象,而Father f中的f会指向刚才创建的对象在堆内存中的地址
示例代码:
class Demo2_Polymorphic
{
public static void main(String[] args)
{
//左边:Father,右边Son
Father f = new Son();
f.print();
//成员变量,编译看左边,运行看左边
System.out.println(f.i);
}
}
class Father
{
int i = 10;
public void print(){
System.out.println("Father...");
}
}
class Son extends Father
{
public void print(){
int i = 100;
System.out.println("son...");
}
}
输出结果为:
原因如下:Father f 指向的new Son()所开辟的堆内存空间,只能访问 堆内存中的super中的成员变量,因为引用f是father类型的,所以只能访问super(就是说引用是Father类型,那么只能访问Father类型的)成员变量。如果不理解,可以记住口诀:编译看左边,运行看左边( 左边:Father,右边Son)
多态的好处:
1.提高代码的维护性(这是继承的好处)
2.提高了代码的扩展性(看第二个例子)
多态的弊端:不能使用子类特有的属性和行为(如需使用,需要向下转型即强转);
多态的使用场合:使用一个父类的子类方法(该方法由子类重写)时,子类可以当作参数传递给父类
举例说明:将子类当作参数传递,方便扩展。这里只要是Animal的子类都可以当做参数传递给方法method,并且调用方法animal.eat()其实是调用的各子类中重写的eat()方法。
class Demo1
{
public static void main(String[] args)
{
method(new Cat());
method(new Dog());
}
public static void method(Animal animal){
animal.eat();
}
}
class Animal
{
public void eat(){
System.out.println("动物吃饭");
}
}
class Cat
{
public void eat(){
System.out.println("猫吃鱼");
}
public void catchMoust(){
System.out.println("猫抓老鼠");
}
}
class Dog
{
public void eat(){
System.out.println("狗吃屎");
}
public void workHome(){
System.out.println("狗看家");
}
}
关键字instanceof:用于判断前面的引用与后面的类型是否一致
如以上的demo中,dog instanceof Dog;则为true;
dog instanceof Cat;则为false