面向对象 第七课 内部类

局部内部类:定义在方法中,比方法的使用范围更小,是内部类中最少使用的一种类型。
它像局部或者临时变量一样,不能被public、protected、private和static关键字修饰,它只能访问方法中定义的final类型的局部变量。局部内部类在方法中定义,所以只能在方法中使用,即只能在方法中实例化局部内部类对象,并调用其定义的方法。


匿名内部类:它是一种特殊的内部类,是没有类名的局部内部类,不使用关键字class、extends等,且没有构造器。匿名内部类的定义和实例化对象合并在一起。
匿名内部类是为实例化唯一对象而定义的类。当我们只需要实例化类的一个对象,而且不用类名时,使用匿名内部类可以使代码更简洁。***匿名内部类隐式地继承了一个父类或实现一个接口***。匿名内部类在编程中使用得比较多,通常作为一个方法参数使用。


匿名内部类没有类名,无法定义构造器,只能使用实例初始化块


内部类的作用或好处:
1>内部类可以很好的实现封装(数据隐藏),因为一般非内部类是不允许有private、protected访问权限,但内部类可以有。
2>内部类拥有外部类的所有成员(成员变量和成员方法)的访问权限。
3>可以实现多重继承。
4>可以避免修改接口而实现同一个类中两种同名方法的调用。


多重继承:是一个类可以同时从多于一个的父类那里继承成员变量和方法。java为了保证数据安全,它只允许单继承。


有些时候我们会认为如果系统需要使用多重继承往往都是糟糕的设计,这个时候我们往往需要思考的不是怎么使用多重继承,而是你的设计是否存在问题。但有时候我们确实是需要实现多重继承的,而且现实生活中也真正存在这样的情况,比如遗传,我们即继承了父亲的基因,也继承了母亲的基因。而java的设计者提供了两种方式让我们间接来实现多重继承:内部类和接口。
这个特点非常重要,它也是java设计者设计内部类的最大理由之一,正是由于内部类的存在使得java的继承机制更加完善。(作为了解)


多态(多种形态)
生物学,是指一个生物或物种可以有多种不同的形式或阶段。OOP中,多态是指一个对象有多种形式的能力。


多态可以说是面向对象编程的精髓所在。java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同。单继承保证了继承关系的简单明了,但是势必在功能上有很大的显示。


多态的定义:多态是指同一个行为具有多个不同的表现形式或形态的能力。一句话描述多态:相同的行为,不同的实现。


多态分为静态多态(编译时多态或者早绑定)和动态多态(运行时多态或者晚绑定)
静态多态:指调用在一个类中有多个具有相同名称和不同参数列表的方法。它使用方法重载实现。
*****动态多态:指允许不同类的对象对同一行为(方法)作出相应的操作。即同一行为(方法)可以根据发送对象的不同而采用多种不同的表现方式。它使用动态绑定技术和方法重写实现。


动态多态的技术基础
向上转型技术:一个父类的引用变量可以指向不同的子类对象,或者说一个子对象可以被当做一个父类类型。


instanceof关键字:instanceof关键字用于判断运行是对象的真正类型。


动态绑定技术:运行时根据父类引用变量所指对象的实际类型执行相应的子类方法,从而实现多态性。


动态绑定技术:(dynamic binding)也叫延时绑定或后期绑定,是指在执行期间而不是编译时判断所引用对象的实际类型,根据其实际的类型调用其相应的方法,由于动态绑定是在执行时实现,这将导致java程序在运行时性能下降,这也是java程序性能不如其他语言编写的程序的一个主要原因。


动态绑定所具备的条件:
1>要有继承;
2>要有方法重写;
3>要有父类变量引用子类对象;
4>要有父类的变量调用重写的方法。


类的类型转换的规则
在继承关系的子类和父类中,有如下规则:
1>一个父类引用类型变量可以引用其子类的对象;
2>一个父类引用类型变量不可以访问其子类对象新增加的成员变量和方法;
3>可以使用instanceof关键字来判断引用类型变量所引用的对象是否属于某一个类。即判断子类是否是相应父类的子类。


向上类型转换:在继承关系中,子类的对象可以直接当作父类的对象使用,称为向上转型。
向下类型转换:在继承关系中,从父类对象到子类对象的转换,称为向下转型。向下转型要用强制类型转换。


注意:向上转型是安全的,向下转型是不安全的;建议使用向下转型时,先使用instanceof关键字验证具体的子类类型再进行强制类型转换。


多态的作用或优点:
1>可替换性,多态对已存在的代码具有可替换性。
2>可扩展性,多态对代码具有可扩展性,增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上,新加的子类更容易获得多态功能。
3>接口性,多态是父类通过方法签名,向子类提供了一个共同接口,由子类来完善或覆盖它而实现的。
4>灵活性,它在应用中体现了灵活多样的操作,提高了使用效率。
5>简化性,多态简化了对应用程序的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤其突出和重要。


值得注意的是:多态并不能够解决提高执行效率的问题,因为它是基于动态绑定。


Object类的getClass()方法可以获取引用类型变量所引用的实际对象类型。


当多态机制导致引用变量的声明类型和实际引用对象的类型存在不一致时,使用instanceof运算符来判断引用变量所引用的实际对象类型与某类之间的继承关系。


多态的主要应用--异构集合
多态另一个常见的应用时创建一个不是同一类型,但是有共同父类的数据集合。不同对象的集合称为异构集合。


抽象类
在编写类时,通常会在类中定义一些方法,用来描述该类所具有的行为。在类的方法体中,我们编写代码实现该类所要执行的行为。
在继承关系中,子类继承父类后,子类也就具有父类所具备的行为,如果子类继承了父类的行为,但是与父类的行为实现方式不同,就需要通过方法重写来覆盖父类的行为。
当抽象到一定的程度的时候,我们发现父类时没有必要进行实例化。


如何在语法上做到呢?----abstract关键字。


什么是抽象类:使用了关键字abstract声明的类叫做”抽象类“。如果一个类里包含了一个或多个抽象方法,类就必须指定abstract(抽象)。”抽象方法“属于一种不完整的方法,只含有一个方法签名,没有方法主体(内容)。


抽象类的特点:
1>抽象类不能实例化对象;
2>如果从抽象类继承一个类,就必须为抽象类中的所有抽象方法提供方法的定义,否则继承的类也会变成抽象类;
3>即使不包含任何abstract(抽象方法),也可以将一个类声明为抽象类,如果一个类没必要拥有任何抽象方法,而且我们想禁止那个类的所有实例,这种能力就会显得非常有用。


使用关键字abstract可以声明一个抽象类,该关键字可以出现在类声明时class关键字前的任何地方。


public abstract class Test{}
本类使用abstract修饰符修饰,表示该类不能创建实例,必须有子类来实现。


将父类声明为抽象后,仅有的改变是我们不能再实例化一个父类对象,其它的所有保持不变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值