黑马程序员——Java 基础 面向对象之封装 (复习)

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

一、面向对象的概述

1.理解面向对象

面向对象是Java语言的核心。面向对象是相对面向过程而言的。

面向过程:强调的功能行为。

面向对象:将功能封装进对象,强调具备了功能的对象。

    这是一种思想上的转变,以大象放进冰箱为例(大象放进冰箱需要3步:打开冰箱,将大象存储到冰箱,关闭冰箱)。

如果是面向过程的思想,那么可以理解为三个行为:打开,存储,关闭。

我们知道打开,存储和关闭都是属于冰箱本身的功能,那么用面向对象的思想就是:冰箱.打开,冰箱.存储,冰箱.关闭。

我们的思想从 强调功能 转变成 强调对象。

 2.面向对象特点

 2.1.将复杂的事情简单化。

 2.2.面向对象将以前过程中的执行者,变成了指挥者。

 2.3.面向对象符合现在人们的思考习惯。思考问题从自身和实际出发。

通过名称提炼法将一列功能或属性封装进对象。

名称提炼法:人开门

人{

开门(门){

     门.打开();

}

}

门{

开(){操作门轴}

}

在开发中,先考虑对象,有对象直接用,没对象就造对象再用。找对象、建对象、使用对象、并维护对象之间的关系。


二、类和对象的关系

类:就是对现实生活中的事物的描述。

对象:就是这类事物实实在在的个体。

例如:现实生活中的对象: 张三,李四

    对这两个对象进行描述:提取他们的共性内容,对具体实例的抽象,比如共性有:姓名、年龄

那么在Java中,描述是用类来体现的,用class来定义。具体的对象就是对于java 在堆内存中用new建立的实体。

其实,定义类就是在描述事物,就是在定义属性和行为。属性对应是类中的变量,行为对应类中的函数。

类就像一张图纸,对象就像是依据图纸造出来的个体。


三、匿名对象

1.什么时候使用匿名对象?

方式一:当对对象的方法之调用一次时,可以使用匿名对象完成。

方式二:可以将匿名对象作为实际参数来传递。

四、面向对象的特征

面向对象的三大特征:封装、继承、多态

1.封装: 是指隐藏对象的属性和实现细节,仅对外提供公共的访问方式。

封装的好处:将变化隔离,便于使用,提高重用性,提高安全性。

封装的原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。

如何进行封装?

封装的方式之一:private 私有的访问权限最低,仅在本类中有效。私有仅仅是封装的一种表现形式而已。

      将属性私有后,其他类即使建立了对象也不能直接访问,只能通过本类提供的公共访问方式对其进行访问。

      这样的方法一般有两个规范写法:  例如变量 XXX ,那么设置变量 setXXX( );  获取变量 getXXX( );

2.构造函数

构造函数的特点:

函数名与类名相同。

不需要定义返回值类型(主要:不同于void ,void代表的是一种返回值类型----无返回值)

不可以写return语句。

构造函数的作用:给对象进行初始化。

注意:所有对象创建时,都需要对其进行初始化。

对象一建立,就会调用与之对应的构造函数。当一个类中没有定义构造函数时,系统会默认给其加入一个无参构造函数。

当类中自己定义了构造函数,那么系统就不会给类加构造函数了。

构造函数可以定义多个(函数的重载特性),分别对应不同的初始化方式。

构造函数与一般函数的区别:

构造函数和一般函数写法上有不同。

在运行上也有不同。构造函数在对象一建立就调用,给对象进行初始化,只运行一次;一般函数需要对象调用时,才会执行。

什么时候定义构造函数?

当分析事物是,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。

3.构造代码块

什么是构造代码块?

例:  {

不同对象共性的初始化内容;

          }

特点:无函数名,只有一对{ }

构造代码块和构造函数的区别:

构造代码块用于给所有对象进行统一初始化,构造函数是给对应的对象进行初始化。而且构造代码块优先于构造函数运行。

构造代码块的作用:

构造代码块用于给对象中共性的属性进行初始化。

4. this关键字

this 就代表它所在函数所属对象的引用。 也就是说 哪个对象调用了this所在的函数,this就代表哪个对象,就是哪个对象的引用。

this关键字的应用:

当定义类中功能时,该函数内部要调用该函数的对象时,这是用this来代表这个对象,但凡本类功能内部使用到本类对象都用this表示。

this语句:

格式:this(实际参数);

this语句用于构造函数之间的相互调用,只能定义在构造函数的第一行。

5.static 关键字

static : 是一个修饰符,用于修饰成员。成员包括 成员变量和成员函数。

static 的特点:

1.随着类的加载而加载。

2.被所有对象共享。

3.优先于对象存在。

注意: 被static修饰的成员不存放在堆内存中,是被单独提取出来了,放在了方法区中。

当成员被static修饰后,就多了一个调用方式,除了能够被对象调用外,还能被类名调用。格式: 类名.静态成员;

什么是实例变量?什么是类变量?

例:String name = "zhangsan";  // 定义了成员变量, 实例变量

static String name = "lisi";  //  定义了静态成员变量,类变量

实例变量和类变量的区别:

1.存放的位置:类变量随着类的加载而加载而存放在方法区中。实例变量随着对象的建立而存放在堆内存中。

2.生命周期:类变量随着类的消失而消失,生命周期最长。实例变流量随着对象的消失而消失。

静态的使用注意:

1.静态方法只能访问静态成员。 非静态既可以访问非静态成员也可以访问非静态成员。

2.静态方法中不可以定义this、super关键字,因为静态优先与对象而存在,所有不能出现this

3.主函数是静态的。

那么什么是主函数呢?

主函数:是一个特殊的函数,它作为程序的入口,能被jvm识别。

主函数固定格式: public static void mian(String[ ]  args){ }  不能改变(除了args这个数组名,但一般不去改变该名称)。

public :代表主函数具有最大的访问权限。

static :代表主函数是静态的,随着类的加载就已经存在了。

void :代表了主函数没有具体的返回值。

main :是一个特殊的单词,它不是关键字,但能被jvm 识别。

(String [ ] args) :主函数的参数是一个字符串数组。

静态使用的利与弊:

利:对象的共享数据进行单独空间存储,节省空间,并且可以直接被类名调用。

弊:生命周期过长,访问出现局限性。

静态代码块:

格式:static {

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

}

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

那么创建一个对象时都在内存中做了什么事情?

例:Person p = new Person();  //这句话到底做了哪些事情?

1先将硬盘上指定位置的Person.class文件加载进内存。

2执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。

3在堆内存中开辟一个实体空间,分配了一个内存首地址值。new

4在该实体空间中进行属性的空间分配,并进行了默认初始化。

5对空间中的属性进行显示初始化。

6进行实体的构造代码块初始化。

7调用该实体对应的构造函数,进行构造函数初始化。()

8将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)


五、单例设计模式

1.什么是设计模式?

设计模式就是解决某一类问题最行之有效的方法。设计模式是一种思想

java中一共有23中设计模式。

2.单利设计模式

解决的问题:保证一个类在内存中的对象唯一性。

比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,

就需要该配置文件对象在内存中是唯一的。

如何保证对象唯一性呢?

思想:

1,不让其他程序创建该类对象。

2,在本类中创建一个本类对象。

3,对外提供方法,让其他程序获取这个对象。

步骤:

1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;

2,就在类中创建一个本类的对象;

3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)

代码体现:

1,私有化构造函数;

2,创建私有并静态的本类对象;

3,定义公有并静态的方法,返回该对象。

设计模式的两种体现方式:

饿汉式 和 懒汉式


饿汉式代码体现

//饿汉式
class Single{
    private Single(){} //私有化构造函数。
private static Single s = newSingle(); //创建私有并静态的本类对象。
    public static SinglegetInstance(){ //定义公有并静态的方法,返回该对象。
        return s;
    }
}

懒汉式代码体现

//懒汉式:延迟加载方式。
class Single2{
    private Single2(){}
private static Single2 s =null;
    public static Single2getInstance(){
        if(s==null)
            s =new Single2();
        return s;
	}
}
	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值