JAVA访问控制权限

JAVA 编程思想看到第六章 访问权限控制 第一句话就是 : 访问控制(或隐藏具体实现) 与 "最初的实现并不恰当"

为什么需要访问权限控制?
现实的问题就是我写的程序如果需要修改重构,而其他地方又依赖于我当前的调用与输出。使用权限控制,把不变和经常改变的分开来解决这个问题。

(1)为了使用户不要触碰那些他们不该触碰的部分,这些部分对于类内部的操作时必要的,但是它并不属于客户端程序员所需接口的一部分。
(2)为了让类库设计者可用更改类的内部工作方式,而不必担心会对用户造成重大影响。
主要原因是为了提高代码的灵活性。访问权限控制的使用主要就是为未来的更新和维护留有余地而出现的机制,核心思想就是"代码不是面向现在的,也不是面向对象的,而是面向未来的!"

在Java中,我们使用package来解决名字冲突。引入package,可以把相同功能单元的类放在一起,避免其他地方错误调用。
package 包的作用以及注意事项:
Java内建的package机制是为了避免class命名冲突;
JDK的核心类使用java.lang包,编译器会自动导入;
尽量遵守“包的名称对应目录路径的规则”
为了避免名字冲突,我们需要确定唯一的包名。推荐的做法是使用倒置的域名来确保唯一性。
要注意不要和java.lang包的类重名,即自己的类不要使用这些名字。
要注意也不要和JDK常用类重名。

包作用域:
位于同一个包的类,可以访问包作用域的字段和方法。

包的使用:
在写import的时候,可以使用*,表示把这个包下面的所有class都导入进来(但不包括子包的class)(不推荐,导入多个包后很难看出来具体程序使用的类到底是哪个包的)

// 导入System类的所有静态字段和静态方法
import static java.lang.System.*;

如果是import 引入的是具体类名,JAVA编译器将直接根据完整类名找到这个class

如果是简单类名
优先 查找当前package是否存在这个class
其次 查找import的包是否包含整个class
随后 查找java.lang包是否包含整个class

/*
package test;

import java.text.Format;

public class Main {
public static void main(String[] args) {
java.util.List list; // ok,使用完整类名 -> java.util.List
Format format = null; // ok,使用import的类 -> java.text.Format
String s = "hi"; // ok,使用java.lang包的String -> java.lang.String
System.out.println(s); // ok,使用java.lang包的System -> java.lang.System
MessageFormat mf = null; // 编译错误:无法找到MessageFormat: MessageFormat cannot be resolved to a type
}
}
*/

作用域:
大多数程序设计语言都提供了“作用域”(Scope)的概念。
对于在作用域里定义的名字,作用域同时决定了它的“可见性”以及“存在时间”。在 C,C++和 Java 里,作用域是由花括号的位置决定的。(常年写PHP的同学需要注意)
局部变量:
在方法内部定义的变量称为局部变量,局部变量作用域从变量声明处开始到对应的块结束。

private 私有 也就是说除了包含该成员的类,其他任何类都无法访问这个成员。这样你就可以随意修改该成员,而不必考虑是否会影响到其他类。
推荐把private方法放到后面,因为public方法定义了类对外提供的功能,阅读代码的时候,应该先关注public方法。

protected 受保护的 作用于继承关系,方便子类访问基类成员。
public 公共的 定义为public的class、interface可以被其他任何类访问。

总结:
如果不确定是否需要public,就不声明为public,即尽可能少地暴露对外的字段和方法。
Java内建的访问权限包括public、protected、private和package权限;
Java在方法内部定义的变量是局部变量,局部变量的作用域从变量声明开始,到一个块结束;
final修饰符不是访问权限,它可以修饰class、field和method;
一个.java文件只能包含一个public类,但可以包含多个非public类。

final 其实不是访问权限 与访问权限并不冲突 通常指 “这是无法改变的”
final可作用于 数据 方法 和 类
使用final修饰class 可以阻止class被继承。
使用final修饰method 可以阻止被子类复写。
使用final修饰field 可以阻止被重新赋值。
变量是基本类型:final修饰指的是基本类型的数据值不能发生改变
变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的。

posted @ 2021-01-02 15:31  year12  阅读(148)  评论(0编辑  收藏  举报