第一讲 面向对象概念
1、 定义
相对于与面向过程而言的,将功能封装进对象,我们只关心具备了该功能的对象,而不用关注对象的具体细节。
面向对象的特点:使复杂问题简单化。我们只关心什么对象能处理什么事情,而不用关心具体的实现细节。
2、 面向对象特征
封装、继承、多态。
第二讲 类和对象的关系
1、 概述
类就是:对现实生活中事物的描述,可以是实体的事物也可以是一件事等;
对象是:是某类事物的实例,实实在在存在的个体;
映射到java中,描述就是class定义的类。
具体对象就是对应java在堆内存中用new创建的实体。
2、 举例描述类和对象关系
如图中表示:图纸就是用于描述汽车的,而实际的汽车就是一个汽车实体。
图纸描述的内容有:汽车的属性(颜色、长度、宽度等),还描述了汽车的行为(开灯、启动等)。
第三讲 封装
1、 定义
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式,可以利用public和private来实现封装。
好处:将变化隔离,便于使用,提高重用性,提高安全性
封装原则:将不需要对外提供的内容都隐藏起来;把属性都隐藏,提供公共方法对其访问。
2、 封装实例
代码中的age和name已经被封装在Person类中。
对外提供访问私有成员方式的原因是:可以在访问方式中加入逻辑判断等语句,对访问的数据进行操作,提高代码健壮性。
第四讲 构造函数&构造代码块
1、 特点
1) 函数名是固定的,与类型相同;
2) 不用定义返回值类型,与void不同;
3) 不可以写return语句;
2、 构造函数应用
1) 对象一建立就会调用与之对应的构造函数;可以用于给对象进行初始化。
2) 当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数,方便该类进行初始化。
3) 当在类中自定义了构造函数后,默认的构造函数就没有了。
应用实例:可以定义多个构造函数,因为不同的实例对象初始化方式可能不同。
3、 构造函数与一般函数的区别
1) 构造函数是在对象一建立就执行,给对象初始化;
2) 一般函数是被对象调用时才执行,给对象添加对象具备的功能;
3) 一个对象建立,构造函数只运行一次,而一般方法可以被对对象多次调用;
4、 判断何时定义构造函数
当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中
5、 构造代码块
作用:给对象进行初始化。对象已建立就运行,而且优先于构造函数执行。
和构造函数的区别:构造代码块是给所有对象进行统一初始化,而构造函数是给对应的对象初始化。
第五讲 this关键字
1、 This关键字
This代表的是:本类的对象,代表它所在函数所属对象的引用,即,那个对象在调用this所在的函数,this就代表哪个对象。
应用:
1) 用于区分局部变量和成员变量同名情况,如下:
2) 当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
2、 This在构造函数互调中的应用
用于构造函数之间进行互相调用。
注意:语句只能定义在构造函数的第一行,因为初始化要先与执行(当调用一个构造函数时,函数体内的this()就相当于初始化)
第六讲 static关键字
1、 static作用
用于修饰成员(成员变量、成员函数)。
被static修饰的内容将被对象所共享,内存中将该内容和对象分开存储。
2、 特点
1) 随着类的加载而加载,随着类的消失而消失,生命周期最长;
2) 优先于对象而存在,静态是先存在,对象是后存在;
3) 被所有对象所共享;
4) 可以直接被类类型所调用
3、 实例变量和类变量(被static修饰的成员变量)的区别
1) 内存中的位置
l 类变量随着类的加载而存在于方法区(共享区/数据区)中;
l 实例变量随着对象的建立而存在于堆内存中;
2) 生命周期
l 类变量生命周期最长,随着类的加载而加载,随着类的消失而消失;
l 实例变量生命周期随着对象的加载而加载,随着对象的消失而消失;
4、 静态使用注意事项
1) 静态方法只能访问静态成员
因为静态方法随着类的加载而加载,但非静态成员依赖于实例对象的创建而产生,静态方法和非静态成员的生命周期不同,在调用时会出现错误,因此静态方法不能调用非静态成员。但非静态方法既可以访问静态也可以访问非静态
2) 静态方法中不可以定义this,super关键字
因为静态优先于对象存在,而this、super代表的是实例对象。
3) 主函数是静态的
l 主函数:一个特殊的函数,作为程序的入口,可以被jvm调用。
l 主函数的定义:
l Public:代表着该函数访问权限是最大的;
l Static:代表主函数随着类的加载就已经存在了。
l Void:主函数没有具体的返回值。
l Main:不是关键字,但是是一个特殊的单词,可以被jvm识别。
l (string[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组。
l 特点:主函数是固定格式的,只有这样才能被jvm识别;同时主函数也有一般函数的特性,可以被重载
5、 静态的优劣
1) 优点:可以对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份。静态成员可以被类名直接调用,而非静态成员必须通过对象来调用。
2) 劣势:生命周期过长。访问出现局限性,静态方法只能访问静态成员
6、 什么时候使用静态
1) 什么时候定义静态变量
当对象中出现共享数据时,该数据可以被静态所修饰;对象的特有数据须定义为非静态的,存放于堆内存对应的对象空间中。
2) 什么时候定义静态函数
当功能内部没有访问到非静态数据(对象的特有数据)时,可以将此函数定义为静态的。
7、 静态代码块和非静态代码块
1) 静态代码块:随着类的加载而执行,只执行一次,并优先于主函数执行,用于给类进行初始化。
2) 构造代码块:随着实例对象的创建而执行,每创建一个对象就会被执行一次,属于实例对象。
执行顺序:静态代码块——>主函数——>构造代码块
书写格式:
Static
{
静态代码块中的执行语句。
}
第七讲 单例设计模式
1、 概念
设计模式:解决某一类问题最行之有效的方法,java中有23种设计模式。
单例设计模式:解决一个类在内存中只存在一个对象的问题
2、 解决对象唯一性的方法
1) 禁止其他程序建立该类对象:将构造函数私有化;
2) 为了让其他程序可以访问到该类对象,需要在本类中自定义一个对象;
3) 为了能让其他程序访问到该类中对象,需要对外提供一些访问方式:提供一个公开的方法来获取该类对象
3、 单例设计模式表现形式
1) 饿汉式:类一被加载,就会在堆内存中创建该类对象。
2) 懒汉式:只有方法被调用时,才会创建对象。
懒汉式的缺点:当创建对象的函数同时被多个程序调用时,懒汉式可能会出现错误。
解决方法:可以通过锁定(synchronized)来解决这个问题,而且通过双重判断对象是否为空,来稍微提高运行效率。