Java多态详述

什么是多态

多态,即多种行为的状态。是指父类类型的变量指向子类类型创建的对象,使用该变量调用父类中一个被子类重写的方法,则父类中的方法呈现出不同的行为特征,这种现象即为多态。表现形式为:父类类型变量 = 子类创建的对象
代码展示:

public class Mammal {//父类

	public void move() {
		System.out.println("正在移动...");
	}
}
public class Bat extends Mammal{//子类
	String weight = "1.2kg"@Override
	public void move() {
		System.out.println("靠翼飞行...");
	}
}

public class Test {//main方法中多态的表现

	public static void main(String[] args) {
		Bat bat = new Bat();
		bat.move();
		Mammal mammal = new Bat();//多态的表现形式
		mammal.move();
	}

多态的特点

1、编译时和运行时的类型不一致,否则一定不会产生多态。对Test项目中部分段的代码进行分析叙述:

		Bat bat = new Bat();
		bat.move();

在编译时,变量为子类类型,所以编译时调用子类的move方法;在运行时,执行时bat指向的就是本类创建的对象,所以调用本类的move方法;

		Mammal mammal = new Bat();
		mammal.move();

在编译时,为父类类型,所以编译时调用父类的move方法;在运行时,mammal指向子类创建对象,所以运行时调用子类方法。编译和运行时调用的方法不一致,此现象称之为多态。
2、编译时调用的方法一定被子类重写。

public class Mammal {//父类

	public void move() {
		System.out.println("正在移动...");
	}
}
public class Bat extends Mammal{//子类

	@Override
	public void move() {
		System.out.println("靠翼飞行...");
	}
}

3、多态中,父类类型变量 = 子类创建的对象(又称为上[↑]转型对象)
代码体现在Test类代码中,Mammal mammal = new Bat(); 即为具体表现形式。

		Mammal mammal = new Bat();
		mammal.move();

上转型对象的特点

1、上转型对象不可调用子类新增的属性与方法。(例如代码中,mammal可以调用Bat中的move方法,却无法将把Bat中的weight输出出来。)若上转型必须调用子类的新增属性和方法,则需要将其转化为下转型对象。可以参照Test中带注释的代码理解。

public class Mammal {//父类

	public void move() {
		System.out.println("正在移动...");
	}
}
public class Bat extends Mammal{//子类
	String weight = "1.2kg"public void eat(){
		System.out.println("正在吃虫子");
	}
	@Override
	public void move() {
		System.out.println("靠翼飞行...");
	}
}

public class Test {//main方法中多态的表现

	public static void main(String[] args) {
		Bat bat = new Bat();
		bat.move();
		Mammal mammal = new Bat();//多态的表现形式
		mammal.move();
		Bat b = (Bat) mammal;//将上转型转化为下转型
		System.out.println(b.weight);
		b.eat();

2、非上转型对象无法下转型为下转型对象。
3、如果子类成员变量与父类成员变量重复,则上转型对象调用的是父类中的方法。

public class Mammal {//父类
	int weight = 1.2;
		
	public void move() {
		System.out.println("正在移动...");
	}
}
public class Bat extends Mammal{//子类
	String weight = "1.2kg"public void eat(){
		System.out.println("正在吃虫子");
	}
	@Override
	public void move() {
		System.out.println("靠翼飞行...");
	}
}

public class Test {//main方法中多态的表现

	public static void main(String[] args) {
		Bat bat = new Bat();
		bat.move();
		Mammal mammal = new Bat();//多态的表现形式
		Bat b = (Bat) mammal;//将上转型转化为下转型
		System.out.println(b.weight);

此时,输出weight的结果应该为父类Mammal中的“1.2”。

发布了19 篇原创文章 · 获赞 0 · 访问量 466

猜你喜欢

转载自blog.csdn.net/zzu957/article/details/104716940