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...");
	}	
}

输出结果为:

java多态

原因如下:Father f 指向的new Son()所开辟的堆内存空间,只能访问 堆内存中的super中的成员变量,因为引用f是father类型的,所以只能访问super(就是说引用是Father类型,那么只能访问Father类型的)成员变量。如果不理解,可以记住口诀:编译看左边,运行看左边( 左边:Father,右边Son)

java多态

 

多态的好处:

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