黑马程序员——面向对象、多态
2014-03-05 18:19
211 查看
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
引用类型实例:Cat c=new Cat();
Animal a= new Cat();
多态的使用主要问题存在于,当对象的引用类型为父类时,编译全部针对父类,当对象调用了父类中不存在的方法时编译就会失败。调用变量和方法时,只会调用父类中的变量,而调用方法时分两种情况,①方法被覆写,调用子类中覆写后的方法,②未被覆写,调用父类中方法。另外,考虑静态的情况,分为静态变量和静态方法。静态变量,与非静态变量相同,只调用父类中的值;静态方法,与非静态方法不同,调用父类中静态方法,无视重写。
关于静态,由于静态与对象存储方式不同,静态存储于方法区,对象存储于堆内存。二者之间无必然联系,静态只依赖于类的加载而存在,类使用解释也就释放静态。所以在多态中,静态的调用只与对象的引用类型相关。
简言之:分析顶层父类,了解功能;创建底层子类对象,实现功能。
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一、多态的产生
Java程序中支持单继承,也就是说一个子类只有一个直接父类,父类中的方法子类可以选择重写,也可以不重写。但是子类已经完全继承了父类的变量和方法。所以,根据引用类型的不同,子类对象可以分别实现父类、子类中方法。父类中没有被覆写的方法,两种引用类型都能使用。引用类型实例:Cat c=new Cat();
Animal a= new Cat();
二、多态的使用注意
class PolymorficTest { public static void main(String[] args) { Fu f=new Zi(); System.out.println(f.a); //System.out.println(f.b);类型为FU的变量f 中找不到变量b ,编译失败 f.A(); //f.B();父类中不存在该方法,编译时报 Zi z=(Zi)f; System.out.println(z.a); System.out.println(z.b); z.A(); z.B(); } } class Fu { int a=1; void A() { System.out.println("hello 我是A-Fu"); } } class Zi extends Fu { //int a=2; int b=1; /* void A() { System.out.println("hello 我是A-Zi"); } */ void B() { System.out.println("hello 我是B-Zi"); } }
多态的使用主要问题存在于,当对象的引用类型为父类时,编译全部针对父类,当对象调用了父类中不存在的方法时编译就会失败。调用变量和方法时,只会调用父类中的变量,而调用方法时分两种情况,①方法被覆写,调用子类中覆写后的方法,②未被覆写,调用父类中方法。另外,考虑静态的情况,分为静态变量和静态方法。静态变量,与非静态变量相同,只调用父类中的值;静态方法,与非静态方法不同,调用父类中静态方法,无视重写。
关于静态,由于静态与对象存储方式不同,静态存储于方法区,对象存储于堆内存。二者之间无必然联系,静态只依赖于类的加载而存在,类使用解释也就释放静态。所以在多态中,静态的调用只与对象的引用类型相关。
class PolymorficTest { public static void main(String[] args) { Fu f=new Zi(); System.out.println(f.a); //System.out.println(f.b);类型为FU的变量f 中找不到变量b ,编译失败 f.A(); f.C(); //f.B();父类中不存在该方法,编译时报 Zi z=(Zi)f; System.out.println(z.a); System.out.println(z.b); z.A(); z.B(); z.C(); } } class Fu { static int a=1; void A() { System.out.println("hello 我是A-Fu"); } static void C() { System.out.println("hello 我是C-Fu"); } } class Zi extends Fu { static int a=2; int b=1; /* void A() { System.out.println("hello 我是A-Zi"); } */ void B() { System.out.println("hello 我是B-Zi"); } static void C() { System.out.println("hello 我是C-Zi"); } }
三、多态的应用分析
在实际操作中,我们不断的向上抽取出了父类。父类,就是我们工程中的共性内容,创建父类引用类型的子类对象,可以对实例对象的共性内容进行修改、操作,实现高效。简言之:分析顶层父类,了解功能;创建底层子类对象,实现功能。
----------------------
ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员_JAVA之面向对象(封装,继承和多态)
- 黑马程序员——Java基础---深入理解面向对象(封装继承和多态)
- 黑马程序员_java_面向对象_多态
- 黑马程序员——java基础学习(面向对象,多态)
- 黑马程序员——OC语言学习——OC面向对象的三大特性:封装、继承、多态,OC字符串——NSString
- 黑马程序员——OC面向对象三大特性——封装,继承,多态。
- 黑马程序员-----面向对象的特性封装、继承、多态、抽象
- 黑马程序员--5--面向对象--多态
- 黑马程序员-----笔记整理(java基础五-------面向对象--多态)
- 黑马程序员 java学习笔记——面向对象3:多态(含内部类)
- 黑马程序员——java-面向对象二(继承,多态,抽象,接口,包,内部类)
- 黑马程序员——OC面向对象三大特性——封装,继承,多态。
- 黑马程序员----------面向对象三大特性之多态
- 黑马程序员_Java面向对象3_多态
- 黑马程序员:面向对象三大特征之一:多态的介绍
- 黑马程序员_面向对象(多态)
- 黑马程序员 JAVA基础<二> 面向对象之封装 继承 多态
- 黑马程序员---OC面向对象三大特性(封装、继承、多态)
- 黑马程序员__java基础__面向对象(多态、异常)
- 黑马程序员 Java面向对象(继承,抽象类,接口,多态,内部类)