你怎么理解面向对象?详细说明面向对象的三大特征。
-
面向对象
把数据及对数据的操作方法放在一起,作为一个相互依存的整体–对象。对同类对象抽象其共性,形成类。类中的大多数数据,只能在本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。简单讲就是说万物皆对象。
- 三大特征
1.封装:
利用抽象数据类型将基本数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,使其尽可能的隐藏内部的细节,只保留一些接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
-
优点:
减少耦合性:可以独立的开发、测试、优化、使用、理解和修改
减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
有效的调节性能:可以通过剖析确定哪块模块影响了系统的性能
提高软件的可重用性
降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块有可能是可用的
2.继承:
提高代码的复用性
让类与类之间产生了关系,给第三特征提供了前提
java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行了改良
单继承:一个子类只能有一个直接父类
多继承:一个子类可以有多个直接父类(java中不允许,进行改良)不直接支持,是因为多个
父类终有相同成员,会产生调用不确定性
工程上的多继承:
被实际开发经验抛弃的多继承
工程开发中真正意义上的多继承是几乎不被实用的
多继承带来的代码复杂性远多于其带来的便利
多继承对代码维护上的影响是灾难性的
在设计方法时,任何多继承都可以用单继承代替
JAVA支持多层(多重)继承,C继承B,B继承A,就会出现一个继承体系
当要使用一个集成体系时,
1.查看该体系中的顶层类,了解该体系的基本功能
2.创建体系中的最子类对象,完成功能的使用
3.什么时候定义继承呢?
当类与类之间存在着所属关系的时候,就定义继承。xxx是yyy中的一种:格式(xxx extends yyy)
所属关系:(xxx is a yyy.)的关系
成员函数:当子父类中出现成员函数一模一样的情况时,会运行子类的函数。这种现象称为覆盖操作。这是函数
在子父类中的特征。
函数的两个特征:
1.重载:在一个类中,overload
2.覆盖:子类中,覆盖也称为重写,复写。override
覆盖的注意事项:
1.子类方法覆盖父类方法时,子类权限必须大于父类的权限
2.静态只能覆盖静态,或被静态覆盖
什么时候使用覆盖操作?
当一个类进行子类的扩展时,子类需要保留父类的功能声明,但是要定义子类中该功能的特有内容时,
就使用覆盖操作完成。(子类当中用super完成)
抽象类的继承:
特点:1.方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。抽象方法必须定义在抽象类中,该类必须也被abstract修饰。
2.抽象类不能被实例化,因为调用抽象方法没意义
3.抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,这个子类还是抽象类。
抽象类有构造函数吗?
有。用于给子类进行初始化。
抽象类中可以不定义抽象方法吗?
可以的。但是很少见。目的就是不让该类创建对象。AWT的适配器就是这种类。
通常这个类中有方法体,但是没有内容。
抽象关键字不可以和那些关键字共存吗?
private(私有)父类方法不能被子类覆盖
static(静态)静态和抽象不能共存在方法上,因为静态属于字节码,不需要对象就可以运行;而抽象方法没有方法体,运行没有意义,所以不能共存。(但是一个抽象类可以有静态方法;抽象类不能实现实例化,但是可以通过类名.方法名()来调用)
final(最后)不行
抽象类和一般类的异同点:
相同点:都是描述事物的,都在内部定义了成员。
不同点:1.一般类有足够的信息描述事物。而抽象类描述事物的信息一般不足。
2.一般类中不能定义抽象方法,抽象类中可以定义非抽象方法。
3.一般类可以被实例化,抽象类不可以被实例化。
抽象类一定是父类吗?
是的。因为需要子类覆盖其方法后才可以对子类实例化。
3.多态
定义:某一种事物的多种存在形态。
例:猫这个对象对应的类型是猫类型
Cat x = new Cat();
同时猫也是动物中的一种,也可以把猫称为动物。
父类引用指向子类对象。
Animal y = new Cat ();
动物是猫和狗具体事物中抽取出来的父类型。
-
对象的多态性
*** - 简单说,就是一个对象对应着不同的对象。
多态在代码中的体现:
- 父类或者接口的引用指向子类的对象。
- 多态的好处:
提高代码的扩展性,前期定义的代码可以使用后期的内容。
- 多态的弊端:
前期定义的内容不能使用(调用)后期子类的特有内容。
- 多态的前提:
1.必须有关系、继承、实现。
2.要有覆盖。
- 自动类型提升
Animal x = new Cat ( );
猫对象提升为动物类型,但是特有功能无法访问。
作用:限制对特有功能的访问。
专业讲:向上转型
如果还想用具体动物猫的特有功能,可以将该对象进行向下转型。
Cat c = (Cat) a ;
向下转型的目的是为了使用子类中的特有方法。
**
注意:
**
对于转型,自始至终都是子类对象在做着类型的变化。
`多态的特点:
1、多态时,成员的特点:
编译时,参考引用型变量所属的类中的是否有调用的成员变量。有,编译通过;没有,编译失败。
运行时,参考引用型变量所属的类中是否有调用的成员变量,并运行该所属类中的成员变量。
简单说,编译和运行都参考等号的左边。
2、成员函数(非静态)
编译时:参考引用型变量所属的类中是否有调用的函数。有编译通过;没有,编译失败。
3.静态函数
编译时:参考引用型变量所属的类中是否含有调用的静态方法。
运行时:参考引用型变量所属的类中是否含有调用的静态方法。
简单说:编译和运行都看左边。
其实对于静态方法,是不需要对象的,直接用类名调用即可。
自动类型提升,猫对象提升为动物类型。但是,特有功能无法访问。
Animal a = new Cat ( ) ;
作用就是限制对特有功能的访问。
专业讲:向上转型,将子类隐藏,就不用使用子类的特有方法。
运行时:参考的是对象所属的类中是否有调用的函数。
简单讲:就是编译看左边,运行看右边。