提交 3be6f352 编写于 作者: 沉默王二's avatar 沉默王二 💬

访问权限修饰符

上级 8d3e975d
......@@ -115,6 +115,7 @@
- [Java变量的作用域:局部变量、成员变量、静态变量、常量](docs/oo/var.md)
- [Java方法](docs/oo/method.md)
- [Java构造方法](docs/oo/construct.md)
- [浅析Java中的访问权限控制](docs/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi.md)
- [Java代码初始化块](docs/oo/code-init.md)
- [Java抽象类](docs/oo/abstract.md)
- [Java接口](docs/oo/interface.md)
......
......@@ -154,6 +154,7 @@ export const sidebarConfig = defineSidebarConfig({
text: "构造方法",
link: "oo/construct",
},
"bokeyuan-jianxijavazhongdifangwenquanxiankongzhi",
{
text: "代码初始化块",
link: "oo/code-init",
......
// colors
$themeColor: #5b86ff;
$sidebarMobileWidth: 16rem;
$sidebarWidth: 20rem;
\ No newline at end of file
$theme-color: #5b86ff;
$sidebar-mobile-width: 16rem;
$sidebar-width: 20rem;
\ No newline at end of file
......@@ -38,21 +38,13 @@ class Writer implements Cloneable{
", name='" + name + '\'' +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
```
Writer 类有两个字段,分别是 int 类型的 age,和 String 类型的 name。然后重写了 `toString()` 方法,方便打印对象的具体信息。并且重写了 `clone()` 方法,方法体里面也很简单,直接调用 Object 类的 `clone()` 方法。
“既然 Writer 类的 `clone()` 方法体里只有一行代码,调用的还是超类 Object 的 `clone()` 方法?为什么还要重写呢?不是多此一举吗?”三妹着急地问。
Writer 类有两个字段,分别是 int 类型的 age,和 String 类型的 name。然后重写了 `toString()` 方法,方便打印对象的具体信息。
“嗯,是这样的,三妹。Object 类中的 `clone()` 方法是 protected 的,如果 Writer 类不去重写的话,Writer 类的对象是无法调用 `clone()` 方法的,因为 protected 修饰的方法对子类并不可见。”
哦哦,那为什么要实现 Cloneable 接口呢?”三妹开启了十万个为什么的模式。
“为什么要实现 Cloneable 接口呢?”三妹开启了十万个为什么的模式。
Cloneable 接口是一个标记接口,它肚子里面是空的:
......
......@@ -114,6 +114,7 @@ headerDepth: 1
- [Java变量的作用域:局部变量、成员变量、静态变量、常量](oo/var.md)
- [Java方法](oo/method.md)
- [Java构造方法](oo/construct.md)
- [浅析Java中的访问权限控制](docs/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi.md)
- [Java代码初始化块](oo/code-init.md)
- [Java抽象类](oo/abstract.md)
- [Java接口](oo/interface.md)
......
---
title: 浅析Java中的访问权限控制
shortTitle: 访问权限控制
category:
- Java核心
tag:
- Java
---
我们先来讨论一下为什么需要访问权限控制。考虑两个场景:
场景 1:工程师 A 编写了一个类 ClassA,但是工程师 A 并不希望 ClassA 被其他类都访问到,该如何处理呢?
场景 2:工程师 A 编写了一个类 ClassA,其中有两个方法 fun1、fun2,工程师只想让 fun1 对外可见,也就是说,如果别的工程师来调用 ClassA,只可以调用方法 fun1,该怎么处理呢?
此时,访问权限控制便可以起到作用了。
在 Java 中,提供了四种访问权限控制:
- 默认访问权限(包访问权限)
- public
- private
- protected
类只可以用默认访问权限和 public 修饰。比如说:
```
public class Wanger{}
```
或者
```
class Wanger{}
```
但变量和方法则都可以修饰。
## 1.修饰类
- 默认访问权限(包访问权限):用来修饰类的话,表示该类只对同一个包中的其他类可见。
- public:用来修饰类的话,表示该类对其他所有的类都可见。
例 1:
Main.java:
```
package com.tobetterjavaer.test1;
public class Main {
public static void main(String\[\] args) {
People people = new People("Tom");
System.out.println(people.getName());
}
}
```
People.java
```
package com.tobetterjavaer.test1;
class People {//默认访问权限(包访问权限)
private String name = null;
public People(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
从代码可以看出,修饰 People 类采用的是默认访问权限,而由于 People 类和 Main 类在同一个包中,因此 People 类对于 Main 类是可见的。
例子 2:
People.java
```
package com.tobetterjavaer.test2;
class People {//默认访问权限(包访问权限)
private String name = null;
public People(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
```
此时 People 类和 Main 类不在同一个包中,会发生什么情况呢?
下面是 Main 类中的提示的错误:
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-d89b79ad-83eb-4d64-ab8f-5ff6f7a6a240.png)
提示 Peolple 类在 Main 类中不可见。从这里就可以看出,如果用默认访问权限去修饰一个类,该类只对同一个包中的其他类可见,对于不同包中的类是不可见的。
正如上图的快速修正提示所示,将 People 类的默认访问权限更改为 public 的话,People 类对于 Main 类便可见了。
## 2.修饰类的方法和变量
- 默认访问权限(包访问权限):如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显式地调用该类的方法或变量。
- private:如果一个类的方法或者变量被 private 修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显式的进行访问。
- protected:如果一个类的方法或者变量被 protected 修饰,对于同一个包的类,这个类的方法或变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。
- public:被 public 修饰的方法或者变量,在任何地方都是可见的。
例 3:
Main.java 没有变化
People.java
```
package com.tobebetterjavaer.test1;
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
String getName() { //默认访问权限(包访问权限)
return name;
}
void setName(String name) { //默认访问权限(包访问权限)
this.name = name;
}
}
```
此时在 Main 类是可以显示调用方法 getName 和 setName 的。
但是如果 People 类和 Main 类不在同一个包中:
```
package com.tobebetterjavaer.test2; //Main类处于不同包中
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
String getName() { //默认访问权限(包访问权限)
return name;
}
void setName(String name) { //默认访问权限(包访问权限)
this.name = name;
}
}
```
此时在 Main 类中会提示错误:
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-b05e6c2c-8f11-4335-a681-c48377d645a7.png)
由此可以看出,如果用默认访问权限来修饰类的方法或者变量,则只能在同一个包的其他类中进行访问。
例 4:
People.java
```
package com.tobebetterjavaer.test1;
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
protected String getName() {
return name;
}
protected void setName(String name) {
this.name = name;
}
}
```
此时是可以在 Main 中显示调用方法 getName 和 setName 的。
如果 People 类和 Main 类处于不同包中:
```
package com.tobebetterjavaer.test2;
public class People {
private String name = null;
public People(String name) {
this.name = name;
}
protected String getName() {
return name;
}
protected void setName(String name) {
this.name = name;
}
}
```
则会在 Main 中报错:
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-0c3938bb-b4de-481d-b396-54a4ddd00bad.png)
如果在 com.cxh.test1 中定一个类 Man 继承 People,则可以在类 Man 中显示调用方法 getName 和 setName:
```
package com.tobebetterjavaer.test1;
import com.tobebetterjavaer.test2.People;
public class Man extends People {
public Man(String name){
super(name);
}
public String toString() {
return getName();
}
}
```
补充一些关于 Java 包和类文件的知识:
1)Java 中的包主要是为了防止类文件命名冲突以及方便进行代码组织和管理;
2)对于一个 Java 源代码文件,如果存在 public 类的话,只能有一个 public 类,且此时源代码文件的名称必须和 public 类的名称完全相同。
另外,如果还存在其他类,这些类在包外是不可见的。如果源代码文件没有 public 类,则源代码文件的名称可以随意命名。
>转载链接:[https://www.cnblogs.com/dolphin0520/p/3734915.html](https://www.cnblogs.com/dolphin0520/p/3734915.html) 原作者: Matrix海子,编辑:沉默王二
![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xingbiaogongzhonghao.png)
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册