Android温习之路:Day10java基础10

来源:互联网 发布:狸视频剪辑软件下载 编辑:程序博客网 时间:2024/05/18 12:39

昨天简单说了一下抽象和接口,今天来说一下多态吧。
多态呢简单理解呢就是多种形态,多态的好处就是提高了对象的可拓展性,弊端是前期建立了父类的引用,虽然能够接受所有的子类的对象,但是只能使用父类当中的功能,不能使用子类特有的功能。因为前期程序不知道后期新添的内容,但是前期的程序可以使用子类覆盖了父类方法的内容。
多态的前提:
1.必须存在继承关系
2.通常存在着覆盖的操作
这些呢在之前说过,忘记的可以再去看一下http://blog.csdn.net/xiaoyu940601/article/details/52865074回忆一下。
下面再来说一下对象的转型:

    Dog d = new Dog();         Animal a = new Dog();   //子类对象类型的提升

d和a的区别:
从外表看类型不一样,然而狗的引用d只能指向狗的对象,而animal的引用a,可以指向狗的对象,也可以指向猫的对象,他能指向所有继承animal子类的对象,所以他只能调用
animal中公有的方法。Dog到Animal就属于对象的向上提升,简单说说类型向上转型的优缺点:
好处:提高了拓展性
弊端:只能使用父类的方法。
这种提升可以限制对于子类对象的操作。
专业术语:向上转型
说完了向上转型,接下来再说一下向下转型,

Animal a = new Dog();      //向下转型,可以把父类的引用转换成子类的对象      Dog d1 = (Dog)a;   

向下转型的优缺点:

  • 好处:可以使用子类特有的方法。
  • 弊端:如果类型转换错误,就会出现异常。
    向上转型和向下转型的应用场景:
    什么时候使用向上转型,什么时候使用向下转型呢?
    当需要对程序进行拓展,或者限定对子类对象的操作时,可以使用向上转型,操作其父类型。
    当要使用子类特有的功能时,就向下转型,但是转型前要判断,否则容易出问题。
    【误区】
    在转型过程当中,都是子类的对象在做着类型的改变,千万不要把父类对象转化为子类类型 这是不可能的。
Animal a = new Animal();  Dog d = (Dog)a; //以上写法是错误的。

中间给大家介绍一个关键字,提提神,instanceof
用处:判断对象属不属于这个类型,不判断就会造成类型转换异常,这是对象转换的健壮性的判断,在对象的向下转型之前一定要判断对象的类型!!!
下面再来给大家介绍个类:上帝类
[Object]
所有类的父类。可以称之为java当中的上帝。
怎么来的?
所有对象都具备的内容,不断的抽取而来。
特点:
1.Object类是类层次结构的根,java所有类都是从这个类继承而来。
2.Object类是java中唯一一个没有父类的类。
3.Object类是所有类中方法最少的类。
上帝类作为了解就好,下面返回来再说一下多态。
说一下多态的表现在成员调用的特点:
1.成员变量
对于成员变量而言,在编译时期,编译器阅读的是引用型变量所属的类中,是否有这个变量,
如果有编译通过,如果没有编译失败。
运行时期,调用也是引用型变量所属的类中的成员变量。
简单来说:编译和运行都看等号的左边。
2.成员函数
结论:因为函数有重写的特点,运行的子类对象在调用子类当中的show方法,而覆盖了父类的show方法.
编译时期:参考的是引用型变量所属的类中是否用该方法,如果有编译通过,如果没有编译失败。
运行时期:参考的是所属对象的类中是否有该方法,如果有就调用子类自己重写的方法,如果没有就调用父类
当中的方法。
简单来说:编译看左边,运行看右边。
存在的原因:因为函数有重写的特性。
3.静态函数
静态方法不需要绑定对象,他绑定的是所属的类。
非静态方法就需要对象和当前运行的函数进行动态的绑定,哪个对象调用了这个方法,这个方法就所属与哪个对象,
就会运行哪个对象中的show方法。
编译时期:参考的是引用型变量所属的类中是否用该方法,如果有编译通过,如果没有编译失败。
运行时期:参考的也是引用型变量所属的类中是否用该方法,对这个方法进行处理。
简单来说:编译和运行都要看左边,因为静态方法不属于对象,所属于类,所以会在类加载时,静态方法就绑定
在所属的类上。静态调用不需要对象。
最后说一下几种内部类,什么事内部类,什么是内部类?
将一个类定义在另一个类的里面,里面的那个类就是内部类。
内部类的特点:
1.内部类可以直接访问外部类当中的成员。
2.外部类要想直接访问内部类成员时,必须要先创建内部类对象
中间来插两个小问题:
1.为什么要定义内部类呢?
答:类是用来描述事物的,如果事物当中还含有具体的事物,并且这个具体的事物还要访问所属事物当中的内容,这时就用内部类来定义。
如果一个类想要直接的访问其他类中的成员,并且他们还有紧密联系的时候,就把他写成内部类。
2.为什么内部类能够直接访问外部类的成员呢?
原因:因为内部类中持有一个外部类的引用,名称就是 外部类.this
内部类的修饰符:
1.权限修饰符:public default private
公有的或者默认的:可以直接访问内部类。
标准格式:

    外部类名.内部类名  对象名 = new 外部类名().new 内部类名();

私有的:不能再此类的外部访问到。
说一下静态内部类的一些知识:
静态内部类:
使用修饰符static来修饰。
内部类被静态修饰,会出现访问局限性,只能访问外部类当中的静态成员,不能访问非静态成员。
内部类被静态后,会随着类的加载而加载。
如果内部类中定义了静态成员,那内部类必须被静态化,否则就编译错误。
访问静态内部类中的非静态成员的方法。

 Inner2 in = new Outer2.Inner2();

访问静态内部类中的静态成员的方法
Outer2.Inner2.function();
重点:内部类定义在外部类成员的位置上,所以才具备了这些修饰符。
说完了静态内部类,再说一下局部内部类
局部内部类:
内部类可以定义在外部类方法当中,不能用static修饰。
局部内部类的有效范围就是在他所在的方法中。
局部内部类不能访问他所在的方法的变量,因为能将内部类的引用传出来。
简单来说,内部类定义在局部上,不能访问局部变量,可以访问被final修饰的常量。
匿名内部类:
凡是匿名的都是简写格式,好处是写法简单,
匿名内部类:写法简单
匿名内部类的前提:
匿名内部类需要实现或者继承一个接口或者外部类,这个时候才能简写成匿名内部类的形式。
匿名内部类其实就是一个匿名子类对象,这个对象使用大括号结尾的。
内部还可以定义成员,也就是说他是一个带有成员内容的对象,这个对象有点胖。
格式:

 new 父类名(接口名){需要重写的方法}.成员函数

最后说一下内部类和继承的区分:
内部类和继承都有一个共同的特点:代码共享。
继承是所属关系,is a 关系。
内部类和外部类就是寄生关系。
今天主要是一些概念性的东西,主要理解一下就好,明天咱们来讲一下数组,晚安^_^

0 0
原创粉丝点击