Java——多态

Java——多态

多态的特性

1.可替换性(substitutability)。多态对已存在代码具有可替换性。
例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,
也同样工作。

2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的
子类不影响已存在类的多态性、继承性,以及其他特性的运行和操
作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、
半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

3.接口性(interface-ability)。多态是超类通过方法签名,向子类
提供了一个共同接口,由子类来完善或者覆盖它而实现的。

4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高
了使用效率。

5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,
尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

一种事物的多种形态|表现形式

  • 注意: 使用检查语法时候只会看引用的类型|变量的类型,运行期间计算结果才会获取计算值

  • 多态的前提: 类的继承|接口的实现

  • 多态的最终体现: 父类引用指向子类对象

  • 多态的调用: 父类的引用调用方法的时候,会调用子类重写的方法

  • 多态引用对子类新增内容不可见

  • 总结多态使用成员:

  • 成员变量

  • 编译运行看左边|父类

  • 成员方法

  • 编译看左边,运行看右边

  • 编译看类型,运行找对象

  • 编译看父类,运行找子类

  • 多态可以使程序变的更加灵活,便于后期维护

public class PolyDemo01 {
	public static void main(String[] args) {
		//Person p=new Person();
		//Student s=new Student();
		//多态
		Person p2=new Student();
		p2.sleep();
		System.out.println(p2.name);
		//p2.haha();
		
		Person p = new Student();
	}
	
	void test(Person p) {}
}

class Person{
	String name="Person";
	
	void sleep() {
		System.out.println("休息...");
	}
}
class Student extends Person{
	int id;
	String name="Student";
	
	
	void sleep() { 
		 System.out.println("一边学习 一边休息..."); 
	}
	 
	
	void haha() {
		System.out.println("我是子类新增方法");
	}
}

class Teacher extends Person{
	int id=5;
	void haha() {
		System.out.println("我是子类Teacher新增方法");
	}
}

转型

1. 把子类对象直接赋给父类引用叫upcasting向上转型,向上转型
	**不用强制转型**。
	
			Father father = new Son();

2. 把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),
	要**强制转型,要向下转型**,必须先向上转型为了安全可以
	用**instanceof**判断。
	
	如father就是一个指向子类对象的父类引用,
	把father赋给子类引用son 
	即
			Son son =(Son)father;

	其中father前面的(Son)必须添加,进行强制转换。

	3.upcasting 会丢失子类特有的方法,但是子类overriding 
	父类的方法,子类方法有效,向上转型只能引用父类对
	象的属性,要引用子类对象属性,则要写getter函数。

	4.向上转型的作用,减少重复代码,父类为参数,调有
	时用子类作为参数,就是利用了向上转型。这样使代码
	变得简洁。体现了JAVA的抽象编程思想。

基本数据类型–>类型转换

  • 小类型数据-->大范围类型 : 自动类型提升
    
  • double d =1;
  • 大类型数据–>小范围类型 : 强制类型转换
  • int i = (int)d;
  • 引用数据类型–>转型问题
  • 大范围 : 父类
  • 小范围: 子类
  • 小类型数据–>大范围类型 : 向上转型
  • Person p =new Student();
  • 大类型数据–>小范围类型 : 向下转型
  • Student s =(Student)p;
  • 多态前提,父类引用只能调用父类中有的内容,对子类新增内容不可见(变量,方法)
  • 如果想要调用子类新增内容,需要涉及到向下转型,转为对象真实类型
  • 在向下转型常见的异常:
  • java.lang.ClassCastException 类型转换异常
  • 介绍一个云算符: 引用 instanceof 类型
  • 判断前面 的引用是否指向为后面类型的对象,如果是返回true,如果不是返回false
  • 总结: 当先要多态引用调用子类独有内容时候,需要向下转型,配合instaceof一起使用,先判断后转型,预防两类型转换异常出现
public class CastDemo02 {
	public static void main(String[] args) {
		//多态    向上转型
		Person p =new Student(); 
		System.out.println(p.name);
		p.sleep();
		//向下转型
		//Student s =(Student)p;
		if(p instanceof Teacher) {
			Teacher s= (Teacher)p;
			//子类独有内容
			System.out.println(s.id);
			s.haha();
		}else if(p instanceof Student) {
			Student s =(Student)p;
			System.out.println(s.id);
			s.haha();
		}
	}
}

下一篇,比较器,接口

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值