第二章:封装(上)

封装的意思是说对象数据和操作该数据的指令都是对象自身的一部分,封装能够实现尽可能对外部世界隐藏数据

 

2 - 1:什么是Java中的封装

我们在之前的课程里面对于面向对象这个概念有了基本的认识,接下来,就来学习面向对象的三大特性:封装,继承,多态。

封装

1、概念:

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。也就是说如果标准的写一个面向对象的程序,是不能操作类的对象属性信息的。只能通过方法间接地操作,这一点大家要注意。

2、好处:

a、只能通过规定的方法访问数据

b、隐藏类的实例细节,方便修改和实现。因为我们在使用一个类的时候其实只是关注这个类如何去用,能解决什么问题,并不关注类如何实现。

3、封装的实现步骤:

我们拿前面选电话的例子来说一下:

我们发现,以前我们写的类的属性的时候,前面并没有加任何修饰符,所以说在InitialTelephone.java中,是直接可以访问我们的属性值的:

我们直接在第10与11行中间加phone2.cpu = 6.0f;

意思就是在主函数里直接就可以改变类里面的值,把cpu的值改掉。那我们说这种方式是不好的,应该用封装的方式将我们的属性信息隐藏起来,给用户一个特定方法让他去访问我们的属性值。

那么我们此时会干三步,第一步,用一个修饰符来修饰我们的属性,那我们这里用的是private:

加好修饰符以后我们再来看一下主函数,这边就有一个叉号了

这样的话,那就封装了我们的类,保证属性使用时候的安全性。

那么我们怎么能够解决它呢,第二步,如果用户依然要使用这几个属性,那么我们是通过set方法和get方法来进行操作的。比如我要在类里面写一个get方法,我们就在类里面写一个方法叫getScreen(),我们的方法名就是get加属性名来构成,返回值与属性的返回值是一样的,这个方法的目的只有一个,就是得到这个属性的值,在里面写return screen;就行了,获得cpu、mem的get方法也是一样。写set方法时也是,这个不需要返回值,设置为空,小括号里要得到跟属性相同的形参用来给属性赋值。

可以看到第9~31行都是get和set方法。这样,我们的main函数就不能通过点的方式来给属性换值了,可以通过set方法,给属性赋值了:

说到这里呢,有人会有疑问,说给对象赋值的时候,一定要用我们的get和set方法吗?其实不一定,我们的set方法,和get方法只是访问属性的一种方式,其实我们用普通的方法也可以修改属性的值,但是我们这里要注意,我们在编程规范上来讲,通常都会用set和get方法,用普通方法赋值,是不标准的。

 

2 - 2:使用包管理Java中的类

我们现在已经知道了可以把信息写在一个类里面,然后通过特定的方法访问我们属性的信息。那我们再封装的时候,经常会碰到这样一个难题,就是我封装的一个信息类的名字可能时冲突的,那我们怎么能解决这个问题呢?

引入一个包的概念,就可以解决这个问题。包是什么?和我们文件管理相类似,我们在生活当中管理不同的文件是不是可以创建不同的文件夹呀,包和文件夹是相类似的,它的主要目的就是用来管理我们Java的文件,我可以加上不同的包来区分我们相同文件名的类。

1、包的作用:

管理Java文件,解决同名冲突

2、定义包:package 包名

注:必须放在Java源程序第一行,包名间可使用“.”号隔开,eg:com.imooc.MyClass

其实这个“.”就是文件夹的层次

我们可以通过层次关系,来区分相同名称的类。

例如:音乐类——MyClassMusic

我们在音乐里会用到音乐,在电影里,也会用到音乐,那么我们如何来区分这两个类,或者说我们如何在程序里面根据不同的情景来使用我们的类呢↓

-music

    com.imooc.music.MyClassMusic

-movie

    com.imooc.movie.MyClassMusic

3、系统中的包

java.(功能).(类)

如:java.long.(类)包含Java语言基础的类,java.util.(类)包含Java语言中各种工具的类,java.io.(类)包含输入、输出相关功能的类。注意一下,下面会说到,如果有import java.util.*;,这就表示各种工具的类里面的所有类都可以用。

4、包的使用

(1)可以通过import关键字,在某个文件使用其它文件中的类,如:

         import com.imooc.music.MyClass

         如果我们在有Telephone.java的请款下再创建一个Telephone.java的类,是没法创建的。

虽说我创建的名称一样,但我想表示的功能不一样,如何来进行区分呢?那我们就可以通过包的概念来区分。我可以在com.imooc右键,添加一个子包,命名为com.imooc.second,在这个包里,就可以添加一个Telephone.java的类了。

当我们回去运行InitialTelephone.java时,这个java会把当前包(就是com.imooc)里的Telephone.java导进这个java里面,如果想用com.imooc.second的文件,应该在开头写一句import com.imooc.second.Telephone;,别忘了分号!

(2)Java中,包的命名规范是全小写字母拼写 

(3)使用的时候不但可以加载某个包下的所有文件(eg:com.imooc.*),也可以加载具体某个子包下的所有文件(eg:com.imooc.music.*)

 

2 - 3:Java中的访问修饰符

在前面我们使用封装的时候我们发现,在修饰属性方法的时候,我们在前面都加了一个private或public,我们之前说过,这个就是访问修饰符。访问修饰符有什么作用呢,我们现在就一起来看一下。

首先,访问修饰符——可以修饰属性和方法的访问范围。那么我们在使用访问修饰符的时候呢,主要有以下几种方式:

第一个就是private,它可以修饰我们的属性和方法,只能在本类中访问和使用。

如果我们在修饰属性和方法的时候,前面什么修饰符也不加,那么它默认情况下,是只能在我们当前类和同一包中使用。

如果我们用的是protected,那么它对本类、同包、子类里面可以使用。其实子类就是类和类的一种关系,在后面知识点中会讲解。

最后一个就是public,如果我们修饰属性和方法前用的是public,那么我们就可以在任意位置进行访问。

那如果我们来打一个比喻,就说我们人有一个属性:钱包,如果我们用private来修饰这个钱包,那么这个钱包里的钱只能我们自己使用;如果我们默认,没有说这个钱包到底谁可以用,那这个钱包我自己肯定可以用,同包指的是可以在一个路径下那我们这里就可以把它理解成在一个房间内,房间内的人都可以用;如果我是用protected修饰的呢,这个钱包我、屋里的人能用,和我有特殊关系的人,比如我的儿子也可以用;如果用public来修饰,那就是任何人都可以用。

好,那么我们通过一段代码来看一下。

Telephone这个类我们在进行封装的时候我们说过,通常把我们的属性用private修饰,方法用public修饰,因为我们在任何位置都可以访问我们set和get方法,那么,我就用的是public。

由于我们属性是private,只能在类内部使用,例如说构造方法,那我们现在就来测试一下,private修饰了我们的属性,在我们类的外面时否还能访问我们这个属性呢?

看到这个类中screen是private的,在main函数中输入phone2.screen = 6.0f;,这个时候可以看到编辑器前面有个叉,证明是不允许的。

那么我们刚刚说过,我可以改变属性的修饰符来改变它的访问范围。例如说,吧上面的private改成public,这时候再回到main函数里,刚刚那个叉号就消失了。因为现在属性修饰符是public,扩大了访问范围。但是大家要注意,我们的属性通常都设为private。

同理,方法也是一样的,如果把方法的修饰符改成private,那么这个方法也只能在类的内部使用。以此类推,大家自己可以去尝试一下,修改我们属性的访问范围,要注意,它有这些特点。

那最后呢,我们通过练习加深这些知识点。

1、对成员访问控制最强的是:

A、public

B、缺省

C、private

D、protected

 

2、属于Java的访问控制符的是:

A、public

B、protected

C、private

D、static

 

1、C

2、A、B、C

 

2 - 4:Java中的this关键字

我们在书写Java的代码当中,经常会看到this这个关键字,this这个关键字是用来干什么的呢?

1、this关键字代表当前对象

     this.属性:操作当前属性

     this.方法:调用当前对象的方法

2、封装对象属性的时候,经常会用this关键字。我们通过Eclipse写一段代码来感受下一下。

我们可以看到,Telephone类中有3个属性,都修饰成private,我们之前说过,我们如果想访问一个private的属性,我们通常会使用一个set和get方法。

这里我们还要再讲一下,Eclipse的功能很强大,已经提供了自动帮我们生成set和get方法的能力那怎么让Eclipse自动生成呢,我们选择菜单栏里面的Source,里面有个Generate Getters and Setters...选项,单击,它就会自动检查到我们当前类里面有什么属性,那我就可以在需要生成set和get的属性前面打上对勾,点Generate,就会自动生成set和get方法了。

用这个方式创建好后,我们会发现,我们的属性名经常会与我们的参数(形参)名相同,所以说,我们为了区别属性和参数的概念,我们会在属性前面加一个this关键字, 此时,就代表我将一个参数的值赋给了当前对象的属性。思考一下,如果把srtScreen()方法里的this去掉,结果会如何呢?

用this也可以用在方法上。比如,我写一个sendMessage方法,里面让方法输出一句话:sendMessage,如果我希望在这个set方法里调用某个方法,this关键字后面加个点,sendMessage();,就是调用了这个类里面的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值