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

时间:2023-02-13 23:49:48
------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
 



一、面向对象概述

1、概念

面向对象(Object-Oriented,简称OO)是一种常见的程序结构设计方法。是一种抽象的概念,是相对于面向对象而言的。面向对象与面向过程都是解决问题的思想:

面向过程:强调的是功能行为,一种过程,先干啥,再干啥;

面向对象:将功能封装到对象里,强调的是具备某功能的对象;

面向对象思想的基础是将相关的数据和方法放在一起,组合成一种新的复合数据类型,然后使用新创建的复合数据类型作为项目的基础。

按照面向对象的思想,可以把任何的东西看做对象!

过程和对象在我们的程序中的体现:过程其实就是函数;对象是将函数等一些内容进行了封装。

 

2、面向对象的三个特征:

封装(Encapsulation);

继承(Inheritance);

多态(Polymorphism)。

 

3、面向对象的特点:

1)将复杂的事情简单化。

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

3)面向对象这种思想是符合现在人们思考习惯的一种思想。

 

4、类

类(class)是Java 语言的最小编程单位,也是设计和实现Java 程序的基础。

1)类的概念

类是一组事物共有特征和功能的描述。类是对于一组事物的总体描述,是按照面向对象技术进行设计时最小的单位,也是组成项目的最基本的模块。类的概念是抽象的,类似于建筑设计中的图纸,是对于现实需要代表的具体内容的抽象。类只包含框架结构,而不包含具体的数据。所以类代表的是总体,而不代表某个特定的个体。

2)类的定义:

[修饰符]class  类名{

        1~n个构造方法;

        0~n个字段;

        0~n个方法

}

定义类,其实就是定义类里面的对象

对象包含:状态(属性);功能、行为(方法);

 

5、类的成员

       1)成员变量

       a)定义在类中,在整个类中都可以被访问。

b) 随着对象的建立而建立,存在于对象所在的堆内存中。

c) 成员变量有默认初始化值。

注:成员变量与局部变量的区别

局部变量定义在方法或局部代码快内,存在于栈内存中,制作用于方法内且没有初始化值。

       2)成员方法

成员方法描述对象所具有的功能或操作,反映对象的行为,是具有某种相对独立功能的程序模块。它与过去所说的子程序、函数等概念相当。一个类或对象可以有多个成员方法,对象通过执行它的成员方法对传来的消息作出响应,完成特定的功能。成员方法一旦定义,便可在不同的程序段中多次调用,故可增强程序结构的清晰度,提高编程效率。

3) 构造方法

用来构造类的实例(每一个类都默认有一个无参的构造方法,得使用new调用)

字段:类或对象所包含的数据,对类状态的一种描述;

方法:类或对象的特征或行为

作用:给类中的字段进行初始化,可以用来创建对象。

特点:

a)方法名与类名相同

b)不用定义返回值类型

c)不需要写return语句

 

4)构造代码块

作用:给对象进行初始化。对象一建立就运行,而且优先于构造函数运行。

和构造函数的区别:

a)构造代码块是给所以对象进行初始化。

b) 而构造函数是给对应的对象初始化。

c) 构造代码块中定义的是不同对象共性的初始化内容。

 

5)静态代码块

格式:

             static{

                           静态代码块中的语句。

             }

特点:随着类的加载而执行,执行一次。并优先于主函数。用于给类进行初始化。

 

         6、static关键字

static是一个修饰符,用于修饰成员(成员变量和成员函数)。当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。

格式:类名.静态成员。

1)static特点:

a)随着类的加载而加载。

也就是说:静态会随着类的消失而消失,说明它的生命周期最长。

b)优先于对象存在。明确一点:静态是先存在。对象是后存在。

c)被所有对象所共享。

d)可以直接被类名所调用。

2)静态有利有弊:

利处:对对象共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。可以直接被类名调用。

弊端:生命周期过长。访问出现局限性。(静态虽好,只能访问静态)。

3)静态使用注意事项:

a)静态方法只能访问静态成员。

非静态方法既可以访问静态也可以访问非静态。

b)静态方法中不可以定义this,super关键字。

因为静态优先于对象存在。所以静态方法中不可以出现this。

c)主函数是静态的。

 

       7、this关键字

 this代表它所在函数所属对象的引用。

       简单说:哪个对象在调用this所在的函数,this就代表哪个对象。

1)this的应用:

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

       但凡本类功能内部使用到了本类对象,都用this表示。

2)this语句:

       用于构造函数之间进行互相调用。如:this(name);

        thi语句只能定义在构造函数的第一行。因为初始化要先执行。

3)对this的概括总结:

        this的两种用法:

a)用于区分同名变量的情况,说的成员和局部同名的时候;

b)用于构造函数间调用。

注:一般函数不能直接调用构造函数,因为this语句不能用在一般函数中,只能用在构造函数间。

 

二、单例设计模式

设计模式的概念:解决某一问题最行之有效的方法。java*有23种设计模式。

接下来我们讲解其中的一种:单例设计模式。

单例设计模式的作用:使一个类在内存中只存在一个对象。

用代码实现单例设计模式需要做三部:

a)将构造函数初始化。

              例:private Single(){}

b)在类中创建一个本类对象。

             例:private staticSingle s= newSingle();

c)提供一个访问方法可以获取到该对象。

             例:public staticSingle getInstance()

                    {

                           returns;

                     }

单例设计模式只是为了保证内存中的对象唯一,其他在类中该怎么描述吗,还是怎么描述。

单例设计模式有两种写法:

1)饿汉式:也就是刚三部中的示例语句。它的特点是先初始化对象。如:Single类一进内存,就已经创建好了对象。在实际开发中,出于安全考虑,建议使用饿汉式。

完整代码如下:

class Single  

{  

    private static Single s=new Single();  

     private Single(){}  

     public static Single getInstance()  

     {  

          return s;  

     }  

}  

2)懒汉式:它的特点对象是方法被调用时,才初始化,这也叫对象的延时加载。如:在以下完整代码中,Single类进内存,对象还没有存在,只有调用了getInstance()方法时,才创建对象。

完整代码如下:

 class Single  

{  

     private static Single s=null;  

     private Single(){}  

     public static Single getInstance()  

     {  

          if(s==null)   

               s=new Single();  

          return s;  

     }  

}  

 

三、面向对象——封装

1、封装的概念

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。封装即对要操作的实体进行隐藏,使原始功能对外不可见,通过其他对外提供的方法间接的操作真实的实体。

2、封装的实现原理

Java语言中为实现对实体的封装,可以对类内的成员进行私有化(private)声明,使其属性和功能对外不可见,然后为其提供对应的访问器,对原始被封装的实体进行操作。访问器有两种:

    获取访问器:getXxx();

    修改访问器: setXxx();

3、封装的标准实现

class Person{  

        private String name;  

        public void setName(String name){  

           this.name = name;  

        }  

        public String getName(){  

            return this.name;  

        }  

}  

 

封装通常是对程序变量进行,成员方法也可使用,但是通常意义不大。

boolean型数据由于仅存在两种取值,获取值得方法设置规则与其他类型有所不同,使用如下格式进行:

boolean gender;  

public boolean isGender(){  

    return this.gender;  

}  

 

4、封装好处:

1、将变化隔离;

2、便于使用。

3、提高重用性。

4、提高安全性。

5、封装原则:

1、将不需要对外提供的内容都隐藏起来。

2、把属性都隐藏,提供公共方法对其访问。

3、private:关键字

1)用于修饰成员变量和成员方法。
2)被修饰的内容在其他类中是不可以被访问的。

注意:私有仅仅是封装的一种体现而已。