一、面向对象编程:
现在的编程主要有一下几种:
1)面向对象编程
- 例子:狗吃屎(主要突出的是狗和屎两个对象)
- 每个对象 ----> 是一个类
- 属性及方法 —> 能够进行现实生活的抽象
- 名次扩展:
OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象编程
2)面向过程编程
例子:吃狗屎(主要突出 吃 这一过程)
3)面向切面编程(EE-AOP)
4)面向接口编程 - 接口优先原则
5)函数式编程
二、面向对象编程的三大特征:
-
封装性:所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。简而言之就是,内部操作对外部而言不可见(保护性)
-
继承性:继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
-
多态性(*):所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。
三、类与对象的定义与使用
-
所谓的类是指共性的概念,而对象指的是一个具体的、可以使用的事物。
-
产生:首先产生类(类是生产对象的蓝图),而后才可以产生对象。对象的所有行为,一定在类中进行了完整的定义。
3.1 类与对象的定义:
举个例子(定义一个Person类):
其中关键字new的作用:开辟内存,,,只要出现了关键字new,就开辟了内存
Java中,所谓的性能调优,调整的就是内存问题
4、对象内存分析
我们可以简单的将java中的内存区域分为栈内存和堆内存两块区域(实际Java内存区域的划分远比这个复杂,后续会详细讲述)
- 栈内存(虚拟机局部变量表):存放的是局部变量(包含编译期可知的各种基本数据类型、对象引用-即堆内存的地址,可以简单的理解为对象的名称),Java栈是与线程对应起来的,每当创建一个线程,JVM就会为这个线程创建一个对应的Java栈。
- 堆内存:保存的是真正的数据。即对象的属性信息
具体分析如下:
注意:
对象(引用数据类型)必须在实例化后调用,否则会产生NullPointerException(运行时错误),编译时不会出错"NullPointerException"在各位今后的开发生涯中会一直存在,只有引用类型(数组、类、接口)才会产生此类异常。以后出现此类异常,就根据出错位置查看引用类型变量是否初始化
- 引用传递分析
引用传递的本质:一块堆内存可以被多个栈内存所指向
垃圾空间:没有任何栈内存指向的堆内存空间
建议:所有的垃圾空间会不定期GC,GC会影响性能,所以开发之中一定要控制好对象的产生数量(无用的对象尽量少产生)
四、private实现封装和构造方法
private 封装
封装是面向对象里最复杂的概念,使用private关键字实现的封装处理只是封装的第一步,若想完全掌握封装,需要后续将继承和多态学完。
无封装范例:
在没有封装属性的情况下,外部通过属性可以对对象进行任意操作,为了解决这个问题,可以使用private对对象进行封装(对象不能直接操作属性)。
使用private封装后要访问私有属性,需要使用setter和getter方法:
- setter方法:主要用于进行属性内容的设置与修改
- getter方法:主要用于属性内容的取得
类的设计原则:没有特殊说明,在编写类的时候,所有属性(成员变量)必须使用private封装。
构造方法:
所谓的构造方法就是使用关键字new实例化新对象时来进行调用的操作方法。
对于构造方法的定义,也需要遵循以下原则:
- 方法名称必须与类名称相同
- 构造方法没有返回值类型声明
- 每一个类中一定至少存在一个构造方法(没有明确定义,则系统自动生成一个无参构造)
注意:没有返回值类型声明,不是没有返回值(不能加void)
编译器是根据程序结构来区分普通方法与构造方法的,所以在构造方法前没有返回值类型声明
若类中定义了构造方法,则默认的无参构造将不再生成
构造方法的重载:
构造方法的参数个数和类型不同
建议:若干构造方法,请按照参数个数升序或降序