java面向对象编程---类与对象
1.面向对象与面向过程。
面向过程:所谓的面向过程指的是面对一个问题的解决方案,不会做出重用设计的思考。c语言就是面对过程语言的代表。
面向对象:面对对象主要的设计形式为模块化设计,并且可以进行重用配置。在整个的面对对象的设计里面更多的考虑的是标准。在使用时根据标准进行拼装。
2.面对对象的三个主要特征。
封装性:内部操作对外部不可见,当内部的操作都不可以直接使用的时候才是安全的。
继承性:在已有结构的基础上继续进行功能的扩充。
多态性:是在继承性的基础上扩充而来的概念,指的是类型的转换处理(范围内可以转换的)。
3.面对对象的程序开发的三个步骤。
OOA:面对对象分析;
OOD:面对对象设计;
OOP:面对对象编程;
4.类与对象简介
类是对某一类事物的共性的概念惊喜,而对象描述的是一个具体的产物。类是一个模板,而对象才是类可以使用的实例,先有类再有实例。对象无法超出类的范畴。
类有两个组成:
成员属性(Field):类的信息,有些时候为了简化称其为属性;
操作方法(Method):定义对象具有的处理行为;
在Java中类是一个独立的结构体,所以需要使用class来进行定义,而在类中主要由属性和方法组成,属性是一个个具体的变量,方法就是可以重复执行的代码。
类是引用数据类型,默认值为null;
5.对象实例化操作初步分析
Java之中类属于引用数据类型,引用数据类型最大困难之处在于要进行内存的管理,同时在操作是也会发生内存关系的变化。
堆内存:保存的 是对象的具体信息,在程序之中堆内存空间的开辟是通过new完成的;
栈内存:保存的是一块堆内存的地址,即通过地址找到堆内存,而后找到对象内容;
new拥有开辟内存的最高级别。
栈内存中保存的是堆内存的地址,new的对象名表示的是栈内存的名字。
对象必须实例化后才能使用,不然空指向异常。
引用传递分析
引用传递本质:同一块堆内存空间可以被不同的栈内存所指向,也可以更换指向。
引用传递可以发生在方法上,这个时候一定要观察方法参数类型,同时也要观察方法的执行过程。
一个栈内存只能存放一个地址。
所谓的垃圾空间指的是没有任何栈内存指向的的堆内存,所有的垃圾将被GC(Garbage Coollector)不定期进行回收并且释放无用内存空间,但是如果垃圾过多,一定将影响到GC的处理性能,从而降低整体的程序性能,那么实际的开发中垃圾的产生越少越好。
一个栈内存只能够保存有一个堆内存的地址数据,如果发生更改,则之前的地址数据将从此栈内存中彻底消失。
在以后进行任何类定义的时候一定要记住,类中的所有属性都必须使用private封装(98%)。属性如果要访问必须要提供有setter、 getter
构造方法无任何返回值,new的时候自动执行。对象类型决定了你可以调用的方法和属性;
实例化对象的名称, 所有的操作通过对象实例化来进行访问。
new 开辟一块新的堆内存空间。
调用有参或者无参构造。
程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来处理的。如果加上void构造方法就与普通方法的结构完全一样了,这样编译器就会认为此方法是一个普通方法,构造方法是在对象实例化的时候调用的,而普通方法是在类对象实例化产生之后调用的。
既然构造方法本身是一个方法,那么方法就具有重载的特点,而构造方法重载的时候只需要考虑参数的类型及个数就可以了。
只要是方法都可以传递任意数据类型(基本数据类型、引用数据类型)。
this可以算是Java中比较复杂的关键字,因为this的使用形式上决定了它的灵活性,在程序里面使用this可以实现以下三类结构:
1、当前类的属性:this.属性
2、当前类中的方法(普通方法、构造方法):this().方法名称();
3、描述当前对象。
在Java程序之中“{}”是作为一个边界符,那么在程序里面进行变量(参数、变量)使用的时候,以“{ }”作为一个查找边界,所以按照就近取用的原则,此时的构造方法并没有能够访问类中的属性,所以此时为了明确标注出类的属性与参数的区别,往往会在属性前追加一个this。
对于本类构造方法的相互调用需要注意一下几点重要问题:
构造方法必须在实例化的时候调用,所以“this()”的语句只允许放在构造方法的首行,
并且需要一个明确的出口。
在一个类中,所有的属性一旦定义了实际上内容都交由各自的堆内存空间所保存。
使用static定义公共属性,保存在全局数据区。但是对于static属性的访问 需要注意一点:由于其本身是一个公共的属性,虽然可以通过对象进行访问,但是最好的做法是通过所有对象的最高代表(类)来进行访问,所以static可以由类名称直接调用。
static属性虽然定义在类之中,但是其并不受到实例化对象的控制。static属性可以在没被对象实例化的时候使用。
在以后进行类设计的时候首选的一定是非static属性(95%),而考虑到公共信息存储的时候才会使用到static属性(5%),static属性必须在实例化对象产生之后才可以使用,而static属性可以在没有实例化对象产生的情况下直接通过类名称进行 调用。
这个时候对于程序而言就有了两种:static方法、非static方法,这两个方法之间在调用上就有了限制
- static方法只允许调用static属性或static方法;
- 非static属性方法允许调用static属性或static方法;
所有的static定义的属性和方法都可以在没有实例化对象的前提下使用,而所有非static需要在对象实例化之后才能够使用。
如果说现在可以理解这个限制,那么对于之前的方法定义就可以得出新的结论:在最早讲解方法定义的时候强调过“当前定义的方法都是在主类中定义的,并且由主方法调用的”
static定义的方法或者是属性都不是写代码之初考虑的内容,只有在回避实例化对象调用并且描述公共的属性下才会考虑使用static定义的方法 或者是属性
在程序之中使用“{}”定义的结构就成为代码块,而后根据 代码块出现的位置以及定义的关键字的不同,代码块可以分为:普通代码块、构造块、静态块、同步代码块,其中对于同步代码块是在多线程的时候才会进行理解的。
- 普通代码块的主要特点是定义在一个方法之中的代码块。可以在一个方法之中进行一些结构的拆分,以防止相同变量名所带来的相互影响。
按照Java程序的开发标准规定相同名称的变量是不能够在同一个方法之中存在,但是由于此时有不同分界描述。
构造块是定义在一个类之中的。构造块会优于构造方法执行,并且每一次实例化新对象的时候都会调用构造块 中的代码
静态代码块主要指的是使用static关键字定义的 代码块,静态块的定义需要考虑到两种情况:主类中定义静态块、其他类中非主类中定义静态块。
非主类中定义静态代码块:此时可以发现静态代码块会优先于构造块执行,并且不管有多少个实例化对象出现静态代码块只会执行一次,静态代码块的主要目的是为了类中的静态属性初始化。
在主类中进行静态代码块的定义:静态代码块优先于主方法执行。