多态的概念,特点和优缺点

多态的概述和实现

  • 概念:多态是同一个行为具有不同表现形式或形态的能力,多态性是对象多种表现形式和体现。
  • 多态的前提:
    • 子父类的继承关系或子类实现父类接口
    • 必须有方法的重写
    • 父类引用指向子类对象
package com.itheima;

/**
 * @author 11137_yyss3t3
 * 多态的前提:
 * 	子父类的继承关系
 * 	方法的重写
 * 	父类引用指向子类对象
 */
public class Demo1_1 {

	public static void main(String[] args) {
		Cat cat = new Cat();
		cat.eat();
		//父类引用指向子类对象
		Animal a = new Cat();
		a.eat();
	}
}

/**
 * @author 11137_yyss3t3
 *父类,动物类
 */
class Animal{
	public void eat() {
		System.out.println("吃东西");
	}
}

/**
 * @author 11137_yyss3t3
 *子类猫继承了动物类并且重写了eat()方法
 */
class Cat extends Animal{
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
输出的结果为:
猫吃鱼
猫吃鱼

多态成员的特点

  • 成员变量的特点:上代码
package com.itheima;

/**
 * @author 11137_yyss3t3
 * 多态的成员特点:
 * 		成员变量:编译看左边,运行看左边
 * 		成员方法
 * 		静态方法
 *
 */
public class Demo1_2 {

	public static void main(String[] args) {
		Dad dad = new Kid();
		System.out.println(dad.num);
	}
}

class Dad{
	int num = 20;
}
class Kid extends Dad{
	int num = 10;
}
输出结果为:20

父类引用指向子类对象,父亲类和儿子类中都有成员变量,变量不像方法一样有重写,变量是没有重写的概念的,所以运行的是父类方法的成员变量。如果父类中没有这个成员变量,程序会出现编译错误。
多态中成员变量的特点是:编译看左边,运行也看左边

  • 成员方法的特点
package com.itheima;

/**
 * @author 11137_yyss3t3
 * 多态的成员特点:
 * 		成员变量
 * 		成员方法:编译看左边,运行看右边
 * 		静态方法
 *
 */
public class Demo1_2 {

	public static void main(String[] args) {
		//父类引用指向子类对象
		Dad dad = new Kid();
		dad.method();
	}
}

class Dad{
	public void method() {
		System.out.println("我是父类方法");
	}
}
class Kid extends Dad{
	public void method() {
		System.out.println("我是子类方法");
	}
}
输出的结果为:我是子类方法

因为成员方法是可以重写的,所以会执行子类的方法。但是如果父类中没有method()方法,编译器会报错。
总结:编译看左边,运行看右边

  • 静态方法的特点
package com.itheima;

/**
 * @author 11137_yyss3t3
 * 多态的成员特点:
 * 		成员变量
 * 		成员方法
 * 		静态方法:编译看左边,运行看左边
 *
 */
public class Demo1_2 {

	public static void main(String[] args) {
		//父类引用指向子类对象
		Dad dad = new Kid();
		dad.method();
	}
}

class Dad{
	public static void method() {
		System.out.println("我是父类静态方法");
	}
}
class Kid extends Dad{
	public static void method() {
		System.out.println("我是子类静态方法");
	}
}
输出结果是:我是父类静态方法

分析:使用变量去调用静态方法,其实相当于变量类型的类名去调用,也就是Dad.method(),所以运行的是父类里面的静态方法。如果父类没有静态方法,编译报错。
总结:编译看左边,运行看左边

多态中的向上转型和向下转型

  • 向上转型
package com.itheima;

/**
 * @author 11137_yyss3t3
 * 多态的向上转型和向下转型
 */
public class Demo1_3 {

	public static void main(String[] args) {
		//父类引用指向子类对象,其实这就是向上转型
		Animal01 a = new Dog();
		a.eat();
	}
}
class Animal01 {
	public void eat() {
		System.out.println("吃东西");
	}
}

class Dog extends Animal01{
	@Override
	public void eat() {
		System.out.println("狗吃骨头");
	}
	
	public void swim() {
		System.out.println("狗刨");
	}
}
输出结果是:狗吃骨头

看上面代码狗类还有一个自己特有的方法游泳,现在是找不到子类的swim()方法的。如何才能运行swim()方法呢?

  • 向下转型
package com.itheima;

/**
 * @author 11137_yyss3t3
 * 多态的向上转型和向下转型
 */
public class Demo1_3 {

	public static void main(String[] args) {
		//父类引用指向子类对象,其实这就是向上转型
		Animal01 a = new Dog();
		Dog d = (Dog)a;//向下转型
		d.swim();
	}
}
class Animal01 {
	public void eat() {
		System.out.println("吃东西");
	}
}

class Dog extends Animal01{
	@Override
	public void eat() {
		System.out.println("狗吃骨头");
	}
	
	public void swim() {
		System.out.println("狗刨");
	}
}
输出结果:狗刨

多态的优点和缺点

  • 缺点:父类引用无法直接访问子类特有成员
  • 优点:
    • 可以提高可维护性
    • 提高可扩展性

版权声明:本文为weixin_40735256原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。