你怎么理解面向对象?详细说明面向对象的三大特征。

你怎么理解面向对象?详细说明面向对象的三大特征。

  • 面向对象

把数据及对数据的操作方法放在一起,作为一个相互依存的整体–对象。对同类对象抽象其共性,形成类。类中的大多数数据,只能在本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。简单讲就是说万物皆对象。

  • 三大特征

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 ( ) ;

作用就是限制对特有功能的访问。
专业讲:向上转型,将子类隐藏,就不用使用子类的特有方法。
运行时:参考的是对象所属的类中是否有调用的函数。
简单讲:就是编译看左边,运行看右边。

猜你喜欢

转载自blog.csdn.net/Feng0811xin/article/details/84145268