访问修饰符的真正理解

TypeScript 访问修饰符:深入理解封装的艺术 在面向对象编程(OOP)中,封装是一个核心概念,它决定了对象内部数据的可见性和可访问性。TypeScript 作为 JavaScript 的超集,通过访问修饰符(Access Modifiers)提供了强大的封装能力。本文将全面探讨 TypeScript 中的访问修饰符,帮助开发者构建更安全、更健壮的应用程序。 阅读详情

首先,必须明确Java中类成员的访问修饰符(public、private、protect、默认或friendly等,C++也同理),并不能简单的理解为书上说的如“子类可以访问”,具体因结合类的内存布局图来理解。例如一个父类有public a成员和protect b成员,在其子类的方法中访问a时,要考虑子类的内存布局能否看到a。    结合内存布局图就可以理解所谓“子类可以访问父类的protect b成员”说的是指本子类继承了父类的成员b,所以也具有b,当然就可以访问了。对于private成员,子类不继承,当然就没有了。  对于public的东西,在任何地方都能找到,对于private和protect就看通过内存布局能不能找到(即属于自己的可以找到,不属于自己的东西当然找不到了)。

【总之一句话,能不能访问,就看在当前作用域下能不能找到。】


以下是原因分析:

在Core Java中有这样一段话“在Object类中,clone方法被声明为protected,因此无法直接调用anObject.clone()。子类只能直接调用受保护的clone方法克隆它自己。为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”。但是不是所有的子类都可以访问受保护的方法吗?不是每个子类都是Object的之类吗?下面就用例子来说明下protected访问修饰符的问题。

在package1中创建SuperClass.java文件,里面有一个protected方法,内容如下。

[java]  view plain copy print ?
  1. package package1;  
  2.   
  3. public class SuperClass {  
  4.     protected void method(){  
  5.         System.out.println("This is a protected method in the super class .");  
  6.     }  
  7. }  
在同一个包中创建SubClass1.java文件,类SubClass1和类SubClass2均继承自SuperClass,内容如下。

[java]  view plain copy print ?
  1. package package1;  
  2.   
  3. public class SubClass1 extends SuperClass {  
  4.     public static void main(String[] args) {  
  5.         SuperClass sup = new SuperClass();  
  6.         SubClass1 sub1 = new SubClass1();  
  7.         SubClass2 sub2 = new SubClass2();  
  8.         sup.method();  //Compile OK   
  9.         sub1.method();  //Compile OK   
  10.         sub2.method();  //Compile OK   
  11.     }  
  12. }  
  13. class SubClass2 extends SuperClass{  
  14.       
  15. }  
编译全部通过,不难理解,protected方法对同包中的类是可见的。

如果在另一个包package2中创建SubClass1.java文件,内容与包package1中的SubClass1.java内容相同。

[java]  view plain copy print ?
  1. package package2;  
  2.   
  3. import package1.SuperClass;  
  4.   
  5. public class SubClass1 extends SuperClass {  
  6.     public static void main(String[] args) {  
  7.         SubClass1 sub1 = new SubClass();  
  8.         SubClass2 sub2 = new SubClass2();  
  9.         Sub1.method();  //Compile OK   
  10.         sub2.method();  //Compile Error   
  11.     }  
  12.   
  13. }  
  14. class SubClass2 extends SuperClass{  
  15.       
  16. }  
这样编译器会在sub2.method()处报错误The method clone from the type SuperClass is not visiuable。这种情况下,调用protected方法的方法所属的类是protected方法所属类的子类,但是不在同一个包中。由此我们可以想到 : 不能在一个子类中访问另一个子类的protected方法,尽管这两个子类继承自同一个父类 。

如果我们在package2中的SubClass2中重写SuperClass的method方法。

[java]  view plain copy print ?
  1. package package2;  
  2.   
  3. import package1.SuperClass;  
  4.   
  5. public class SubClass extends SuperClass {  
  6.     public static void main(String[] args) {  
  7.         SubClass sub = new SubClass();  
  8.         SubClass2 sub2 = new SubClass2();  
  9.         sub.method();  //Compile OK   
  10.         sub2.method();  //Compile OK   
  11.     }  
  12.   
  13. }  
  14. class SubClass2 extends SuperClass{  
  15.     protected void method(){  
  16.         super.method();  
  17.     }  
  18. }  
这种情况跟第一种类似,protected方法可以被同一个包中的类访问。当在SubClass2类中覆盖method()方法时,SubClass2类和SubClass1类在同一个包下,所以此protected方法对SubClass1类可见。现在应该可以理解“ 为此,必须重新定义clone方法,并将它声明为public,这样才能让所有的方法克隆对象”这句话了吧。

如果我们在一个类中调用父类对象的protected方法会怎么样?

在package1中创建父类SuperClass.java文件,里面有一个protected方法,内容如下。

[java]  view plain copy print ?
  1. package package1;  
  2.   
  3. public class SuperClass {  
  4.     protected void method(){  
  5.         System.out.println("This is a protected method in the super class .");  
  6.     }  
  7. }  

在另一个包package中创建子类SubClass.java文件,内容如下。

[java]  view plain copy print ?
  1. package package2;  
  2.   
  3. import package1.SuperClass;  
  4.   
  5. public class SubClass extends SuperClass {  
  6.     public static void main(String[] args) {  
  7.         SuperClass sup = new SuperClass();  
  8.         SubClass sub = new SubClass();  
  9.         sup.method(); //Compile Error   
  10.         sub.method();  //Compile OK   
  11.     }  
  12.   
  13. }  

这里我在SubClass继承另一个包中的SuperClass,这个SuperClass中有一个protected方法method()。在SubClass类中调用SubClass类的实例sub的method()方法,编译不会报错。而同样调用SuperClass类的实例sup的method()方法,编译报错!

protected方法不是可以被子类访问的吗?

从接触Java开始就了解Java中访问修饰符的权限可以用下面这个表格概括:

作用域
当前类
同包
子孙类(不同包)
其他
public
Y
YYY
protected
Y
Y
Y
N
default
Y
Y
N
N
private
Y
N
N
N
default为不写访问修饰符时。

现在必须明确的是:类SubClass确实是继承了类SuperClass(包括它的method方法),所以在类SubClass中可以调用自己的method方法。但类SuperClass的protected方法对其不同包子类SubClass来说,是不可见的。

注意protected访问修饰符的规则及其微妙。

深入理解Java访问修饰符:封装的艺术 在面向对象编程(OOP)中,封装(Encapsulation) 是一个核心概念,它通过隐藏对象的内部实现细节并仅暴露必要的接口来提高代码的安全性和可维护性。Java 提供了 访问修饰符(Access Modifiers) 来实现封装,控制类、变量、方法和构造函数的访问权限。 本文将全面解析 Java 的四种访问修饰符(public、protected、default 和 private),并结合实际代码示例、最佳实践和常见面试题,帮助读者深入理解其使用场景和设计哲学。 阅读详情

相关推荐

40、深入理解 C++ 中的 Protected 访问修饰符

本文深入探讨了C++中`protected`访问修饰符的作用及其在类设计中的应用,包括其定义、使用场景、与其他访问修饰符的比较以及最佳实践。同时,通过多个实际案例展示了`protected`成员在继承、封装和多态中的重要性,并讨论了常见的误区和未来发展方向。

yellow的专栏 756

ts 中类的修饰符

ts 三种修饰符

gu2022_3_5_21_23的博客 822

Java访问修饰符与封装性的深入理解

本文通过Java代码示例,深入探讨了访问修饰符(默认、public、private)在类成员访问中的作用和限制。通过对比不同包和类中对成员变量的访问,展示了封装性的核心概念以及如何在实际编程中应用。...

weixin_29215509的博客 447

访问修饰符的详解与应用

基本介绍: java提供的四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围) 1.公开级别:用public 修饰,对外公开; 2.受保护级别:用protected修饰,对子类和同一个包中的类公开; 3.默认级别:没有修饰符号,向同一个包中的类公开; 4.私有级别:private修饰,只有类本身可以访问,不对外公开; 访问修饰符的访问范围: 访问级别 访问控制修饰符 同类 同包 子类 不同包 公开 public √ √ .

m0_58717794的博客 763

深入理解Java的继承与类访问修饰符

本文深入探讨了Java编程语言中继承机制的核心概念,特别是所有Java类都隐式继承自Object类的事实。同时,文章还介绍了类访问修饰符的使用,包括public和包私有访问权限,并详细解释了在方法参数与实例变量同名时,如何利用this引用解决变量作用域的冲突。

weixin_42393362的博客 265

TS的访问修饰符有哪些

如果你和我一样是从强类型语言(如C++、C#、Java)转过来的,相信你会一眼就知道是什么。

闻人放歌的三寸青草园圃 441

当windows安装git时出现以下错误提示

Windows安装Git时出现多个系统配置设置失败错误(exit code 4294967295),提示包括无法设置textconv、LFS过滤器和SSL等配置项。关键问题在于scalar.exe版本不兼容,系统提示"该版本的scalar.exe与你运行的Windows版本不兼容"。解决方案是检查程序版本是否正确,下载与Windows系统兼容的正确版本重新安装即可。

沧澜的博客 1875

18-ts中类成员的访问修饰符

TypeScript中的访问修饰符 ​ 访问修饰符指的就是可以在类的成员前通过添加关键字来设置当前成员的访问权限。typescript中主要有三个访问修饰符: ​ 1、public: 公开的,默认 任何对象在任何地方都可以进行访问 ​ 2、private: 私有的, 只能在当前类中进行访问 ​ 3、 protected: 受保护的,这能在当前类或者子类中进行访问 enum Color{ red, yellow, blue } class Car{ // 如果不加访问修饰

m0_46163764的博客 1089

深入解析安卓性能分析工具systrace/atrace的使用技巧与实战场景

本文深入解析了安卓性能分析工具systrace/atrace的核心使用技巧与实战场景。文章澄清了环境搭建的常见误区,详细拆解了命令参数,并通过列表卡顿、启动优化等具体案例,手把手指导开发者利用这些工具精准定位性能瓶颈,提升应用流畅度。

yyy34的博客 239

利用ArcGIS的模型构建器实现批量投影栅格和批量克里金插值

博主要批量投影几百个栅格,但是ArcGIS中的投影栅格的批处理工具需要手动一条条设置参数,还是麻烦,因此学习了使用模型构建器(ModelBuilder)来批量投影栅格,可以导入需投影栅格的文件夹,然后迭代投影,并按栅格原名逐个输出到指定目录。 1.在工具箱里构建模型 在arctool box里右键点击空白处,选择【添加工具箱】,点击ArcGIS默认工作目录的工具箱进行添加,然后Toolbox就会被添加到ArcToolbox页面,右键点击Toolbox,选择“新建”-“模型” 2.编写模型 (1).

qq_36958801的博客 1万+

访问修饰符定义与作用(含代码演示)

在上述示例中,演示了不同访问修饰符的使用和作用。每个变量和方法都使用了不同的访问修饰符,以控制它们的访问范围。通过使用适当的访问修饰符,可以实现封装、隐藏和限制对类和成员的访问,提高代码的安全性、可维护性和可重用性。访问修饰符是一种关键字,用于控制类、属性、方法和构造函数的访问范围。和默认(不使用任何修饰符)。

DevangLic Blog 442

哈工大2021年秋季学期数据结构期末试题

因为考完试没有收演草纸,所以题中数据与考试差距不大。选项顺序可能略有差异;选择第5题希尔排序的序列数据是后编的;简答第3题B-树的插入序列顺序可能不同,但是考察的点是一样的。其他题的数据基本可以保证和原题一样。 一、选择题 111.以下代码的时间复杂度是 for(int k=1;k<=n;k++) for(int j=1;j<=n;j++) count++; A.O(n)       B.O(nlogn) &

Castria的博客 4271

c# 访问修饰符的理解

c# 访问修饰符有: 1.public:所有对象都可以访问; 2.private:对象本身在对象内部可以访问; 3.protected:只有该类对象及其子类对象可以访问 4.internal:同一个程序集的对象可以访问; 5.protected internal:访问限于当前程序集或派生自包含类的类型。 比如说:一个人A为父类,他的儿子B,妻子C,私生子D(注:D不在他家里) 如果我们给A的事情增加修饰符: public事件,地球人都知道,全公开 protected事件,A,B,D知道(A和他的所有

LiCcCcCcccCcc的博客 251

《自然语言处理实战入门》文本分类 ---- 使用词向量与SVM 进行文本分类

文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。

shiter编写程序的艺术 2388

STM32Cube高效开发教程<高级篇><FreeRTOS>(十八)-----软件定时器

一、 软件定时器概述声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(高级篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。在FreeRTOS中,自动创建的任务有空闲任务和定时器服务任务。FreeRTOS可以通过定时器服务任务提供软件定时器功能。在某些对定时精度要求不太高,无须使用硬件定时器的情况下,我们可以使用FreeRTOS的软件定时器。

我的博客 156

java中访问修饰符的理解

JAVA中的四种访问修饰符 1.private private ---私有的 表示被修饰的类、属性、方法只允许由此类的对象调用,而不允许其他类、其他包或者子类访问。 相当于每个人都有自己的私人密码,这个密码是不允许被别人访问的,包括自己的亲人、同学、朋友,可提高安全性级别 2.default default ---当没有写任何修饰符时默认 即不加任何访问修饰符,通常称为“默认访问模式...

JEROCHAN的博客 1087

使用Spring Cloud实现银行核心系统的案例示例

以下是一个基于Spring Cloud的银行核心业务系统实现方案,涵盖架构设计、关键模块实现与生产级部署方案。该系统设计满足金融级高可用、强一致性和监管合规要求。

银行信息系统应用架构详解 1172

关于Java中public、protected、default、private四种访问修饰符的理解

近期重新梳理了下Java基础知识,下面是我自己关于Java的四种访问修饰符的理解

Xiao Miao的博客 1703

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java访问修饰符相关理解

访问修饰符(修饰类,成员属性,成员方法) public 所有类 所有包 private 私有的(只有当前类中可以使用) 默认不写: 范围(只能在当前类和同包中的其他类中使用,其他包和子类中不可用) protected: 范围(只能在当前类和同包中的其他类以及子类中使用,其他包不可用) ...

destination00的博客 190

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java:访问修饰符的理解与认识

一,访问修饰符的种类 java提供四种访问控制修饰符号控制方法和属性的访问权限,分别是public,protected,默认,private四种,每种访问修饰符定义的方法或者属性都能够限制其适用范围,具体参考下表。 二,使用的注意事项 ①,修饰符可以用来修饰类中的属性,方法以及类 ②,只有默认的和public才能修饰类!并且遵循上述访问权限的特点。 ③,因为没有学习继承,因此关于在子类中的访问权限,学到子类后,再来做补充。 ④,方法的访问规则和属性完全一样。 三,代码示例 访问修饰符在属性.

m0_58229878的博客 624

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

访问修饰符 自我理解

访问修饰符详解,public,protected,private以及默认修饰符。

_川江的博客 585

java 访问修饰符范围_彻底理解Java中的访问修饰符

一道简单的题目看到这个标题时可能很多朋友会嗤之以鼻,难不成简单的访问修饰符还有什么新花样吗?别急,麻烦您先看一下这个简单的题目。OverrideTrap.png这无非就是一个简单运行时多态问题,众所周知,Java的多态分为编译时多态和运行时多态两种。其中, 编译时多态主要指方法的重载,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。 运行时多态有三个条件:继承方法重写(覆盖)...

weixin_29450147的博客 212

static、继承、访问修饰符的理解

一、static 1.static修饰的代码块 在整个程序执行期间就执行一次,为啥呢,因为在类在加载的时候就只为static修饰的代码块分配一次空间,static修饰的代码块有助于优化程序性能。 2.static修饰的变量 1.静态变量在内存中只有一块内存,供所有实例对象所共享,而实例变量(就是没有被static修饰的变量)在每次创建对象的时候都会被分配一次内存 2.静态变量是属于类的,只有被static修饰的方法才能使用,不能够修饰局部变量。 3.static修饰的方法 static修饰的方法不能被实例对

m0_46097810的博客 178

对java中访问修饰符等的理解

访问修饰符的理解

2401_82484471的博客 225

深入理解 C# 中的 `internal` 访问修饰符

internal。

波波诸葛伟 1562
上一篇: [引用区别] c++中引用与java中引用区别
下一篇: java import、package作用与用法以及与C include的区别
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值