您的位置:首页 > 职场人生

黑马程序员-java学习日志之面向对象

2014-01-12 23:02 148 查看
href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

面向对象:面向对象是相对面向过程,这是两种思想。面向对象将功能封装进对象,强调具备了功能的对象,面向对象是给予面向过程的,面向过程强调的事功能行为。

例如,把大象装进冰箱总共分几步,可以分为面向对象和面向过程两种写法。面向过程是一种思想,面向对象的出现把复杂的对象简单化。

面向过程是面向对象的一个基础。

面向对象的举例:一定要调用具备次功能的函数,万物皆对象。面向对象基本的概念。我们写程序的时候再定义功能的时候必须先操作对象,然后再写功能。先寻找java中提供的对象即可,如果没有对象就要自己创建对象。

面向对象的优点

a.面向对象程序设计能让我们使用“类”来更好的模拟现实世界中实体的特征和行为,也就是试图用软件对象去模拟现实对象,从而实现模拟现实世界;

b.对象的行为和属性都被封装在类中,外界通过调用类的方法来获得,无需关注类的内部如何实现,这样就隐藏了内部信息;

c.可以通过类的模板,创建很多个类的对象,增加了代码的复用性!

堆内存中的一个特点就是默认初始化值为空。

匿名对象:匿名对象是对象的简化形式

匿名对象和有名对象的区别:

匿名对象的特点:匿名对象改变属性没有意义,但是具有方法的调用。

匿名对象使用方式一:当对对象的方法值调用一次时,可以用匿名对象来完成,这样写比较简化,如果对一个对象进行多个成员调用,必须给这个对象起个名字。

匿名对象使用方式二:可以讲匿名对象做为实际参数来传递show(new Car());

面向对象三大特性——封装、继承、多态

封装

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。隐藏了细节之后,对于使用者来说,更简单了

好处:将变量隔离。便于使用。提高重用性。提高安全性。

封装原则:1,将不需要对外提供的内容都隐藏起来。2,把属性都隐藏,提供公共方法对其访问。

函数本身就是一个最小的封装体。类也是一个封装,包也是一种封装,框架也是.

继承

事物与事物之间的关系,并把这种关系给抽取出来,就是继承。

继承特点:1,提高了代码的复用性。2,让类与类之间产生了关系。有了这个关系,才有了多态的特性。

注意:

一、千万不要为了获取其他类的功能,简化代码而继承。必须是类与类之间有所属关系(即is a 关系)才可以继承。

二 、java中之支持单继承,不支持多继承,因为多继承容易带来安全隐患,因为如果继承的多个父类中要是定义了相同功能,但功能内容不同时,不确定要运行哪一个。这就是优化C++的部分(C++支持多继承),从而使java更简单易学,但是java保留了这种机制,并用另一种体现来完成表示,叫实现。

Java 支持多层继承,也就是一个继承体系,

如何使用一个继承体系的功能,————想要使用体系,先查阅父类的描述,因为父类中定义的是该体系中的共性功能,通过了解共享功能,就可以知道该体系的基本功能,那么这个体系已经可以基本使用,

但是在具体调用时,要创建最子类的对象,原因:一是因为有可能父类不能创建对象,如抽象类。二是创建子类对象可以使用更多的功能,包括基本的也包括特有的。

简单一句话:查阅父类功能,创建子类对象使用功能。

多态

多态:可以理解为事物存在的多种体现形态。

1,多态的体现:父类的引用指向了自己的子类对象。换种说法就是:父类的引用也可以接收自己的子类对象。

代码体现:Animal a = new Cat();

2,多态的前提: 必须是类与类之间有关系。要么继承(extends),要么实现(implements)。通常还有一个前提:存在覆盖。如果不存在覆盖,那么多态就没有意义了。

3,多态的好处: 多态的出现大大的提高程序的扩展性。提高代码的复用性

4,多态的弊端: 虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。不能预先去使用子类,因为那个时候子类还不存在,没有子类,怎么可能去访问? 但是我们应该侧重扩展性。

也就是说: 多态自始至终都是子类对象在做着变化。

函数也具有多态性,重载和覆盖就是具体体现。

在多态中,非静态成员函数中的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

在多态中,成员变量的特点:无论编译和运行,都参考左边(也就是参考引用型变量所属的类)。

在多态中,静态成员函数、静态成员变量的特点:无论编译和运行,都参考做左边。静态不覆盖,

静态方法,当你在调用时,静态方法会加载内存中,这个时候是不需要对象,因为静态方法不所属对象,静态本身不访问,不参考对象。

当子类出现和父类一模一样的函数时,当子类对象调用该函数,会运行子类函数的内,如同父类的函数被覆盖一样。这种情况是函数的另一个特性:重写(覆盖)

当子类继承父类,沿袭了父类的功能,到子类中,但是子类虽具备该功能,但是功能的内容却和父类不一致,这时,没有必要定义新功能,而是使用覆盖特殊,保留父类的功能定义,并重写功能内容。

覆盖:

1.子类覆盖父类,必须保证子类权限大于等于父类权限,才可以覆盖,否则编译失败。

2.静态只能覆盖静态。

记住大家:

重载:只看同名函数的参数列表。

重写:子父类方法要一模一样。

3.子父类中的构造函数

在对子类对象进行初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式的语句super();

super():会访问父类中空参数的构造函数,而且子类中所有的构造函数默认第一行都是super();

为什么子类一定要访问父类中的构造函数

因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时,要先访问一下父类中的构造函数。如果要访问父类中指定的构造函数,可以通过手动定义super语句的方式来指定。

注意:super语句一定定义在子类的构造函数的第一行

结论:子类的所有的构造函数,默认都会访问父类中空参数的构造函数。因为子类每一个构造函数内的第一行都有一句隐式super();当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问父类中的构造函数。

当然:子类的构造函数第一行也可以手动指定this语句来访问本类中的构造函数。子类中至少会有一个构造函数会访问父类中的构造函数。

<a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: