黑马程序员__面向对象之封装

本文介绍了面向对象编程中的封装概念,包括其定义、好处、原则及实现方式。详细讲解了如何通过private关键字保护类属性,并提供了构造函数、this关键字、static关键字等高级主题的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


黑马程序员——面向对象之封装

-------android培训java培训、期待与您交流! ----------

1.      封装是面向对象的三大特征之一。指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部的信息,而是通过该类所提供的方法来实习对内部信息的操作和访问。简而言之,封装就是隐藏对象的属性和实现细节,仅对外提供公共的访问方式。

2.      封装的好处:

(1)      将变化隔离

(2)      提高重用性

(3)      提高安全性

(4)      便于使用

3.      封装的原则:

将对象的属性和实现细节都隐藏起来,不允许外部直接访问;将方法暴露出来,让方法来控制对这些属性进行安全的访问和操作。

4.    封装的一种表现形式:private

private:表示私有的权限修饰符,用于修饰类中的成员包括成员变量和成员函数。私有只在本类中有效。

注意:将属性私有化以后,类以外即使建立了对象也不能直接访问,但可以通过对外提供的公共的访问方式访问该属性。

属性的封装:

(1)      把属性定义为私有的(private),只能在本类中访问。

(2)      为属性提供公共的(publicgetter/setter方法。

 

class Person

{ 

       //将属性进行封装

       private String name;

       private int age;

       private String sex;

       //对外提供公共的访问方式

       public void setName(String name)

       {

              this.name=name;

       }

       public String getName()

       {

              return name;

       }

       public void setAge(int age)

       {

              this.age=age;

       }

       public int getAge()

       {

              return age;

       }

       public void setSex(String sex)

       {

              this.sex=sex;

       }

       public String getSex()

       {

              return sex;

       }

}

class  PersonDemo

{

       public static void main(String[] args) 

       {

              Person p=new Person();

              p.setName("Apple");

              p.setAge(18);

              p.setSex("女");

              System.out.println("name:"+p.getName());

              System.out.println("age:"+p.getAge());

              System.out.println("sex:"+p.getSex());

       }

}


5.      构造函数

(1)      定义:是指函数名与类名相同,且无返回值类型的声明。

(2)      特点:

函数名与类名相同;

不用定义返回值类型

不可以写return语句

对象一建立就会调用与之对应的构造函数

(3)      作用:给对象进行初始化

(4)      构造函数中定义的内容

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

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

写法上不同;

运行上不同:构造函数是在对象一建立就运行而一般函数是在对象调用时执行

一个对象建立,构造函数只运行一次;一般函数可被对象调用多次

6)构造函数与构造代码块的区别:

构造函数用于给对应的对象初始化;而构造代码块用于给所用的对象进行统一初始化,构造代码块中用于定义不同对象共性的初始化内容。

<pre class="java" name="code">class Person

{ 

    private String name;

    private int age;

    //构造代码块

    {

           System.out.println("这是构造块!");

    }

    //构造方法

    Person()

    {

           System.out.println("这是无参构造方法");

    }

    Person(String name,int age)

    {

           System.out.println("这是带参构造方法");  

    }

 

}

class  PersonDemo

{

    public static void main(String[] args) 

    {

           Person p1=new Person();

           System.out.println("-----------------------2");

           Person p2=newPerson("Joe",18);

    }

}

 

 

6.      this关键字

含义:代表本类对象且代表它所在函数所属对象的引用。需要注意的是,类中的成员被使用都是通过对象,而本类对象就是this

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

           例如:给人定义一个用于比较年龄是否相同的功能

         

  public boolean compare(Person p)

           {

               //this表示调用此方法的当前本类对象

               return this.age==p.age;  

           }


this在构造函数间调用

class Person

{ 

           private String name;

           private int age;

           Person(){}

           Person(String name)

           {

               //this调用无参构造函数

               this();

               this.name=name;

           }

           Person(String name,int age)

           {

               //调用带一个参数的构造函数

               this(name);

               this.age=age;

           }

           

}


 

 

注意:this用于构造函数间的调用,一般函数是不能调用的;并且this语句只能定义在构造函数的第一行,因为初始化操作要先执行。

7.      static关键字

用法:表示静态的,只能用于修饰成员变量和成员函数的修饰符。当成员被静态所修饰

      就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用即

类名.静态成员。

       特点:

(1)      随着类的加载而加载,随着类的消失而消失

(2)      被所以对象所共享

(3)      优先于对象存在

(4)      可以直接被类名所调用

使用注意事项:

(1)      静态方法只能访问静态成员;非静态方法既可以访问静态也可以访问非静态成员

(2)      静态方法中不可以定义this,super关键字。因为静态是优先于对象存在的。

静态的好处:

       对对象的共享数据进行单独空间的存储,节省空间;

       可以用类名来直接调用,无需创建对象。

静态的弊端:

       生命周期过长;

       访问出现局限性。

静态的使用情况:

定义静态变量:当出现被多个对象所共享的数据时,该数据就可以被静态所修饰;而对象中的特有数据要定义成非静态的。

定义静态函数:当功能内部没有访问到非静态数据时,该功能可以被定义为静态的。

       静态代码块:

              格式:static{

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

}

              特点:随着类的加载而执行,只执行一次。

8.      单例设计模式

含义:保证一个类在内存中只存在一个对象。

设计步骤:

(1)      将构造方法私有化

(2)      在类中创建一个本类对象

(3)      提供一个方法可以获取到该对象

饿汉式:

class Single1

{

       //构造函数私有化

       private Single1(){}

       //创建本类对象

       private static Single1 s=new Single1();

       //提供公共的方法获取对象

       public static Single1 getInstance()

       {

              return s;

       }

}


 

 

懒汉式:

class Single2

{

       //构造方法私有化

       private Single2(){}

       //声明一个本类对象

       private static Single2=null;

       //提供公共的方法来获取对象

       public static Single2 getInstance()

       {

              //判断对象是否为空,如果为空则实例化对象

              if(s==null)

                     s=new Single2();

              return s;

       }

}


 

 

懒汉式存在线程安全的问题,将其进行优化之后:

class Single2

{

       private Single2(){}

       private static Single2=null;

       public static Single2 getInstance()

       {

              //双重判断

              if(s==null)

              {

                     synchronized(Single2.class)

                     {

                            if(s==null)

                                   s=newSingle2();

                     }

              }

              return s;

       }

}

 

 

 

注意:在实际开发中建议使用恶汉式。

总结:一个类常常就是一个小的模块,我们应该只让这个模块公开必须让外界知道的内容,而隐藏其他一切内容。进行程序设计时,应尽量避免一个模块直接操作和访问另一个模块的数据,应当追求低耦合、高内聚。

 

-------android培训java培训、期待与您交流! ----------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值