Java面向对象之封装

封装是Java面向对象的另一大特性,它是指将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供得方法来实现对隐藏信息的操作和访问。




为什么要封装?

**1. **只能通过特定的方法来访问数据,让数据更好的被保护,增加了数据的安全性。

**2. **隐藏类的实例细节,方便修改和实现。


怎么实现封装?

**1. **修改属性的可见性:想要把数据隐藏起来,就要限制数据的可见性,所以要先把想隐藏的属性用private修饰,限制其只能被本类成员直接访问。

**2. **提供访问属性的方法:外部程序无法直接访问隐藏的属性,所以要提供一个可以让外部程序访问私有属性的方法。一般通过get和set两个方法分别实现对私有属性的读和写。方法名通常是get或set加上属性名,具体格式为:

  • public type getAttibuteName([参数1,参数2……]),其中type是返回的属性值类型,attributeName是属性名,括号里的参数是可选的。

  • public void setAttibuteName([参数1,参数2……]),其中attributeName是属性名,括号里的参数是可选的。


Java中的访问修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java支持4种不同的访问权限:

  1. 默认的,也称为 default,在同一包内可见,不使用任何修饰符。

  2. 私有的,以 private 修饰符指定,在同一类内可见。

  3. 共有的,以 public 修饰符指定,对所有类可见。

  4. 受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见。

其修饰的属性可见性如下表所示:

访问修饰符 本类 同包 子类 其他
private
default
protected
public

Java中的包

简单地说包就是用来管理类的,就类似文件夹一样。我们整理文件时可以把一些文件放到同一个文件夹里进行管理,同样的,我们可以把一些类文件放到同一个包中进行管理。

1. 包的作用:

  • 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

  • 解决文件同名冲突,跟文件夹类似。

  • 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

2. 包的定义:

包用package 包名来定义,包的声明必须放在第一行,包名用全小写英文字母表示,中间可用“."隔开,用以区分层次,类似文件夹路径中的“\”。例如:在Blogs.java文件里定义一个包名为cnblogs.com的包,包里面有个Blogs类:

Blogs.java

package cnblogs.com;     //包的声明,放在第一行

public class Blogs
{
  public void toPostBlogs()
  {
       System.out.println("This is a new blog.");
  }
}

3. 包的使用:

包可以通过import关键字导入,从而在某个文件中使用另一个文件中的类,格式为import 包名.类名,如import cnblogs.com.Blogs。也可以用import 包名.*导入某个包里的所有类。就好像我们在使用系统里的一些类一样,比如使用Scanner类,要在最前面添加一句>import java.util.Scanner或者java.util.*,因为Scanner就是java.util包下的一个类。


Java的内部类

顾名思义,内部类( Inner Class )就是定义在另外一个类内部的类。与之对应,包含内部类的类被称为外部类(Outer Class)。内部类分为:成员内部类、静态内部类、方法内部类、匿名内部类。
1. 内部类的主要作用:

  • 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。

  • 内部类的方法可以直接访问外部类的所有数据,包括私有的数据。

  • 内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便。

2. 成员内部类:

成员内部类也叫普通内部类,使用方法如下:

  • Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 public 、 protected 、 private 等。

  • Inner 类中定义的方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,包括直接访问 Outer 类中的私有属性。

  • 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( )

3. 静态内部类:

静态内部类是 static 修饰的内部类,这种内部类的特点是:

  • 静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问

  • 如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员

  • 创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名= new 内部类();

4. 方法内部类:

方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。




posted @ 2017-07-27 14:07  JackinHu  阅读(353)  评论(0编辑  收藏  举报