Java的访问修饰符
Posted 飞鱼的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的访问修饰符相关的知识,希望对你有一定的参考价值。
为了实现面向对象程序设计(OOP)的封装这个特性,需要程序设计语言提供一定的语法机制来支持。这个语法机制就是访问权限控制(访问修饰符:public、protected、private、default)。
在 Java 中,封装就意味着所有的实例域都带有 private 访问修饰符(私有的实例域),并提供带有 public 访问修饰符的域访问器方法和域更改器方法(公共的操作方法)。
访问修饰符
下面归纳一下 Java 用于控制可见性的 4 个访问修饰符:
- public:声明为 public 的内容对所有类可见。
- protected:声明为 protected 的内容对所有子类和同一个包中的所有其他类可见。
- private:声明为 private 的内容仅对本类可见。对其他类都是不可见的,这对于子类来说也完全适用,即子类也不能访问父类的私有域。
- 缺省(无访问修饰符):无访问修饰符的内容对同一个包中的所有其他类可见。
Java 中的受保护部分(protected)对所有子类及同一个包中的所有其他类都可见。这与 C++ 中的保护机制稍有不同,Java 中的 protected 概念要比 C++ 中的安全性差。
访问修饰符用来修饰类,及类的内部结构
- 修饰类,只能用:public、缺省
- 修饰类的内部结构(属性、方法、构造器、内部类),可以用:public、protected、private、缺省 修饰
受访问保护
大家都知道,最好将类中的域标记为 private,而将方法标记为 public。任何声明为 private 的内容对其他类都是不可见的,这对于子类来说也完全适用,即子类也不能访问父类的私有域。
然而,在有些时候,人们希望父类中的某些方法允许被子类访问,或者允许子类的方法访问父类的某个域。为此,需要将这些方法或域声明为 protected。例如,如果将父类 Employee 中的 hireDay 声明为 proteced,而不是私有的,Manager 中的方法就可以直接地访问它。
不过,Manager 类中的方法只能够访问 Manager 对象中的 hireDay 域,而不能访问其他 Employee 对象中的这个域。这种限制有助于避免滥用受保护机制,使得子类只能获得访问受保护域的权利。
在实际应用中,要谨慎使用 protected 属性。假设需要将设计的类提供给其他程序员使用,而在这个类中设置了一些受保护域,由于其他程序员可以由这个类再派生出新类,并访问其中的受保护域。在这种情况下,如果需要对这个类的实现进行修改,就必须通知所有使用这个类的程序员。这违背了 OOP 提倡的数据封装原则。
受保护的方法更具有实际意义。
- 如果需要限制某个方法的使用,就可以将该方法声明为 protected。这表明子类(可能很熟悉祖先类)得到信任,可以正确地使用这个方法,而其他类则不行。这种方法的一个最好的示例就是 Object 类中的 clone 方法。
- protected 方法对于指示那些不提供一般用途而应在子类中重新定义的方法很有用。
参考资料
《Java核心技术卷一:基础知识》(第10版)第 5 章:继承 5.1.10 受保护访问
本文来自博客园,作者:真正的飞鱼,转载请注明原文链接:https://www.cnblogs.com/feiyu2/p/17320472.html
java修饰符
1.修饰符分为:访问修饰符,存储修饰符。
2.变量的命名,方法的命名等,都是由访问修饰符,存储修饰符及数据类型、变量、对象构成的
a.访问修饰符
(1)访问修饰符分为4种,public、protected、默认、private
(2)为了使程序的程序的变量更加安全,可以用private关键字将数据封装在类里。且访问修饰符(关键字)提供了不同的程序访问权限的级别
(3)四个修饰符的访问级别由高到低是:public、protected、默认、private
(4)成员被声明为public时,该成员可以被任何程序的代码模块所访问
(5)成员被声明为protected时,该成员只可以被该类的子类模块所访问
(6)成员被声明为默认时,该成员只可以被该类所在包中的类代码模块所访问
(7)成员被声明为private时,该成员只可以被本类的程序所访问
b.存储修饰符
(1)static访问方式:类名.类成员 实例化类名.类成员
(2)可以用来初始化,声明时具有初始化功能
(3)声明块时,先加载static块,再加载main块
(4)static修饰方法时,方法里不能使用this、super关键字
(5)final可以修饰类、方法、变量
以上是关于Java的访问修饰符的主要内容,如果未能解决你的问题,请参考以下文章
在Java和c#中如果不写访问修饰符,类和类成员默认的是啥访问修饰符?