持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
访问控制修饰符
今天我带大家回顾一下访问控制修饰符的内容,首先给大家看一个表格。大家一定不陌生。这就是我们的访问修饰符权限表。
| 访问级别 | 访问控制修饰符 | 同类 | 同包 | 同包子类 | 不同包子类 | 不同包 |
|---|---|---|---|---|---|---|
| 公开 | public | √ | √ | √ | √ | √ |
| 受保护 | protected | √ | √ | √ | √ | x |
| 默认 | 没有修饰符 | √ | √ | √ | x | x |
| 私有 | private | √ | x | x | x | x |
今天我带大家实际操作一下,让你们对它们权限的理解更深刻一些。
同类
package yrx;
public class Ysbt {
public int a = 1;
int b = 1;
protected int c = 1;
private int d = 1;
public void e(){
System.out.println("这是e方法");
}
void f(){
System.out.println("这是f方法");
}
protected void j(){
System.out.println("这是j方法");
}
private void h(){
System.out.println("这是h方法");
}
public static void main(String[] args) {
Ysbt ysbt = new Ysbt();
System.out.println(ysbt.a);
System.out.println(ysbt.b);
System.out.println(ysbt.c);
System.out.println(ysbt.d);
ysbt.e();
ysbt.f();
ysbt.j();
ysbt.h();
}
}
大家通过上面的代码可以很清楚的看到,在同一个类中无论是什么访问控制修饰符都是可以被调用的。一个类的内部就像一个大家庭,谁都可以用家中的东西。
同包
package yrx;
public class Dog {
public int a = 1;
int b = 1;
protected int c = 1;
private int d = 1;
public void e(){
System.out.println("这是e方法");
}
void f(){
System.out.println("这是f方法");
}
protected void j(){
System.out.println("这是j方法");
}
private void h(){
System.out.println("这是h方法");
}
}
package yrx;
public class Ysbt {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog.a);
System.out.println(dog.b);
System.out.println(dog.c);
// System.out.println(dog.d); 报错
dog.e();
dog.f();
dog.j();
// dog.h(); 报错
}
}
这时我们会发现同一个包不同类中调用访问控制修饰符为private会报错。不同类中私有属性private是不会被访问到的。
子类
同包子类
package yrx;
public class Dog {
public int a = 1;
int b = 1;
protected int c = 1;
private int d = 1;
public void e(){
System.out.println("这是e方法");
}
void f(){
System.out.println("这是f方法");
}
protected void j(){
System.out.println("这是j方法");
}
private void h(){
System.out.println("这是h方法");
}
}
package yrx;
public class Ysbt extends Dog{
public static void main(String[] args) {
Ysbt ysbt = new Ysbt();
System.out.println(ysbt.a);
System.out.println(ysbt.b);
System.out.println(ysbt.c);
// System.out.println(ysbt.d); 报错
ysbt.e();
ysbt.f();
ysbt.j();
// ysbt.h(); 报错
}
}
同包子类也只有私有属性private是不会被访问到的。
不同包子类
package two;
public class Cat {
public int a = 1;
int b = 1;
protected int c = 1;
private int d = 1;
public void e(){
System.out.println("这是e方法");
}
void f(){
System.out.println("这是f方法");
}
protected void j(){
System.out.println("这是j方法");
}
private void h(){
System.out.println("这是h方法");
}
package yrx;
import two.Cat;
public class Ysbt extends Cat{
public static void main(String[] args) {
Ysbt ysbt = new Ysbt();
System.out.println(ysbt.a);
// System.out.println(ysbt.b);报错
System.out.println(ysbt.c);
// System.out.println(ysbt.d);报错
ysbt.e();
// ysbt.f();报错
ysbt.j();
// ysbt.h(); 报错
}
}
不同包子类只有public和protected可以被访问到。
不同包
package two;
public class Cat {
public int a = 1;
int b = 1;
protected int c = 1;
private int d = 1;
public void e(){
System.out.println("这是e方法");
}
void f(){
System.out.println("这是f方法");
}
protected void j(){
System.out.println("这是j方法");
}
private void h(){
System.out.println("这是h方法");
}
}
package yrx;
import two.Cat;
public class Ysbt {
public static void main(String[] args) {
Cat cat = new Cat();
System.out.println(cat.a);
// System.out.println(cat.b);报错
// System.out.println(cat.c);报错
// System.out.println(cat.d);报错
cat.e();
// cat.f();报错
// cat.j();报错
// cat.h(); 报错
}
}
不同包只能访问public修饰过得属性和方法。
个人感悟
访问控制修饰符很重要,在未来能否和合理地使用访问控制修饰符,决定着一个项目的开发和维护的难易程度。private访问控制修饰符大大提高java语言的安全性,把不想让别人看到属性私有化起来,同时可以使用get和set方法来设置和修改private的方法和属性。