Day12——JavaOOP——多态、抽象类;封装、继承、多态;abstract关键字

Java面向对象—多态
同一个对象的不同形态称之为多态
向同一父类的不同子类对象发送同一条消息,行为不同

声明父类对象用于保存创建的子类对象
可以用父类对象保存任意子类对象
Day12——JavaOOP——多态、抽象类;封装、继承、多态;abstract关键字_第1张图片
• 现实生活中存在很多多态的例子。
• 例如:水在100摄氏度的高温下是气体,在常温下是液体,在0摄氏度以下是固体。这里的多态是指一个对象具有多种形态
• OOP中的多态与之类似。
• 同一个引用类型,使用不同的实例可以执行不同的操作,即父类引用子类对象——向上转型。

多态的特点
1、子类重写父类的方法
2、编写方法时,参数使用父类对象,并调用父类定义的方法
3、运行时,根据实际创建的对象类型动态决定使用哪个方法

多态发生的前提
1、 必须存在继承关系
2、 子类必须重写父类方法
3、 必须发生向上转型

“向上转型”也就是把子类转换成父类,这符合继承中的is-a关系(狗是宠物),这是自动类型转换
使用“向上转型”时我们无法调用子类独有的方法。
父类对象的引用赋值给一个子类对象,称之为“向下转型”,也就是把父类转换成子类,此时必须进行强制类型转换。
“向下转型”之前必须确定要转型的父类对象就是要转型的子类对象,否则会出现编译错误,或者类型转换异常。
向下转型成功的前提对象是先经过向上转型后得出的父类对象向下转化为原子类对象

使用多态的优点与缺点
优点:
  提高了代码的维护性(继承保证)
  提高了代码的扩展性(多态保证)
缺点:
  不能使用子类的特有功能( 变量、方法 )
向上转型与向下转型的简单原理
Day12——JavaOOP——多态、抽象类;封装、继承、多态;abstract关键字_第2张图片

Cat cat = new Cat("大菊", 100);
		System.out.println("向上转型之前:" + cat.hashCode());
		Pet p = cat;
		// 向上转型 声明父类对象 保存创建 的子类对象实例
		System.out.println("向上转型之后:" + p.hashCode());
		Cat c = (Cat) p;
		// 向下转型 将之前向上转型的对象转换为子类对象
		System.out.println("向下转型之后:" + c.hashCode());
		*结论:不论对象经过多少次向上向下转型实际上都是对原对象进行操作*
        向上转型之前:366712642
        向上转型之后:366712642
        向下转型之后:366712642

结论:不论对象经过多少次向上向下转型实际上都是对原对象进行操作
向上转型之前:366712642
向上转型之后:366712642
向下转型之后:366712642

Java面向对象三大特性
封装
使用访问权限修饰符修饰属性与方法,使其只对可见类生效
使用private修饰属性与方法,提供公开的调用与赋值的方法
继承
子类继承父类,继承使用父类所有非私有的属性与方法
使用extends关键字 使子类与父类产生联系,在创建子类对象时同时创建父类对象,对于父类属性与方法的调用都源自于父类对象
多态
同一个类不同形态的展示
使用多态的前提:发生继承/子类重写父类方法/向上转型(创建子类对象使用父类声明的对象接受)
使用:创建父类变量 保存子类对象
正常的变量创建需要声明与创建对象或数据类型相同的数据类型
对于多态 提出子类就是父类的不同形态,可以使用父类变量保存

abstract关键字
哀不死踹克t

属性修饰符的一种,用来修饰类与方法,被abstract修饰的类称之为抽象类,被abstract修饰的方法称之为抽象方法

抽象类特点
有抽象方法的类一定是抽象类
抽象类不一定有抽象方法。
抽象类和方法用abstract来修饰
子类必须重写父类的抽象方法
抽象方法没有方法体。
抽象类不能创建对象
抽象类可以声明对象

abstract的作用
1、 用于一些抽象类的创建
2、 用于抽象方法的创建
3、 用于提示(抽象方法被继承后必须实现否则会报错)

抽象类不能创建对象,因为抽象类中可能有抽象方法,如果想使用抽象类中完成的方法,需要通过继承的方式,重写完成未完成的方法后,创建子类对象调用相应方法

思考:
Java中的继承是单继承,我一次只能继承一个抽象类.
完成工作我一次只能完成一个,但是可以通过依次继承进行实现一次完成多个抽象类中未实现方法这一功能
Java单继承的局限性

你可能感兴趣的:(学习Java第一阶段)