封装是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种不同的访问权限:
默认的,也称为 default,在同一包内可见,不使用任何修饰符。
私有的,以 private 修饰符指定,在同一类内可见。
共有的,以 public 修饰符指定,对所有类可见。
受保护的,以 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. 方法内部类:
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。