----------------------------------------------------------------------------- android培训、java培训、期待与您交流! --------------------------------------------------------------------------------
理解面向对象
- 面向对象是相对面向过程而言
- 面向对象和面向过程都是一种思想
- 面向过程
- 强调的是功能行为
- 面向对象
- 将功能封装进对象,强调具备了功能的对象。
- 面向对象时基于面向过程的。
注:
在开发的时候我们首先要先去找Java里面是不是已经提供好了相对应的对象。
没有对象则自己造一个对象,将其功能定义进去,方便大家日后使用。
面向对象的三个特征:
封装、继承、多态。
以后开发其实就是在找对象使用;没有对象,就创建一个对象。
找对象,建立对象,使用对象,维护对象的关系。
类和对象的关系:
类就是对现实生活中事物的描述。
对象就是这类事物,实实在在存在的个体。
- 例如:
现实生活中的对象:张三、李四;
想要描述:提取对象中共性内容,对具体的抽象;
描述时:这些对象的共性有:姓名,年龄,性别,学习java功能。
映射到java中,描述就是class定义的类;
具体对象就是对应java在堆内存中用new建立实体。
属性对应的是类中的变量,行为对应的是类中的函数(方法)。
其实定义类,就是在描述事物,也就是在定义属性和行为。
类类型变量指向对象。
成员变量和局部变量
作用范围:
成员变量作用于整个类中;
局部变量作用于函数中,或者语句中。
在内存中的位置:
成员变量:在堆内存中,因为对象的存在,才在内存中存在。
局部变量:存在于栈内存中。
存储到什么地方
程序运行时,对象时怎么进行放置安排的呢?特别是内存是怎样分配的呢?对这些方面的了解会对你有很大的帮助。有六个不同的地方可以存储数据;
- 寄存器(register)。
这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
- 栈(stack)。
位于通用RAM(random-access memory,随机访问存储器)中,但通过它的“堆栈指针”可以从处理器哪里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时,java编译器必须知道存储在栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些java数据存储于栈中——特别是对象引用,但是java对象并不存储于其中。
- 堆(heap)。
一种通用型的内存池(也存在于RAM去),用于存放所有的java对象。堆不同于栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象时,只需用new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代价。用堆进行存储分配比用栈进行存储需要更多的时间(如果确实可以在java中像在C++中一样用栈保存对象)。
- 静态存储(static storage)。
这是的“静态”是指“在固定的位置”(尽管也在RAM里)。静态存储里存放程序运行时一直存在的数据。你可用关键字Static来标识一个对象的特定元素是静态的,但java对象本身从来不会存放在静态存储空间里。
- 常量存储(constant storage)。
常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分隔离开,所以在这种情况下,可以选择将其存放在ROM(read-onlymemory,只读存储器)中。
- 非RAM存储(non-RAM storage)。
如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是“流对象(streamed object)”和“持久化对象(persistent object)”。在“流对象”中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此,即使程序终止,它们扔可以保持自己的状态。这种存储方式的技巧在于:把对象转化成可以存放在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象。java提供对轻量级持久化(lightweight persistence)的支持,未来的java版本可能会为持久化提供更全面的解决方案。
匿名对象的应用
匿名对象使用方式一:当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化;
如果对一个对象进行多个成员调用,必须给这个对象起个名字。
凡是简化的都有局限性。
匿名对象使用方式二:可以将匿名对象作为实际参数进行传递。
封装(Encapsulation)
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
好处:
- 将变化隔离;
- 便于使用;
- 提高重用性;
- 提供安全性。
封装原则:
- 将不需要对外提供的内容都隐藏起来。
- 把属性都隐藏,提供公共方法对其访问。
private:私有,权限修饰符,用于修饰类中的成员(成员变量,成员函数)。私有只在本类中有效。
成员变量有默认的初始化值,因为它在堆内存中;
局部变量没有默认的初始化值,因为它在栈内存中,必须要设置初始化值后才能参与运算。
Java使用三个关键字来在类的内部设定边界:public、private、protected。
public
表示紧随其后的元素对任何人都是可用的。
private
表示除类型创建者和该类型的内部方法之外的任何人都不能访问的元素;
private就像你与客户端程序员之间的一堵砖墙,如果有人试图访问private成员,就会在编译时刻得到错误信息。
protected
关键字与private作用相当,差别仅在于继承类可以访问protected成员,但是不能访问private成员。
构造函数
特点:
- 函数名与类名相同;
- 不用定义返回值类型;
- 不可以写return语句。
作用:
给对象进行初始化。
注意:
- 默认构造函数的特点。
- 多个构造函数是以重载的形式存在的。
对象一建立就会调用与之对应的构造函数。
构造函数的小细节:
当一个类中没有定义构造函数时,系统会默认给该类加入一个空参数的构造函数。
当在类中自定义了构造函数后,默认的构造函数就没有了。
构造函数和一般函数在写法上有不同。
在运行上也有不同:
构造函数是在对象一建立就运行,给对象初始化。
而一般方法是对象调用才执行,是给对象添加对象具备的功能。
一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用多次。
什么时候定义构造函数呢?
当分析事物时,该事物存在就具备一些特性或行为,那么将这些内容定义在构造函数中。
构造代码块
作用:给对象进行初始化。
对象一建立就运行,且优先于构造函数执行。
构造代码块与构造函数的区别:
构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化。
构造代码块中定义的是不同对象共性的初始化内容。
this
this:看上去是用来区分局部变量和成员变量的同名情况。
this为什么可以解决这个问题呢?
this到底代表的是什么呢?
this代表本类的对象,到底代表哪一个呢?
this代表它所在函数所属对象的引用。
简单说,哪个对象在调用this所在的函数,this就代表哪个对象。
this的应用:
当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
构造函数间的调用只能用this语句。
this语句只能放在构造函数的第一行。因为初始化要先执行。
this的两种用法:
- 用于区分局部变量和成员变量同名情况。
- 用于构造函数间调用;一般函数是不能直接调用构造函数的,因为this语句是不能用于一般函数的,只能在构造函数间。
----------------------------------------------------------------------------- android培训、java培训、期待与您交流!--------------------------------------------------------------------------------
详细请查看:http://edu.csdn.net/heima/