首页 > 代码库 > 黑马程序员-Java基础-面向对象-类和对象、封装、构造函数、this、static、饿汉式&懒汉式

黑马程序员-Java基础-面向对象-类和对象、封装、构造函数、this、static、饿汉式&懒汉式

第一讲  面向对象概念

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):函数的参数,参数类型是一个数组,该数组中的元素是字符串,字符串类型的数组。

特点:主函数是固定格式的,只有这样才能被jvm识别;同时主函数也有一般函数的特性,可以被重载

 

 

5、  静态的优劣

1) 优点:可以对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份。静态成员可以被类名直接调用,而非静态成员必须通过对象来调用。

2) 劣势:生命周期过长。访问出现局限性,静态方法只能访问静态成员

6、  什么时候使用静态

1)  什么时候定义静态变量

当对象中出现共享数据时,该数据可以被静态所修饰;对象的特有数据须定义为非静态的,存放于堆内存对应的对象空间中。

2)  什么时候定义静态函数

当功能内部没有访问到非静态数据(对象的特有数据)时,可以将此函数定义为静态的。

7、  静态代码块和非静态代码块

1)      静态代码块:随着类的加载而执行,只执行一次,并优先于主函数执行,用于给类进行初始化。

2)      构造代码块:随着实例对象的创建而执行,每创建一个对象就会被执行一次,属于实例对象。

执行顺序:静态代码块——>主函数——>构造代码块

         书写格式:

         Static

{

         静态代码块中的执行语句。

}

 

第七讲  单例设计模式

1、  概念

设计模式:解决某一类问题最行之有效的方法,java中有23种设计模式。

单例设计模式:解决一个类在内存中只存在一个对象的问题

2、  解决对象唯一性的方法

1)        禁止其他程序建立该类对象:将构造函数私有化;

2)        为了让其他程序可以访问到该类对象,需要在本类中自定义一个对象;

3)        为了能让其他程序访问到该类中对象,需要对外提供一些访问方式:提供一个公开的方法来获取该类对象

3、  单例设计模式表现形式

1)        饿汉式:类一被加载,就会在堆内存中创建该类对象。

2)         懒汉式:只有方法被调用时,才会创建对象。

懒汉式的缺点:当创建对象的函数同时被多个程序调用时,懒汉式可能会出现错误。

解决方法:可以通过锁定(synchronized)来解决这个问题,而且通过双重判断对象是否为空,来稍微提高运行效率。

 

黑马程序员-Java基础-面向对象-类和对象、封装、构造函数、this、static、饿汉式&懒汉式