2022.0520学习Java笔记之对象多态性

本文探讨了Java中的多态性,它是继承关系中的一个重要概念。多态性分为向上转型和向下转型,前者用于调用子类覆盖的父类方法,后者用于访问子类特有的功能。Java中使用instanceof关键字来判断对象是否属于特定类。对象通常通过向上转型实现参数的统一,而无需频繁的向下转型。多态性与继承性相结合,解决了代码的扩展性和参数一致性问题。
摘要由CSDN通过智能技术生成

如果说继承性是为了解决代码重用问题,那么多态性就是为了就是为了解决参数同一问题,而且多态一定结合继承关系后才可使用,

所谓多态性是指父子对象之间的转换操作,那么多态性一共有两种转换形式:

  • 向上转型 : 父类 父类对象 = 子类实例        自动完成转换
  • 向下转型 : 子类 子类对象 = (子类)父类实例        强制转换

例如:

class Person{
	public void print(){
		System.out.println("1.Person类,");
	}
}
class Student extends Person{
	public void print(){
		System.out.println("2.Student类,");
	}
	public void fun(){
		System.out.println("3.Student类,fun方法");
	}
}
public class TextDemo11{
	public static void main(String args[]){
		Person per = new Student();	//向上转型,自动转换
		per.print();
		Student stu = (Student)per;	//向下转型,强制转换
		stu.fun();
	}
}

 

总结:

  • 向上转型主要特征:子类为父类对象实例化,调用的方法一定是子类所覆写过的方法。向上转型是找父子类共性
  • 向下转型主要特征:子类扩充了某些功能,而这些功能夫类之中没有定义,则需要向下转型,以调用子类特有功能。向下转型是找特性。

在程序之中,父类并不知道自己有哪些子类,但是子类知道自己的父类是谁,所以要发生向下转型之前,必须首先建立好父子类之间的关系(向上转型),而后才可以向下转型。

为安全进行转型操作,在Java 之中提供了instanceof关键字,利用此关键字就可以判断某一个对象是否时某一个类的实例,语法:对象 instanceof 类        返回boolean型数据        

实例

class Person{
	public void print(){
		System.out.println("1.Person类,");
	}
}
class Student extends Person{
	public void print(){
		System.out.println("2.Student类,");
	}
	public void fun(){
		System.out.println("3.Student类,fun方法");
	}
}
public class TextDemo11{
	public static void main(String args[]){
		Person per = new Student();	//向上转型,自动转换
		System.out.println(per instanceof Person);
		System.out.println(per instanceof Student);	
		if(per instanceof Student){
			Student stu = (Student)per;
			stu.fun();
		}
	}
}

运行结果

 

 相互转型的意义

如果现在有一个程序,其中Person类下有学生、工人、老师三个子类,现在要求不同人说不一样的话,要求定义一个方法,可以接收Person类中的所有引用。

实现一,利用方法重载

class Person{
	public void say(){
		System.out.println("1.我是一个人");
	}
}
class Student extends Person{
	public void say(){
		System.out.println("2.我是一个学生");
	}
}
class Worker extends Person{
	public void say(){
		System.out.println("3.我是一个工人");
	}
}
class Teacher extends Person{
	public void say(){
		System.out.println("4.我是一个老师");
	}
}
public class TextDemo11{
	public static void main(String args[]){
		fun(new Student());
		fun(new Worker());
		fun(new Teacher());
	}
	public static void fun(Student stu){
		stu.say();
	}
	public static void fun(Worker wrk){
		wrk.say();
	}
	public static void fun(Teacher tea){
		tea.say();
	}
}

 

 

实现二:利用对象向上转型

对象在进行向上转型时可以自动完成父类接收子类的功能,同时转型之后所调用的方法也一定是随实例化子类的不同,同一个方法一定执行不同的功能


public class TextDemo11{
	public static void main(String args[]){
		fun(new Student());
		fun(new Worker());
		fun(new Teacher());
	}
	public static void fun(Person per){
		per.say();
	}
}

结果也是一样,并且如果现在随意去扩充子类,fun方法不需要做任何改动就可以满足所有功能

例题

现在假设有一个数组操作类,这个类操作之中需要接收一个数组(通过构造传递),而后在此类下有两个子类,一个子类在获取数据的时候会将传入的数据进行排序后返回,另一个子类会将传递进去的数据以反转的形式返回。

 

class Arry{
	private int data[];//保存数组
	public Arry(int data[]){
		this.data = data;//构造方法传递数组
	}
	public int[] getData(){
		return this.data;
	}
}
class SortArry extends Arry{
	public SortArry(int data[]){
		super(data);
	}
	public int[] getData(){
		java.util.Arrays.sort(super.getData());//排序
		return super.getData();
	}
}
class ReverseArry extends Arry{
	public ReverseArry(int data[]){
		super(data);
	}
	public int[] getData(){
		int center = super.getData().length/2;
		int herd = 0;
		int tail = super.getData().length-1;
		for(int x = 0; x < center; x++){
			int temp = super.getData()[herd];
			super.getData()[herd] = super.getData()[tail];
			super.getData()[tail] = temp;
			herd++;
			tail--;
		}
		return super.getData();
	}
}
public class TextDemo11{
	public static void main(String args[]){
		Arry arr = new ReverseArry(new int[] {5,6,7,1,2,3});
		print(arr);
	}
	public static void print(Arry temp){
		int result[] = temp.getData();
		for(int x = 0; x<result.length; x++){
			System.out.print(result[x] + "、");
		}
	}
}

总结:关于继承性与多态

  • 这两特性一定是相辅相成,不可以缺一
  • 继承性解决的时一个类功能扩充的问题,而多态性解决的是参数同一问题,有了多态之后应该发觉,父类的设计是相当重要的,而且子类里面不要轻易扩充父类里面没有的方法,要按照父类已有的方法规格覆写方法。 

关于对象转型问题

  • 向上转型(90%):自动完成,子类对象自动转化为父类对象,而后调用的是子类所覆写过的方法,利用对象的向上转型就可以很好解决参数同一问题。
  • 向下转型(1%):强制完成,不建议出现,当需要调用子类自己扩充的方法的时候。
  • 不转型(9%):很多时候的一些类是不会进行转型操作,如String。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值