Java-多态
2015-07-10 10:14
393 查看
Java-多态
一 多态的概念:
简单的说就是一件事物的不同表现形式,一个功能的不同种类的实现等等,类似于一对多的关系。
学习编程注重理解,不需要死记概念,只要理解了就行,能说出基本思想,能举例说明就可以了,开发过程中没有人叫你去写概念。
例如人分为男人和女人
动物有猫和狗等等
二 多态的特点
1,这些例子就是基本的体现
总结代码来说就是:
父类的引用指向了自己的子类对象
那么a这个对象可以使用Cat的方法
父类的引用也可以接收自己的子类对象
2,多态的前提
必须是类与类之间有联系,要么继承,要么实现必须存在覆盖
3,多态的好处:
多态的出现大大的提高了程序的扩展性
4,多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员
5,多态的应用
主要是通过接口对象的引用来指向子类对象来实现多态。
在定义需要扩展不确定的功能的时候,通常定义功能的接口,
然后定义具体的功能类来实现这个接口
应用的实质特点是增强了程序的扩展性
6,下面是一个Demo:
可以直接检验运行结果
二 转型
类型提升是向上转型:
如果要调用子类的特有方法的时候,
可以将父类引用,转换为子类类型,向下转型:
注意:千万不要出现将父类对象转成子类类型。
我们能够转换的是父类的引用指向的子类对象,注意是引用
这个引用可以被提升或者被降级
下面的代码不可以:
三 多态中特点
非静态成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
如有,编译通过,没有,编译失败
在运行时期:参阅对象所属的类中是否有调用的方法。
总结就是:非静态成员函数在多态调用的时候,
编译看左边的类中是否有相应方法,运行看右边类中相应的方法
非静态和静态成员变量的特点:
无论编译还是运行,都参阅左边的引用型变量所属的类中该变量的值
静态成员函数的特点:
无论编译还是运行,都参考左边
下面Demo是对上面理论的解释:
四 多态之object类
object:是所有对象的直接或者间接的父类,该类中定义的肯定
是所有对象都具备的功能。
常用的有equal,toString,通常这些方法都需要我们去重写
一 多态的概念:
简单的说就是一件事物的不同表现形式,一个功能的不同种类的实现等等,类似于一对多的关系。
学习编程注重理解,不需要死记概念,只要理解了就行,能说出基本思想,能举例说明就可以了,开发过程中没有人叫你去写概念。
例如人分为男人和女人
动物有猫和狗等等
二 多态的特点
1,这些例子就是基本的体现
总结代码来说就是:
父类的引用指向了自己的子类对象
Animal a = new Cat();
那么a这个对象可以使用Cat的方法
父类的引用也可以接收自己的子类对象
2,多态的前提
必须是类与类之间有联系,要么继承,要么实现必须存在覆盖
3,多态的好处:
多态的出现大大的提高了程序的扩展性
4,多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员
5,多态的应用
主要是通过接口对象的引用来指向子类对象来实现多态。
在定义需要扩展不确定的功能的时候,通常定义功能的接口,
然后定义具体的功能类来实现这个接口
应用的实质特点是增强了程序的扩展性
6,下面是一个Demo:
/** PCI接口类 */ interface PCI { public void open(); public void close(); } /** 主板类 */ class MainBoard { public void run() { System.out.println("MainBoard is runing!"); } //PCI p = new NewCard()接口型引用指向接口直接的子类对象 public void userPCI(PCI p) { if (p != null) { p.open(); p.close(); } } } /** 网卡类 */ class NetCard implements PCI { public void open() { System.out.println("NetCard is open!"); } public void close() { System.out.println("NetCard is close!"); } } /** 声卡类 */ class SoundCard implements PCI { public void open() { System.out.println("SoundCard is open!"); } public void close() { System.out.println("SoundCard is close!"); } } /** main */ public class ZhuBan { public static void main(String[] args) { MainBoard m = new MainBoard(); m.run(); m.userPCI(new NetCard()); m.userPCI(new SoundCard()); } }
可以直接检验运行结果
二 转型
类型提升是向上转型:
Animal a = new Cat();
如果要调用子类的特有方法的时候,
可以将父类引用,转换为子类类型,向下转型:
Animal a = new Cat(); Cat c = (Cat)a;
注意:千万不要出现将父类对象转成子类类型。
我们能够转换的是父类的引用指向的子类对象,注意是引用
这个引用可以被提升或者被降级
下面的代码不可以:
Animal a = new Animal(); Cat c = (Cat)a;
三 多态中特点
非静态成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。
如有,编译通过,没有,编译失败
在运行时期:参阅对象所属的类中是否有调用的方法。
总结就是:非静态成员函数在多态调用的时候,
编译看左边的类中是否有相应方法,运行看右边类中相应的方法
非静态和静态成员变量的特点:
无论编译还是运行,都参阅左边的引用型变量所属的类中该变量的值
静态成员函数的特点:
无论编译还是运行,都参考左边
下面Demo是对上面理论的解释:
class Fu { static int num = 5; void method_1() { System.out.println("fu method_1"); } void method_2() { System.out.println("fu method_2"); } void method_3() { System.out.println("fu method_3"); } static void method_4() { System.out.println("fu method_4"); } } class Zi extends Fu { static int num = 50; void method_1() { System.out.println("zi method_1"); } void method_3() { System.out.println("zi method_3"); } static void method_4() { System.out.println("zi method_4"); } } class Demo { public static void main(String[] args) { Fu f = new Zi(); Zi z = new Zi(); //1,父类中若没有method_3()编译会报错 f.method_1(); f.method_2(); f.method_3(); //2,静态的method_4()方法只运行左边的类的对象中的方法,即只参考左边的类 f.method_4(); z.method_4(); //3,静态和非静态的成员变量都只参考左边的类,可以将num的static去掉再次运行 System.out.println(f.num); System.out.println(z.num); } }
四 多态之object类
object:是所有对象的直接或者间接的父类,该类中定义的肯定
是所有对象都具备的功能。
常用的有equal,toString,通常这些方法都需要我们去重写
相关文章推荐
- spring学习之@ModelAttribute运用详解
- Java基础之理解Annotation
- Java线程学习笔记(一个)
- Java二进制兼容性概述
- Java线程(八):锁对象Lock-同步问题更完美的处理方式
- java复制文件
- Java multi-threads to read DB then writting to local disk with Producer & Consumer model
- 二维码QRCode
- Java线程(七):Callable和Future
- Java线程(五):Timer和TimerTask
- Java线程(六):线程池
- eclipse创建android项目无法正常预览布局文件
- Java线程(三):线程协作-生产者/消费者问题
- Java9的一些新特性介绍
- Java线程(二):线程同步synchronized和volatile
- Java线程(一):线程安全与不安全
- java
- Eclipse -- An API baseline has not been set for the current workspace
- Eclipse设置完整的Java代码提示
- “黑马程序员” JDK怎么安装与配置环境变量