首页
学习
活动
专区
圈层
工具
发布

Effective Java(第三版)——条目十五:使类和成员的可访问性最小化

该语言提供了许多强大的元素,可以使用它们来设计类和接口。本章包含指导原则,帮助你充分利用这些元素,使你的类和接口是可用的、健壮的和灵活的。...访问控制机制(access control mechanism)[JLS,6.6]指定了类,接口和成员的可访问性。...实体的可访问性取决于其声明的位置,以及声明中存在哪些访问修饰符(private,protected和public)。 正确使用这些修饰符对信息隐藏至关重要。...对于成员(属性、方法、嵌套类和嵌套接口),有四种可能的访问级别,在这里,按照可访问性从小到大列出: private——该成员只能在声明它的顶级类内访问。...package-private——成员可以从被声明的包中的任何类中访问。从技术上讲,如果没有指定访问修饰符(接口成员除外,它默认是公共的),这是默认访问级别。

1.2K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java 中的访问修饰符-Java快速入门教程

    概述 在本教程中,我们将介绍 Java 中的访问修饰符,这些修饰符用于设置类、变量、方法和构造函数的访问级别。...简单地说,有四个访问修饰符:public, private, protected and default(无关键字)。 在我们开始之前,让我们注意顶级类只能使用public或default访问修饰符。...4. private 任何带有 private 关键字的方法、属性或构造函数只能从同一类访问。这是限制性最强的访问修饰符,也是封装概念的核心。...Let's note different package. } } 专用文章详细介绍了在字段、方法、构造函数、内部类以及同一包或不同包中的可访问性中使用的关键字。 6....我们可以看到,一个类,无论使用什么访问修饰符,总是可以访问它的成员: 修饰语 类 同包 继承 所有包 public Y Y Y Y protected Y Y Y N default Y Y N N private

    19900

    2023最新java面试题库

    我们可以使用 Serializable 接口来启用类的可序列化性,使用 Java 的序列化 API。序列化是一种将对象状态保存为字节序列的机制,而反序列化是一种从字节序列还原对象状态的机制。...序列化输出保存对象的状态以及有关对象类型及其字段类型的一些元数据。 我们应该知道可序列化类的子类型也是可序列化的。...但是,如果我们想使一个类可序列化,但它的超类型是不可序列化的,我们必须做两件事: 1)实现可序列化接口 2)确保超类中存在无参数构造函数 扩展阅读 Java 序列化使用指南 什么是 NullPointerException...Java 中有四个访问修饰符: private-私有 default-默认(包) default-保护 public-公共 私有修饰符可确保在类外部无法访问类成员。...它使类和类成员可以在所有包和所有类中访问。

    22910

    JDKJava 17 马上来袭,看看带来哪些新特性?

    此功能的目标包括:通过使模式出现在案例标签中,来扩展switch表达式和语句的表现力和应用,在需要时放宽switch的 historical null-hostility,并引入两种模式:guarded...该计划的目标包括提高 JDK 的安全性和可维护性,并鼓励开发人员从内部元素迁移到标准 API。 删除远程方法调用 (RMI) 激活机制,同时保留 RMI 的其余部分。...该提案的目标包括允许类或接口的作者控制哪些代码负责实现它,提供比访问修饰符更具声明性的方式来限制超类的使用,并通过为模式的详尽分析提供基础来支持模式匹配的未来方向。...增强的伪随机数生成器将为伪随机数生成器(PRNG)提供新的接口类型和实现,包括可跳转的 PRNG 和额外的一类可拆分 PRNG 算法 (LXM)。...保留类java.util.Random的现有行为。 JDK 17 等 LTS 版本每三年发布一次,上一个LTS 版本 JDK 11 于 2018 年 9 月发布。

    1.2K30

    Java之Java关键字及其作用

    所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。 2....否则,Truck类将是独立的;它可以声明其他方法和变量,并扩展另一个类。 一个类可以实现多个接口。 import import关键字使一个包中的一个或所有类在当前Java源文件中可见。...所有类成员的默认访问范围都是package访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。

    1.2K10

    有效提高java编程安全性的12条黄金法则

    Java安全性规则1:编写简单而强大的Java代码 漏洞喜欢隐藏在复杂代码中,因此在不牺牲功能的情况下使代码尽可能简单。在代码中公开尽可能少的信息,隐藏实施细节,支持可维护和安全的代码。...下面三个技巧将大大有助于编写安全的Java代码: 充分利用 Java的访问修饰符。为类,方法及其属性声明访问级别,可以设为private的所有内容都应该为private。  避免过度使用反射和内省。...将类名与字符串进行比较容易出错,并且很容易导致名称空间冲突。 始终定义尽可能小的API和接口。解耦组件并使它们在尽可能小的区域内交互。即使您的应用程序的某个区域出现漏洞,其他区域也将是安全的。 ...Java安全性规则2:避免使用Java自带的序列化 序列化接受远程输入,并将其转换为完全赋值的对象。它省去了构造函数和访问修饰符,并允许未知数据流成为JVM中的运行代码。...对其进行监视,并防止服务器资源过度使用,以及更多的自动化的应急响应方案。 Java安全规则12:考虑使用Java安全管理器 Java有一个安全管理器,可用于限制正在运行的进程可以访问的资源。

    80720

    CTF笔记-1-PHP序列化与反序列化(__sleep与__wakeup)

    这里可能不理解序列化后的sex和age,这个是由访问控制修饰符导致的(访问修饰符的不同,序列化后的属性名的长度和属性名会有所不同。...举个例子: public(公有) protected(受保护) private(私有) 各访问修饰符序列化后的区别: public:属性被序列化的时候属性名还是原来的属性名,没有任何改变 protected...:属性被序列化的时候属性名会变成%00*%00属性名,长度跟随属性名长度而改变 private:属性被序列化的时候属性名会变成%00类名%00属性名,长度跟随属性名长度而改变 注:这里的%00也就是表示空字符...> 输出:O:4:"Demo":1:{s:4:"flag";s:12:"flag{aaaaaa}";} bbbbbb 一般做CTF题目时绕过的方法就是:先序列化字符串,然后使序列化后字符串中属性的个数大于真实对象中属性的个数...> 结果为:O:4:"xctf":1:{s:4:"flag";s:3:"111";} 将序列化后字符串中属性的个数由1改为2,大于真实属性个数1,即可绕过__wakeup 注:修改s(属性类型)或属性名长度也可绕过执行

    1.5K20

    【收藏篇】Java关键字 及其 更详细介绍

    所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。 2....否则,Truck类将是独立的;它可以声明其他方法和变量,并扩展另一个类。 一个类可以实现多个接口。 import import关键字使一个包中的一个或所有类在当前Java源文件中可见。...所有类成员的默认访问范围都是package访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。

    89020

    超硬核!苏州同程旅游学长给我的全面的面试知识库

    “使用”块用于获取资源并对其进行处理,然后在执行完该块后自动将其丢弃。 11、什么是序列化? 当我们想通过网络传输对象时,我们必须将对象转换为字节流。将对象转换为字节流的过程称为序列化。...为了使对象可序列化,它应该实现ISerialize接口。反序列化是从字节流中创建对象的反向过程。 12、我们可以在静态方法中使用“ this”命令吗?...不可以,因为在课外无法访问它们。 21、描述可访问性修饰符“受保护的内部”。 受保护的内部变量/方法可在同一程序集中以及从该父类派生的类中访问。...循环引用是指两个或多个资源相互依赖导致锁定条件并使资源无法使用的情况。 29、 C#.NET中的泛型是什么? 泛型用于制作可重用的代码类,以减少代码冗余,提高类型安全性和性能。...38、为什么不能为接口内的方法指定可访问性修饰符? 在接口中,我们有没有方法定义的虚拟方法。所有方法都将在派生类中被覆盖。这就是为什么它们都公开的原因。

    4K20

    【Java学习笔记之一】java关键字及作用

    访问控制 1) private 私有的 private 关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。 ...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。 2. ...12) transient 短暂 transient 关键字可以应用于类的成员变量,以便指出该成员变量不应在包含它的类实例已序列化时被序列化。

    1.2K81

    JAVA关键字及作用

    访问控制  1) private 私有的  private 关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。 ...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。 ...所有类成员的默认访问范围都是 package 访问,也就是说,除非存在特定的访问控制修饰符,否则,可以从同一个包中的任何类访问类成员。   2....12) transient 短暂   transient 关键字可以应用于类的成员变量,以便指出该成员变量不应在包含它的类实例已序列化时被序列化。

    82400

    Java创建Annotation

    正如我们稍后将看到的,注解保留的运行时选项是最常见的选项之一,因为它允许Java程序反射访问注解并基于存在的注解执行代码,以及访问与注解相关联的数据。请注意,注解只有一个关联的保留策略。...保留策略使用java.lang.annotation.RetentionPolicy枚举指定,并包含三个标准保留策略的常量。...反射API允许我们编写代码来访问对象的类、方法、字段等。...并使用此对象关联的类来获取关联的字段。接下来,我们创建String到String的Map,存储字段名和值的键值对。 随着数据结构的建立,接下来遍历类中声明的每个字段。...例如,我们可以注解每个可序列化字段而不是在接口中的方法创建一个toJsonString以及所有可以序列化的类实现此接口。它还将序列化逻辑与域逻辑分离,从域逻辑的简洁性中消除了手动序列化的混乱。

    1.9K20

    Effective-java-读书笔记之序列化

    , 就大大降低了"改变这个类的实现"的灵活性.如果你接受了默认的序列化形式, 这个类中私有的和包级私有的实例域将都变成导出的API的一部分, 这不符合"最低限度地访问域"的实践原则, 从而它就失去了作为信息隐藏工具的有效性...:它使这个类的导出API永远地束缚在该类的内部表示法上.消耗过多的空间.消耗过多的时间.会引起栈溢出.transient修饰符: 从序列化形式中省略掉实例域...., 则也必须在对象序列化上强制这种同步.不论你选择了哪种序列化形式, 都要为自己编写的每个可序列化的类声明一个显式的序列版本UID(serial version UID).除非你要破坏和所有已经存在的实例的兼容性...自从Java1.5以来, 它就不再是在可序列化的类中维持实例控制的最佳方法了.应该尽可能地使用枚举类型来实施实例控制的约束条件.但是如果这不可能做到, 或者你需要一个实现了序列化的实例受控的类, 那么你就必须提供一个...): 为可序列化的类设计一个私有的静态嵌套类(序列化代理), 它应该有一个单独的构造器, 其参数类型就是那个外围类.

    38950

    高效序列化工具Protobuf总结

    20倍至100倍 *4.减少了二义性 *5.生成了更容易在编程中使用的数据访问类 *6.支持多种编程语言 Protobuf性能分析 如下图所示,Protobuf性能相对较好...所以应该为那些频繁出现的消息元素保留[1,15]之内的标识号。 切记:要为将来有可能添加的、频繁出现的标识号预留一些标识号。...3.)指定字段规则 所指定的消息字段修饰符必须是如下之一: * required : 不可增加或删除的字段,必须初始化; * optional : 可选字段,可删除,可以不初始化;...* repeated : 可重复字段(对应C#里面的List); 4).标量数值类型 一个标量消息字段可以含有一个如下的类型——该表格展示了定义于.proto文件中的类型,以及与之对应的、在自动生成的访问类中定义的类型...这里是用一个之前编译的Person类测试的,基本的序列化与反序列化方法如图所示,还有其他的如序列化成字符串、序列化到文件等方法。

    77510

    Java基础面试题50题

    ,方法名相同,参数列表不同(参数类型和参数个数)的一种现象 1.重载与返回值类型无关 2.不能通过访问修饰符进行重载 如下是重载: public void a(int x){ x++;...Father f){ System.out.println("bbbbbb"); Son s=(Son)f; return s; } 2.重写的访问修饰符得大于等于原来的...,接口中只能有常量,用public static final修饰,默认可不写 3.抽象类有构造方法,接口没有构造方法 4.抽象类中的方法的访问修饰符可以是public,protected,默认;接口中方法的访问修饰符只能是...1)sleep是Thread类下的方法;wait是Object下的方法 2)sleep是使线程休眠,不释放锁;wait是使线程等待,释放锁 sleep让出的是cpu,如果此时代码是加锁的,那么即使让出了...,那么要求该引用类也是可序列化的。

    1.7K00

    那些年~~~我们的C#笔试内测题目

    c) 如果一个类可序列化,则它的子类和包含的各成员对象也一定可序列化 问题出在了子类,如果子类压根不能进行序列化操作,则会抛出异常 d) 标识一个类可以序列化要使用[Serializable] 2)...22) 下面不是C#中类的访问修饰符的是(AD)。...在定义内部类的时候可以使用A和D作为类的访问修饰符 23) 在C#中,下面关于结构的说法中,正确的是(C)。...S3 解析(父类中不可以访问子类受保护成员) b) 在B中可以访问S1 解析( 如果类中变量没哟访问修饰符修饰,默认访问修饰符是private) c) 在B中可以访问S2 解析(可以:因为其访问修饰符是...并简述每个原则的基本功能。 要点: n 封装:保证对象自身数据的完整性、安全性; n 继承:建立类之间的关系,实现代码复用,方便系统的扩展; n 多态:相同的方法调用可实现不同的实现方式。

    2.6K111

    Android 代码混淆规则

    ProGuard是一个免费的Java类文件收缩,优化,混淆和预校验器。它可以检测并删除未使用的类,字段,方法和属性。它可以优化字节码,并删除未使用的指令。...3.2 保留选项 -keep [,modifier,…] class_specification:指定需要保留的类和类成员(作为公共类库,应该保留所有可公开访问的public方法) -keepclassmembers...它的内容可以使用: 具体的类 访问修饰符(public、protected、private) 通配符*,匹配任意长度字符,但不含包名分隔符(.)...访问修饰符(public、protected、private) 4.1 不混淆某个类 -keep public class com.android.proguard.example.Test {...getResources().getIdentifier(name, "drawable", getPackageName()); 我们可以设置 tools:shrinkMode 为 strict 来开启严格模式,使只有确实被使用的资源被保留

    3K10
    领券