Java学习笔记(十)——多态
一、多态
1、对象的多种形态
(1)引用多态:
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
(2)方法多态:
创建本类对象时,调用的方法为本类方法:
创建子类对象时,调用的方法是子类方法,如果没重写,调用的就是继承父类的方法
(3)父类的引用是不可以调用子类特有的方法。
二、多态中的引用类型转换
1、向上类型转换(隐式/自动类型转换)
小类型到大类型的转换
2、向下类型转换(强制类型转换)
大类型到小类型的转换
3、instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题。
4、一个demo
5、使用instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题的一个demo
三、抽象类
1、语法定义
在类前面使用abstract修饰的类就是抽象类
2、应用场景:
(1)在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
(2)从多个具有相同特征的子类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。
3、作用:
限制规定子类必须实现的某些方法,但不关注实现细节。
4、使用规则:
(1)使用abstract定义抽象类
(2)abstract定义抽象方法,只有声明,不需要实现
(3)包含抽象方法的类是抽象类
(4)抽象类中可以包含普通的方法,也可以没有抽象方法。
(5)抽象类不能直接创建,可以定义引用变量
5、一个demo
(1)建立一个手机抽象类
package com.cnblogs; public abstract class Telphone { public abstract void call(); public abstract void sendMessage(); }
(2)创建一个老式手机CellPhone类
package com.cnblogs; public class CellPhone extends Telphone { @Override public void call() { // TODO Auto-generated method stub System.out.println("通过键盘打电话"); } @Override public void sendMessage() { // TODO Auto-generated method stub System.out.println("通过键盘发短信"); } }
(3)同(2),建立只能手机类SmartPhone
package com.cnblogs; public class SmartPhone extends Telphone { @Override public void call() { // TODO Auto-generated method stub System.out.println("使用语音打电话"); } @Override public void sendMessage() { // TODO Auto-generated method stub System.out.println("使用语音发短信"); } }
(4)建立入口类Init
package com.cnblogs; public class Init { public static void main(String[] args) { // TODO Auto-generated method stub Telphone tel1 = new CellPhone(); tel1.call(); tel1.sendMessage(); Telphone tel2 = new SmartPhone(); tel2.call(); tel2.sendMessage(); } }
(5)运行结果:
四、Java中的接口
1、接口定义
类是一种具体实现提,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类方法的具体实现,它只规定这些类里必须提供的某些方法。
2、定义方法:
使用interface关键字:
[修饰符] interface 接口名[extends 父接口1,父接口2……] { 0个~多个常量定义 0个~多个抽象方法定义 }
3、接口定义:
接口中的方法只能是抽象方法,总是使用,即使定义时不添加public abstract修饰符,系统也是默认加上的。
4、使用接口:
一个类可以实现一个或多个接口,实现接口使用implements关键字,Java中一个类只能继承一个父类,但是可以继承多个接口。
格式固定,不能改变extends和Implements顺序的调换。
5、一个demo
(1)定义一个接口:
package com.cnblogs; public interface IPlayGame { public void playGame(); }
(2)SmartPhone引用接口
package com.cnblogs; public class SmartPhone extends Telphone implements IPlayGame { @Override public void call() { // TODO Auto-generated method stub System.out.println("使用语音打电话"); } @Override public void sendMessage() { // TODO Auto-generated method stub System.out.println("使用语音发短信"); } public void playGame() { System.out.println("手机可以玩游戏"); } }
(3)新建PSP类,引用接口
package com.cnblogs; public class Psp implements IPlayGame { @Override public void playGame() { // TODO Auto-generated method stub System.out.println("PSP可以玩游戏"); } }
(4)使用方法:
IPlayGame ip1 = new SmartPhone(); IPlayGame ip2 = new Psp(); ip1.playGame(); ip2.playGame();
6、使用接口
(1)接口在使用过程中,还经常与匿名内部类配合使用
(2)匿名内部类定义:
没有名字的内部类,多用于关注实现而不关注实现类的名称
(3)语法格式:
Interface i = new Interface(); { public void method() { System.out.println("匿名内部类实现接口的方式"); } }
(4)一个demo
IPlayGame ip3 = new IPlayGame(){ @Override public void playGame() { // TODO Auto-generated method stub System.out.println("使用匿名内部类的方式实现接口"); } }; ip3.playGame(); new IPlayGame(){ @Override public void playGame() { // TODO Auto-generated method stub System.out.println("使用匿名内部类的方式实现接口2"); } }.playGame();
![image image](https://images2015.cnblogs.com/blog/657755/201511/657755-20151108161330149-1793442058.png)