文章目录
前言
本文是学习Java编程思想记录的笔记,主要内容介绍在 Java 中封装的概念。
封装即是将对象的属性信息隐藏在对象内部,不允许外部程序直接访问对象内部属性信息,而是通过该类所提供的方法来实现对内部属性信息的操作和修改。
一、包的概念
包内包含一组类,它们被组织在一个单独的命名空间(namespace)下。
例如,标准 Java 发布中有一个工具库,它被组织在 java.util 命名空间下。java.util 中含有一个类,叫做 ArrayList。使用 ArrayList 的一种方式是用其全名 java.util.ArrayList。如果需要导入某个类,就需要在 import 语句中声明:
import java.util.ArrayList;
public class SingleImport {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
}
}
之所以使用导入,是为了提供一种管理命名空间的机制。所有类名之间都是相互隔离的。
1.代码组织
当编译一个 .java 文件时,.java 文件的每个类都会有一个输出文件。每个输出的文件名和 .java 文件中每个类的类名相同,只是后缀名是 .class。在 Java 中,可运行程序是一组 .class 文件,它们可以打包压缩成一个 Java文档文件(JAR,使用 jar 文档生成器)。Java 解释器负责查找、加载和解释这些文件。
类库是一组类文件。每个源文件通常都含有一个 public 类和任意数量的非 public类,因此每个文件都有一个 public 组件。如果把这些组件集中在一起,就需要使用关键字 package。
如果你使用了 package 语句,它必须是文件中除了注释之外的第一行代码。
package chapter7;
意味着这个编译单元是一个名为 chapter7 类库的一部分。。任何人想要使用该名称,必须指明完整的类名或者使用 import 关键字导入 chapter7。。(注意,Java 包名按惯例一律小写,即使中间的单词也需要小写,与驼峰命名不同)
2.创建独一无二的包名
因为 Internet 域名是独一无二的,所以你的 package 名称也应该是独一无二的,不会发生名称冲突。一般都使用域名的反转并全部改为小写。
3.冲突
如果导入了两个包含相同名字类名的类库,必须明确指明全名。
import java.util.*;
public class Conflict {
public static void main(String[] args) {
com.test.chapter6.Vector vector = new com.test.chapter6.Vector();
Vector vector1 = new Vector();
}
}
4.使用 import 改变行为
Java 没有 C 的条件编译(conditional compilation)功能,该功能使你不必更改任何程序代码而能够切换开关产生不同的行为。Java 之所以去掉此功能,可能是因为 C在绝大多数情况下使用该功能解决跨平台问题:程序代码的不同部分要根据不同的平台来编译。而 Java 自身就是跨平台设计的,这个功能就没有必要了。
但是,条件编译还有其他的用途。调试是一个很常见的用途,调试功能在开发过程中是开启的,在发布的产品中是禁用的。可以通过改变导入的 package 来实现这一目的,修改的方法是将程序中的代码从调试版改为发布版。这个技术可用于任何种类的条件代码。
5.注意事项
当创建一个包时,包名就隐含了目录结构。这个包必须位于包名指定的目录中,该目录必须在以CLASSPATH 开始的目录中可以查询到。最初使用关键字 package 可能会有点不顺,因为除非遵守 “包名对应目录路径” 的规则,否则会收到很多意外的运行时错误信息如找不到特定的类,即使这个类就位于同一目录中。
编译过的代码通常位于与源代码的不同目录中。这是很多工程的标准,而且集成开发环境(IDE)通常会自动为我们做这些。必须保证 JVM 通过 CLASSPATH 能找到编译后的代码。
二、访问权限修饰符
Java 访问权限修饰符 public,protected 和 private 位于定义的类名,属性名和方法名之前。每个访问权限修饰符只能控制它所修饰的对象。包访问权限可以把相关类聚到一个包下,以便它们能轻易地相互访问。
权限修饰符概念:
- private:Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。只能在当前类访问,其他类不能访问,更不能允许跨包访问。
- default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下只允许在同一个包中进行访问。
- protected:介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。只能被类本身以及子类访问,即使子类在不同的包中也可以访问。
- public: Java语言中访问限制最宽的修饰符,可以跨类访问,而且允许跨包访问。
下图展示四种修饰符的访问权限范围:
1.当前类访问权限
public class ParentClass {
//权限为private
private int a1 = 10;
//权限为default
int a2 = 20;
//protected
protected int a3 = 30;
//权限为public
public int a4 = 40;
private void printA1() {
System.out.println(a1);
}
void printA2() {
System.out.println(a2);
}
protected void printA3() {
System.out.println(a3);
}
public void printA4() {
System.out.println(a4);
}
public static void main(String[] args) {
ParentClass parentClass = new ParentClass();
//==========对方法的访问控制===========
parentClass.printA1(); //printA1修饰符是private,只能在当前类访问,其他类不能访问,更不能允许跨包访问
parentClass.printA2(); //printA2修饰符是default,只允许在同一个包中进行访问
parentClass.printA3(); //printA3修饰符是protected,被其修饰的方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问
parentClass.printA4(); //printA1修饰符是public,可以跨类访问,而且允许跨包访问
//==========对属性的访问控制===========
System.out.println(parentClass.a1); //a1修饰符是private,只能在当前类访问,其他类不能访问,更不能允许跨包访问
System.out.println(parentClass.a2); //a2修饰符是default,只允许在同一个包中进行访问
System.out.println(parentClass.a3); //a3修饰符是protected,只能被类本身以及子类访问,即使子类在不同的包中也可以访问
System.out.println(parentClass.a4); //a4修饰符是public,可以跨类访问,而且允许跨包访问
}
}
其中定义了四种不通修饰符的方法和属性,编译没有问题,所有修饰符修饰的属性方法都可以访问。
2.同包非子类访问权限
根据上图可知,private只能在当前类访问,其他类不能访问,更不能允许跨包访问。
3.不同包非子类访问权限
由图可知,在不同包且非子类中,只有public可以跨类访问,而且允许跨包访问
4. 同包子类访问权限
private修饰的,子类也不能访问。
不同包子类访问权限
上图证明default只允许在同一个包中进行访问。
三、接口和实现
访问控制通常被称为隐藏实现(implementation hiding)。将数据和方法包装进类中并把具体实现隐藏被称作是封装(encapsulation)。其结果就是一个同时带有特征和行为的数据类型。
出于两个重要的原因,访问控制在数据类型内部划定了边界。第一个原因是确立客户端程序员可以使用和不能使用的边界。可以在结构中建立自己的内部机制而不必担心客户端程序员偶尔将内部实现作为他们可以使用的接口的一部分。
这直接引出了第二个原因:将接口与实现分离。如果在一组程序中使用接口,而客户端程序员只能向 public 接口发送消息的话,那么就可以自由地修改任何不是 public 的事物(例如包访问权限 protected,或 private 修饰的事物),却不会破坏客户端代码。
四、类访问权限
- default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下只允许在同一个包中进行访问。
- public: Java语言中访问限制最宽的修饰符,可以跨类访问,而且允许跨包访问。
当你创建了一个包访问权限的类(default),把类中的属性声明为 private 仍然是有意义的,应该尽可能将所有属性都声明为 private,但是通常把方法声明成与类(包访问权限)相同的访问权限也是合理的。
总结
以上就是本文要讲的内容,本文仅仅是作者自己的学习笔记,其中记录关于java中的:封装的相关内容。