Java访问控制

Java访问控制

包和类库

一个包包含了一组类,这组类都在同一个命名空间下。如果想要使用包中的类可以在使用的时候书写包名和类名的全称,另外一种方法是使用import关键字,import可以引用单个的类也可以导入包中的所有类,例如import java.util.*。之所以引入命名空间机制是为了防止类名的冲突。同一个包下不能有同名的类,但是不同包中的类可以同名。

每当你创建一个Java源代码文件的时候,通常会被称为一个编译单元。每个编译安原都是以.java为扩展名,在这个编译单元内只能有一个公共类,且这个公共类的名字必须与这个编译单元文件的名字相同,且区分大小写,否则编译器会报错。如果在这个 编译单元内还有其他的类,那么他们需要对包外的其他类进行隐藏,因为他们不能设置为公共的,他们起到的是对这个编译单元内的公共类的支持作用。

当你编译.java文件的时候,.java文件里面的每个类都会生成一个输出文件,每个输出文件的名字与.java文件里面的类名相同,文件的后缀为.class。得到这些.class文件之后,他们将被打包压缩成Java Archive JAR文件。Java解释器就是负责查找、加载和解释这些JAR文件。

一个类库就是这些类文件的集合。每个源文件通常含有一个公共类和若干个非公共类,因此每个源文件只有一个公共组件。如果你想要生命一些组件属于同一个组别,那么就可以使用package关键字。package关键字必须出现在第一行非注释行中。如声明package access;的时候表示这个编译单元式access库的一部分。也就是在使用这个文件中的公共类的时候要么使用全写名称要么使用import关键字引入access库。

那么既然包中包含的不是一个文件而是多个class文件,那么是如何进行管理的呢?这里使用了操作系统中的文件目录层级结构来帮助进行管理,也就是将同一个包中的class文件放入同一个文件目录下。这样方便地解决了两个问题,首先是创建一个唯一的包名称,并且在其下面找到对应的类,因为默认的包名称规则是以创建者的域名开头,因此有效地保证了包名的唯一性;第二点是包名对应着机器上的目录,方便与查找和加载对应的.class文件,可直接从包名对应的目录中查找。

Java解释器的工作步骤如下,首先找到环境变量中的CLASSPATH,里面包含了一个或者多个用于查找.class文件的根目录。然后解释器将会把包名中的.转换为斜杠,从而把包名转换为目录名称。然后同CLASPATH对应的目录组合起来形成一个完整的目录,在里面去查找对应的类。

如果我们知道了Java解释器的工作原理啊,那么我们就可以创建自己的类库工具来减少代码的输入,例如System.out.println函数,我们可以把它封装到一个Print类中,通过静态引入就可以在程序中使用直接使用,如下:

//: net/mindview/util/Print.java
// Print methods that can be used without
// qualifiers, using Java SE5 static imports:
package net.mindview.util;
import java.io.*;
public class Print {
// Print with a newline:
  public static void print(Object obj) {
    System.out.println(obj);
  }
  // Print a newline by itself:
  public static void print() {
    System.out.println();
  }
  // Print with no line break:
  public static void printnb(Object obj) {
    System.out.print(obj);
  }
  // The new Java SE5 printf() (from C):
  public static PrintStream
    printf(String format, Object... args) {
    return System.out.printf(format, args);
  }
} ///:~

//: access/PrintTest.java
// Uses the static printing methods in Print.java.
import static net.mindview.util.Print.*;
public class PrintTest {
  public static void main(String[] args) {
    print("Available from now on!");
    print(100);
    print(100L);
    print(3.14159);
  }
} /* Output:
Available from now on!
100
100
3.14159
*///:~

另外,Java中没有C语言的条件编译,因为Java是自动跨平台的语言,因此不会像C语言一样面临不同机器需要书写不同代码的情况,但是如果在面临调试和发布需要两种不同版本的代码时,通常的解决方案是使用两个不同版本的包,然后在对应的时刻切换到对应的包即可。

在Java中一定要注意,每个包都会对应机器上的从CLASSPATH开始的目录,这样在遇到无法查找到相关类的时候有助于解决问题

Java访问控制符

Java的访问控制符关键字有public,protected和private。他们可以用来修饰类中的成员,不管是属性还是方法。如果没有书写访问控制关键字,那么将会赋予默认的包访问控制。也就是说任何一个成员都有对应的访问控制权限。

包方位控制权限意味着在当前包中的所有其他类都可以访问这个成员,但是包外的类不可以访问。

public表示对所有成员可见

private关键字表示没有人可以从类的外部访问这种成员

关于private主要用于继承关系中,如果在不同的包中对现有的类进行继承,那么子类只能访问public成员,如果在同一个包中那么可以访问public成员和包访问控制成员。如果父类想要仅仅向子类暴露一些属性的话,那么可以使用protected修饰符,同时protected也具有包访问权限,也就是所有其他的同一个包中的类都可以访问protected成员。

接口和实现

访问控制也被称为隐藏实现,封装数据和方法的实现并且隐藏起来称之为封装。封装的记过是具有特性和行为的数据类型。访问控制在数据类型中放置边界有两个原因,第一个是可以控制客户端可以访问和不可以访问的变量;第二点是将接口与实现分离开来。通常的写法是先写公共成员然后在写protected成员,最后是private成员,这样有利于使用者第一时间明白这个类的作用,而不是去关心每个作用是如何实现的。

类访问控制

Java中可以对库中的类指定访问控制权限,如果你希望类对所有使用此包的人可以见,那么可以使用public关键字,但是需要注意的是每个编译单元只能有一个public修饰的类;public修饰的类必须与边一单元文件的名字一样,且区分大小写;如果编译单元中没有公共类,那么可以任意命名此编译单元的文件名称。

如果不希望客户端访问到此包中的类,那么可以将public关键字去掉,不加任何访问控制修饰符,这个时候是包访问控制,表示只有此包中的其他类可以访问此类。类没有private和protected修饰符。

posted @   java资料收集  阅读(189)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示