Java中的访问权限控制

在我们编写程序时,在代码中总会有着某些部分会进行重新创作和优化。当我们写过代码后回头看时就会发现,往往就会发现有些功能可以用更好的方式来实现,这便是重构。重构虽然可以增加代码的可读性以及可维护性,但是对于程序员来说,在重构时也是存在着巨大的压力,通长总会有一些客户端程序员需要你在代码的某些方面保持不变。类设计者必须优化和改进代码,而类使用者却想者在出现改动使自己的代码保持不变。因此在面向对象的设计中需要考虑一个问题:“如何把变动的事物与保持不变的事务区分开来”。为了解决这一问题,Java提供了访问权限修饰符,由类开发者向客户端程序员指明那些是可用的,那些是不可用的。访问权限控制的等级,从大到小依次为public、protected、default(包访问权限,没有关键字)、private。

Java中的包

1.1 导入包
一些访问权限的修饰词会因为类是否和其他部分处于一个相同的包里产生影响,因此首先要学习管理、使用、制作、导入包,明确它的概念。Java中把众多类定义的文件捆绑到一个内聚的类库单元,也就是包里面,然后通过Java中的关键字package加以控制。

例如,在Java的标准发布中有一个工具库,它被组织在java.util名字空间之下。java.util中有一个叫做ArrayList的类,使用ArrayList的方式可以是用其全名java.util.ArrayList来指定,或者是使用import关键字导入包,不过为了防止代码变得冗长一般采用后者:

import java.util.ArrayList;

public class Thinking_test {
    public static void main(String []args){
       //java.util.ArrayList list=new java.util.ArrayList();  //用其全名进行指定
       ArrayList list=new ArrayList();
    }
}

这样就可以不用限定地使用ArrayList了,但是这里只能使用ArrayList类。若想导入java.util中的其他类,可以将import java.util.ArrayList;换成import java.util.*;这样就可以使用java.util中的所有类了。

1.2 代码组织

当编译一个.java文件时,在.java文件中的每个类都会有一个输出文件,而该输出文件的名称与.java文件中每个类的名称相同,只是多了一个后缀.class。因此,在编译少量.java文件之后,会得到大量的.class文件。Java可运行程序是一组可以打包并压缩为Java文档文件(JAR,使用Java的jar文档生成器)的.class文件。Java解释器负责这些文件的查找,装载和解释。

类库实际上是一组类文件,其中每个文件都有一个public类,以及任意数量的非public类。因此每个文件都有一个构件。如果希望这些构件从属于同一个群组,就可以使用关键字package

例如:假设文件的名称是MyClass.java,这就意味着在该文件中有且只有一个public类,该类的名称必须是MyClass:

package com.mypackage;

public class MyClass {
  //  ....
}

此时假如MyClass类是在某一个类库中的类,当我们想要调用时就必须使用关键字import来使库的名称可用,或者给出完整的名称。

import com.mypackage.MyClass;

public class Thinking_test {
    public static void main(String []args){
       MyClass m=new MyClass();
    }
}

Java访问权限修饰符

在Java中,当我们要访问一个类成员时,为使这种访问合法化有以下四种情况:

  • 1. 被访问类成员被public修饰。
  • 2. 被访问类成员没有任何修饰,访问者和被访问者定义在同一个包内。
  • 3. 通过继承访问其父类的public/protect成员。
  • 4.使用getter/setter或其他类内函数间接地访问类内的私有成员。

分别对应了Java访问权限的不同访问级别:

当前类 同一个包的类 不同包的子类 同一个工程的类
public
protected ×
default × ×
private × × ×

2.1 public公共访问权限
使用关键字public修饰一个类成员时,代表这个类成员可以被所有代码访问
public:即共有的,是访问权限限制最宽的修饰符。使用关键字public就意味着public之后跟随着的成员声明自己对每个人都是可用的,被public修饰的类、属性、及方法不仅可以跨类访问,而且可以跨包访问。
2.2 protected受保护访问权限
使用关键字protected修饰一个类成员时,代表这个类成员只能被自己的类成员和子类的类成员访问
protected:即保护访问权限,是介于public和private之间的一种访问修饰。被protected修饰的属性及方法只能被类本身的方法和子类访问。一般情况下处理的是继承的概念,通过继承可以利用一个现有类—将其称为基类,然后将新成员添加到该现有类中而不必改变现有类。

2.3 包访问权限
包访问权限没有关键字,通常默认为包访问权限(有时表示为default),包中所有的类都可以对拥有包访问权限的类/类成员进行访问,它们对包外的类来说不可见。
2.4 private私有访问权限
使用关键字private修饰一个类成员时,代表这个类成员所在类的其他成员外,其他任何代码都无权访问
private:即私有访问权限,由于处于同一个包内的其他类是不可以访问private成员的,这相当于自己隔离了自己,使得使用类的客户端程序员无法访问包访问权限成员,这个机制把类设计者负责的部分和类使用者要负责的部分分离开了。

类的访问权限

在Java中,访问权限修饰符可以用于确定库中的那些类对于该库的使用者是可用的。如果希望某个类可以被某个客户端程序员所用,就可以通过public作用于整个类的定义来达到目的,这样做甚至可以控制客户端程序员是否能创建一个该类对象。
在控制类的访问权限时,还有一些额外的限制需要注意:

  • 1.每个编译单元都只能有一个public类。这表示,每个编译单元都有单一的公共接口,用public来表现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出出错信息。
  • 2.public类的名称必须完全与含有该编译单元的文件名相匹配,包括大小写。所以对于一个Test类而言,文件的名称必须是Test.java。
  • 3.虽然不是很常用,但编译单元内完全不带public类也是可能的。在这种情况下,可以随意对文件命名。

类本身可以被访问权限关键词修饰,但是需要注意,类既不可以是private也不可以是protected的(除了一种叫做内部类的特殊类可以被private和protected关键字修饰)。所以对于类的访问权限,仅有两个选择:可以被任意代码访问的public访问权限包访问权限

猜你喜欢

转载自blog.csdn.net/Lzy410992/article/details/107627236