黑马程序员——面向对象(三)

发布时间:2014-10-22 14:17:11编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"黑马程序员——面向对象(三)",主要涉及到黑马程序员——面向对象(三)方面的内容,对于黑马程序员——面向对象(三)感兴趣的同学可以参考一下。

 -----------android培训、java培训、java学习型技术博客、期待与您交流!------------                                            黑马程序员——面向对象(三) 一、多态 1、多态的基本概念      多态是指同一事物具有多种形态即为多态。      使用多态特性可以使一个对象具有多种形态,从而使对象可以具有更多的特性功能,服务于更多的环境。      在面向对象语言中,我们可以将函数的形参定义为一个父类类型,而在真正调用该函数时这个父类类型的所有子类对象都可 以传入,根据传入的 子类对象不同函数可以运行处多种形态。 2、多态的条件    1)要有继承或者实现。    2)存在方法的重写。 3、多态的利弊       利:提高了程序的可扩展性和后期可以维护性。       弊:只能使用父类中的引用访问父类中的成员。也就是说使用了多态,父类型的引用在使用功能时,不能直接调用子类中的特有方法。如:Animal          a =new Cat(); 这代码就是多态的体现,假设子类Cat中有特有的抓老鼠功能,父类型的 a就不能直接调用。这上面的代码中,可以理解为Cat类型提         升了,向上转型。       如果此时父类的引用想要调用Cat中特有的方法,就需要强制将父类的引用,转成子类类型,向下转型。如:Catc = (Cat)a;       注:如果父类可以创建对象,如:Animal a = new Animal(); 此时,就不能向下转型了,Cat c = (Cat)a; 这样的代码就变得不容许,编译时会报错。所        以千万不能出现这样的操作,就是将父类对象转成子类类型。         我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以被强制转换。多态至始至终都是子类对象在做着变化。 4、多态的特点 1)多态中非静态成员函数的特点       在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。       在运行时期:参阅对象所属的类中是否有调用的方法。这就是说,如果父类中有一个非抽象的方法,而子类继承后又将其复写了,在多态运行时,       父类的引用调用这个同名函数时,被运行的将是父类中的方法。       简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。 2)多态中成员变量的特点       无论编译和运行,都参考左边(引用变量所属的类)。如:多态中的父类引用调用成员变量时,如果父类和子类有同名的成员变量,那么被调用的       是父类中的成员变量。 3)多态中静态成员函数的特点        无论编译和运行,都参考左边。也就是父类引用在调用静态同名函数时,被调用的是父类中的静态函数。这是因为,当类一被加载,静态函数就随        类绑定在了内存中。此时,不需要创建对象,就可以使用类名直接调用。同时,父类中的静态成员函数一般是不被复写的。        类在方法区中的分配:分为静态区和非静态区,而关键字this和super在非静态区。 二、内部类 1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。可以直接建立内部类对象。       格式:          外部类名.内部类名  变量名 =外部类对象.内部类对象          如:    Outer.Inner in =new Outer().new Inner();         当内部类在外部类中的成员位置上时,可以被成员修饰符所修饰。比如:            private:将内部类在外部类中进行封装。            static:内部类就局部static的特性。但是当内部类被static修饰后,只能直接访问外部类中的static成员。出现了访问局限。           在外部其他类中,直接访问static内部类的非静态成员的格式为:            new 外部类名.内部类名().方法名();            如:new  Outer.Inner().function();            在外部其他类中,直接访问static内部类的静态成员格式为:            外部类名.内部类名.方法名();             如:Outer.Inner.function(); 注意:        1)当内部类中定义了静态成员时,该内部类必须是static的。        2)当外部类中的静态方法访问内部类时,内部类也必须是static的。        3)在实际应用中,内部类通常被定义为private,而很少定义为public。 2、内部类定义在局部        内部类定义在外部类中的某个方法中,创建了这个类型的对象时,且仅使用了一次,那么可在这个方法中定义局部类。        1)不可以被成员修饰符修饰。如public、private、static等修饰符修饰。它的作用域被限定在了声明这个局部类的代码块中        2)可以直接访问外部类中的成员,因为还持有外部类中的引用。 注意:内部类不可以访问它所在的局部中非最终变量。只能访问被final修饰的局部变量。 如下面的代码: class Outer { int x = 3; void method(final int a) { //方法中内部类访问的局部变量要用final修饰 final int y = 4; class Inner { //定义内部类 void function() { System.out.println(y); System.out.println(a); } } new Inner().function(); } } class InnerClassDemo3 { public static void main(String[] args) { Outer out = new Outer(); out.method(7); out.method(8); } } 4、匿名内部类       1)匿名内部类其实就是内部类的简写格式。       2)定义匿名内部类的前提:            内部类必须是继承一个类或者实现接口。            特殊情况:因为所以的类都有一个父类Object,所以在定义时也可以用Object。       3)匿名内部类的格式:  new父类或者接口(){定义子类的内容}       4)其实匿名内部类就是一个匿名子类对象。可以理解为带内容的对象。       5)匿名内部类中定义的方法最好不要超过3个。 匿名内部类的利与弊:       好处:简化书写       弊端:           1)不能直接调用自己的特有方法、           2)不能做强转动作。           3)如果继承的父类或接口中有很多方法时,使用匿名内部类阅读性会非常差,且调用会很麻烦。 匿名内部类的应用: abstract class AbsDemo { abstract void show(); } class Outer { int x = 3; /* class Inner extends AbsDemo { void show() { System.out.println("show:"+x); } } */ public void function() { //匿名内部类 new AbsDemo() { void show() { System.out.println("x="+x); } }.show();//相当new Inner().show(); } } class InnerClassDemo4 { public static void main(String[] args) { new Outer().function(); }                   -----------android培训、java培训、java学习型技术博客、期待与您交流!------------


上一篇:hdu 4726 Kia's Calculation
下一篇:详述Linux ftp命令的使用方法

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款