Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
沉默王二
Jmx Java
提交
3be6f352
J
Jmx Java
项目概览
沉默王二
/
Jmx Java
10 个月 前同步成功
通知
160
Star
18
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
Jmx Java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
3be6f352
编写于
5月 31, 2022
作者:
沉默王二
💬
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
访问权限修饰符
上级
8d3e975d
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
289 addition
and
13 deletion
+289
-13
README.md
README.md
+1
-0
docs/.vuepress/sidebar.ts
docs/.vuepress/sidebar.ts
+1
-0
docs/.vuepress/styles/palette.scss
docs/.vuepress/styles/palette.scss
+3
-3
docs/basic-extra-meal/deep-copy.md
docs/basic-extra-meal/deep-copy.md
+2
-10
docs/home.md
docs/home.md
+1
-0
docs/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi.md
...ticle/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi.md
+281
-0
images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-ae5c9282-f970-422c-8e4a-8b634c090108.png
...nquanxiankongzhi-ae5c9282-f970-422c-8e4a-8b634c090108.png
+0
-0
images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-c24e407b-88ff-4008-8f71-085c4dfb180b.png
...nquanxiankongzhi-c24e407b-88ff-4008-8f71-085c4dfb180b.png
+0
-0
images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-f585188c-7e62-4050-8e8e-605d128b0e35.png
...nquanxiankongzhi-f585188c-7e62-4050-8e8e-605d128b0e35.png
+0
-0
未找到文件。
README.md
浏览文件 @
3be6f352
...
...
@@ -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
)
...
...
docs/.vuepress/sidebar.ts
浏览文件 @
3be6f352
...
...
@@ -154,6 +154,7 @@ export const sidebarConfig = defineSidebarConfig({
text
:
"
构造方法
"
,
link
:
"
oo/construct
"
,
},
"
bokeyuan-jianxijavazhongdifangwenquanxiankongzhi
"
,
{
text
:
"
代码初始化块
"
,
link
:
"
oo/code-init
"
,
...
...
docs/.vuepress/styles/palette.scss
浏览文件 @
3be6f352
// 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
docs/basic-extra-meal/deep-copy.md
浏览文件 @
3be6f352
...
...
@@ -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 接口是一个标记接口,它肚子里面是空的:
...
...
docs/home.md
浏览文件 @
3be6f352
...
...
@@ -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
)
...
...
docs/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi.md
0 → 100644
浏览文件 @
3be6f352
---
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
images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-ae5c9282-f970-422c-8e4a-8b634c090108.png
0 → 100644
浏览文件 @
3be6f352
262.8 KB
images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-c24e407b-88ff-4008-8f71-085c4dfb180b.png
0 → 100644
浏览文件 @
3be6f352
309.7 KB
images/nice-article/bokeyuan-jianxijavazhongdifangwenquanxiankongzhi-f585188c-7e62-4050-8e8e-605d128b0e35.png
0 → 100644
浏览文件 @
3be6f352
315.1 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录