首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我们不能在Kotlin的Singleton类(对象)中使用protected access修饰符

在Kotlin中,使用protected访问修饰符可以限制只有子类可以访问该成员。然而,在Singleton类(对象)中使用protected访问修饰符是不允许的,因为Singleton类(对象)是通过其伴生对象声明的,而伴生对象在其外部类之外是无法继承的。

Singleton类(对象)是通过object关键字声明的,它在运行时只有一个实例。由于伴生对象不能被继承,因此无法创建Singleton类(对象)的子类。因此,在Singleton类(对象)中使用protected访问修饰符是没有意义的,因为没有子类可以访问它。

如果您想限制Singleton类(对象)中的成员只能在其外部类和伴生对象中访问,可以使用internal访问修饰符。internal修饰符允许在同一模块中的其他类中访问该成员,但在模块外部是不可见的。

总结起来,不能在Kotlin的Singleton类(对象)中使用protected访问修饰符,因为伴生对象无法被继承,没有子类可以访问该成员。如果需要限制访问权限,可以使用internal修饰符。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

转向Kotlin——和接口

声明 和Java没有什么两样,Kotlin声明也使用class关键字,如果只是声明一个空Kotlin和Java没有任何区别,不过定义其他成员,区别就很大了。...1、主构造器 面向对象语言在定义时候,都需要至少制定一个构造方法,如果指定构造器,编译器会默认生成一个不带任何参数构造器,这是传统面向对象语言做法。...{ inner class Student { } } People().Student() 修饰符 Kotlind修饰符一共四个:private、protected、internal...如果指定修饰符,默认全是public,这些修饰符可以用在普通,也可以用在构造器。...小结 Kotline和接口与Java本质上没有什么两样,只不过Kotlin为了体现差异,加入了一些语法糖,如接口允许函数带函数体,支持属性,不支持静态方法等。我们需要慢慢去熟悉它。

93030

Kotlin 之美

EJ 第1条:考虑使用静态工厂方法代替构造器 在实例化对象方式使用静态工厂方法相比构造器有几个好处: 工厂方法拥有名字,易于开发者理解。...Kotlin 对单例模式做了更彻底精简,简直易如反掌,可以通过 object 关键字声明一个单例同时创建一个实例,如: object singleton{//由于同时创建了实例,因此类名使用小写...EJ 第13条:使和成员可访问性最小化 封装(也称之为信息隐藏)是面向对象四大特性之一,体现在具体实现层面便是四种访问权限:private、default、protected 和 public...继承破坏了封装性,父必须暴露更多细节让子类知道(比如使用 protected 访问权限),同时子类依赖于父实现,一旦父改变,子类都会受影响。...在2018年今天我们依然无法使用或者要花很大代价才能在 Android 编程中使用,而 Kotlin 则帮助我们解决了这一瓶颈,这也是我们拥抱 Kotlin 原因之一。

2.9K20
  • 深入理解 Java 修饰符与封装:访问权限、行为控制与数据隐藏

    private: 意味着代码只能在声明内部访问。 default: 意味着代码只能在同一包访问。 protected: 意味着代码在同一包和子类可访问。...方法 } } 非访问修饰符: public class Main { // final属性不能被修改 final int y = 20; // static方法可以在创建对象情况下访问...protected 修饰符允许子类访问父成员,但不允许外部类访问。 static 变量和方法也称为 变量 和 方法。 abstract 不能被实例化,只能被继承。...一些额外说明: 可以使用多个修饰符来修饰 get 和 set 方法,例如 public、protected 和 private。 可以使用 final 修饰符来声明常量,常量不能被修改。...可以使用 static 修饰符来声明静态方法和变量,静态方法和变量属于,而不是对象。 最后 看完如果觉得有帮助,欢迎 点赞、收藏、关注

    21400

    Kotlin与Java互操作

    与Java一样,Kotlin在运行时不保留泛型,也就是对象携带传递到它们构造器类型参数实际类型,即ArrayList()和ArrayList()是不能区分。...,Kotlin 数组是型变。...静态字段 在命名对象或伴生对象时,声明 Kotlin 属性会在该命名对象或包含伴生对象包含静态幕后字段。通常这些字段是私有的,但可以通过以下方式之一暴露出来。...private 成员编译成 private 成员; private 顶层声明编译成包级局部声明; protected 保持 protected(注意 Java 允许访问同一个包其他受保护成员,...我们可以这样写 unboxBase(boxDerived(“s”)),但是在 Java 是行不通,因为在 Java Box 在其泛型参数 T 上是型变,于是 Box 并不是 Box 子类

    3.5K30

    Kotlin 程序设计》第九章 Kotlin与Java混合调用

    2 反射获取 Class 在 Java 或 Android 开发,经常会直接调用一个 Class 文件。我们在Java是直接这么调用 Xyz.class。...我们也可以通过注解@file:JvmName("MyExample")来自定义这个名。这样当前文件所有包级别函数, 将被放到一个自动生成文件名为 MyExample 。...至于为什么这么说呢,我见过一句话很形象:摊开来代码,比叠起来代码,更加一目了然。详细可以自行阅读《Effective Java》。 Kotlin默认是final类型,即每个默认不可继承。...完全兼容,与Java互操作 这是Kotlin与Scala相比,优势突出一点。我们可以在Kotlin调用现存Java代码,并且也能在Java代码顺利调用Kotlin代码。...因为Java任何应用都可以为null,但是在Kotlin是默认不可为null,这使得Kotlin对来自Java对象要求严格空安全是不现实

    1.6K50

    《Kotin 极简教程》第7章 面向对象编程(OOP)(2)《Kotlin极简教程》正式上架:

    new方式来构建对象Singleton singleton2 = new Singleton(); //error, cannot private access 最后提供一个public获取当前唯一实例静态方法...7.9.2 object对象 Kotlin没有 静态属性和方法,但是也提供了实现类似于单例功能,我们可以使用关键字 object 声明一个object对象: object AdminUser {...同样我们只能通过名称来直接访问object,不能使用对象实例引用。...object via reference 我们在Java通常会写一些Utils,这样我们Kotlin中就可以直接使用object对象: object HttpUtils { val...密封 7.10.1 为什么使用密封 就像我们为什么要用enum类型一样,比如你有一个enum类型 MoneyUnit,定义了元、角、分这些单位。

    1.6K20

    kotlin 之单例详解

    使用object修饰,是哪种类型单例模式 这里我们先回顾一下java六种单例模式 1....,能够减少内存开销 缺点:线程不安全,只能在单线程中使用,多个线程访问时,会产生多个对象, 3.懒汉式同步锁 public class LazyMan { private static...但是JVM即时编译器存在指令重排序优化,也就是说上面的第二步,第三步顺序是 确定一旦2,3,顺序乱了,这个是有一个线程调用了方法,结果虽然是非null,但是未初 始化,所以直接报错。...解析:object 单例是什么类型单例 这里我们直接将kotlin代码转为Java 代码进行查看。...kotlin代码如下 转为Java之后 我们可以看到,该Model转为Java代码之后,它是一个饿汉式单例。所以使用object采用是饿汉式单例。

    66530

    Kotlin入门(14)继承那些事儿

    上一篇文章介绍了对成员声明方式与使用过程,从而初步了解了成员及其运用。...那么Kotlin体系参照Java世界也给出了四个开放性修饰符,按开放程度从高到低分别是: public : 对所有人开放。Kotlin、函数、变量不加开放性修饰符的话,默认就是public类型。...其实也不复杂,open控制某个对象访问权限,只决定该对象能否繁衍开来,说白了,就是公告这个家伙有没有资格生儿育女。...至于那四个开放性修饰符,则是用来限定允许访问某对象外部范围,通俗地说,就是哪里男人可以娶这个美女。...其次,Kotlin除了常规三个开放性修饰符public、protected、private,另外增加了修饰符internal表示只对本模块开放。

    1.6K50

    设计模式-单例模式

    这种模式涉及到一个单一,该类负责创建自己对象,同时确保只有单个对象被创建。这个提供了一种访问其唯一对象方式,可以直接访问,不需要实例化该类对象。 注意: 1、单例只能有一个实例。...2、单例必须自己创建自己唯一实例。 3、单例必须给所有其他对象提供这一实例。 正文: 注:由于单例模式是经常用到,这里就不提供demo了(懒。。。)...对,饿汉式在Kotlin,只需要一个object修饰符就行了,这就是Kotlin非常厉害地方。...这种方式只能在1.5之后使用。...当我们应用初始化时,getInstance没有被调用,就没有实例对象,那就满足了懒汉式。当我们调用getInstance时候,Java虚拟机为了保证加载安全性,所以这里就保证了线程安全。

    38730

    第2章 Kotlin 语法基础第2章 Kotlin 语法基础

    通常一门编程语言基本构成如下图所示 ? 编程语言基本构成 本章我们学习 Kotlin语言基础语法。 2.1 变量和标识符 变量(数据名称)标识一个对象地址,我们称之为标识符。...Kotlin修饰符关键字主要分为: 修饰符、访问修饰符、型变修饰符、成员修饰符、参数修饰符、类型修饰符、函数修饰符、属性修饰符等。...这些修饰符如下表2-1所示 表2-1 Kotlin修饰符 修饰符 修饰符 说明 abstract 抽象 final 不可被继承final enum 枚举 open 可继承open annotation...lateinit 延迟初始化 访问权限修饰符 访问权限修饰符 说明 private 私有,仅当前可访问 protected 当前以及继承该类可访问 public 默认值,对外可访问 internal...说明 const 常量修饰符 参数修饰符 参数修饰符 说明 vararg 变长参数修饰符 noinline 内联参数修饰符,有时,只需要将内联函数部分参数使用内联Lambda,其他参数不需要内联

    2.7K20

    Kotlin安卓开发学习(2)

    时,我们不需要像Java那样定义 get/set 方法,在调用对象属性时也不需要调用get/set方法来使用属性。...因此,如果我们需要一个可以被继承,需要在前添加 修饰符”open“: open class Person { … } 加上open关键字之后,我们就是在主动告诉Kotlin编译器,Person...= 0 } 与Java不同,Kotlin中继承需要在继承后面加上一对括号,为什么需要加上括号,这就涉及了Kotlin主构造函数和次构造函数概念。...因为接口中定义了待实现函数,所以我们使用接口后必须对函数进行实现。Kotlin我们使用override关键词来重写或者实现接口中函数。...Java和Kotlin函数可见性修饰符对照表 修饰符 Java Kotlin public 所有可见 所有可见(默认) private 当前可见 当前可见 protected 当前、子类、同一包路径下可见

    38520

    重学 Kotlin —— object,史上最 “快” 单例 ?

    作为一名 Kotlin 老铁粉,我可能在博客里不止一次表达过对 Kotlin 态度。 都 2020 了,作为一名安卓开发者,再不会 Kotlin ,真的说不过去了!...下面来看看 伴生对象 。 伴生对象 你可以回想一下,你在 Kotlin使用过 static 关键字吗?答案肯定是没有。...通常我们可以在顶层文件中直接定义常量和顶层函数,但有的时候我们的确需要在定义静态常量或函数,这样显得更加直观。这就是 伴生对象 应用场景。...再回想一下前面说过, object 其实我们可以把它理解成 定义一个并创建一个实例 。 伴生对象仍旧符合这一语义。 在 Java 如何调用伴生对象呢?...和 Java 匿名内部类一样,对象声明也可以访问外部变量。 对象表达式应该是 object 最朴实无华使用方式了。 最后 看到这里,你应该已经完全掌握了 object 关键字本质。

    3K20

    Kotlin Primer·对象(上)

    ,它们默认属于公有字段,可以直接使用,如果你希望别的访问到这个变量,可以用private修饰。...4.3 修饰符 点开 IDEA,工程目录 out 列表,看到我们写完 Person被编译为 class 文件后样子。 ?...为每个加了final也就是说,在 Kotlin 默认每个都是不可被继承。如果你确定这个是会被继承,那么你需要给这个添加 open 修饰符。...4.3.2 internal 修饰符 写过 Java 同学一定知道,Java 有三种访问修饰符,public/private/protected,还有一个默认包级别访问权限没有修饰符。...4.4 一些特殊 4.4.1 枚举Kotlin ,每个枚举常量都是一个对象。枚举常量用逗号分隔。 例如我们写一个枚举 Programer。

    66720

    Java 面试整理

    与StringBuffer一样都继承和实现了同样接口和,方法除了没使用synch修饰以外基本一致,不同之处在于最后toString时候,会直接返回一个新对象。...IO(BIO)是面向流,NIO是面向缓冲区 BIO:Block IO 同步阻塞式 IO,就是我们平常使用传统 IO,它特点是模式简单使用方便,并发处理能力低。...被其修饰、属性以及方法只能被本身方法及子类访问,即使子类在不同也可以访问。 default:即不加任何访问修饰符,通常称为”默认访问模式”。该模式下,只允许在同一个包中进行访问。...为什么 24、说一说你对 java.lang.Object 对象 hashCode 和 equals 方法理解。在什么场景下需要重新实现这两个方法。...Set: Set对象按特定(HashCode)方式排序,并且没有重复对象,Set主要有以下两个实现: HashSet: HashSet按照哈希算法来存取集合对象,存取速度比较快。

    39410

    Java 小白成长记 · 第 5 篇《Java 是如何实现封装 — 图解访问修饰符

    ❞ 在第一篇文章 Java 小白成长记 · 第 1 篇《万物皆对象我们就已经了解到,面向对象具有四大基本特点: 「抽象」:对同一对象共同属性和行为进行概括,形成「(class)」 。...「封装最主要能在我们能修改自己实现代码,而不用修改那些调用我们代码程序片段」。 适当封装可以让程序更容易理解与维护,也加强了程序安全性。...Java 是如何实现封装 上文我们提到,要访问某个被封装,必须通过严格访问控制,于是 Java 就为此设计了严格「访问修饰符」(access specifier)用于修饰被封装访问权限...访问修饰符详解 掌握了包概念后,我们再回到本文主题。上文我们说过:这四个访问修饰符都可以用来修饰字段或方法。...也就是说如果 Java 访问权限修饰符 public,protected和 private位于某个字段名和方法名之前,就可以控制它所修饰对象

    55320

    钻钻 “单例” 牛角尖

    就一条基本原则,单例对象只会被初始化一次。在 Java 我们可以说在 JVM 只存在该类唯一一个对象实例。在 Android 我们可以说在程序运行期间,该类有且仅有一个对象实例。...,保证不能在外部新建对象。...饿汉式在加载时期就已经初始化实例,由于加载过程是线程安全,所以饿汉式默认也是线程安全。它缺点也很明显,我真正需要单例对象时机是我调用 getInstance() 时候,而不是加载时期。...单例其实也是饿汉式一种,钻牛角尖的话,基本可以满足大部分需求。...吹毛求疵谈了谈单例模式,可以看见要完全保证单例还是有很多坑点。在开发并没有必要钻牛角尖,例如 Kotlin 默认提供单例实现就是饿汉式而已,其实已经可以满足绝大多数情况了。

    45120

    Kotlin学习笔记

    ) joinToString(list) joinToString(list, prefix = "# ") 1.7 顶级函数和属性(静态) 在 Java 我们需要把函数和属性放在一个,在 Kotlin...我们可以把某个函数或属性直接放到某个 Kotlin 文件,把这样函数或属性称之为 顶级函数或属性。...因为 JVM 虚拟机只能执行代码,所以 Kotlin 会生成一个名叫 JoinKt ,并且顶级函数是静态,所以可以在 Java 这样调用顶级函数: JoinKt.joinToString(...注意:虽然 Kotlin 允许在函数内部定义函数,但是不要嵌套太深,否则会导致可读性太差 1.11 访问修饰符 访问修饰符如下: 成员访问修饰符: 只有 ‘’protected‘’ 对应 ‘’Kotlin...内部类 在 Kotlin 内部类默认是静态( Java 与此相反),持有外部类引用: class OuterClass { //在 Kotlin 内部类默认是静态持有外部类引用

    1.9K30

    Kotlin初探

    如果我们方法体仅仅是打印字符串,并不返回值则: Unit就类似我们javavoid,即没有返回值,此时我们可以省略 对于函数体,方法或者等和java一样也有一些修饰符,如下 abstract /.../仅在同一个文件可见 protected //同一个文件或子类可见,不可修饰 public //所有调用地方都可见 internal //同一个模块可见,若不加修饰符,则默认为该修饰符...() copy() 通过数据你会看到Kotlin简洁性,我们创建一个Staff,有String类型name,position和泛型T(使用泛型仅仅是为了在Kotlin接触以下泛型) java...10 扩展 使用 11 代理 12 伴生对象 伴生对象(companion object )类似于java静态关键字static。...在Kotlin没有这个关键字,而是伴生对象,具体用法 使用的话直接People.ID。 13 单例模式 在Kotlin使用object修饰时候,该类是单例对象

    1.6K20

    Kotlin 上手记 —— 变量、函数和类型

    Kotlin 变量、函数和类型 先看原文章:https://kaixue.io/kotlin-basic-1/ 思考题 1. 子类重写父 override 函数,能否修改它可见性?...emmm,先看看可见性修饰符是哪些吧~ 修饰符 成员 顶层声明 public(默认) 所有地方可见 所有地方可见 internal 模块内可见 模块内可见 protected 子类可见 ---...private 可见 文件可见 就这么四种可见性,经过真正尝试,是可以将子类可见性放开,比如就是说,父可见性是 protected,子类同样可以是 protected,或者改写成 public...as 是强转关键字,如果强转类型操作是正确当然没问题,但如果强转成一个错误类型,程序就会抛出一个异常。需要进行安全强转,Kotlin 在设计上考虑到了优雅处理强转出错情况,就是使用 as?...使用 Android Studio 创建一个基于 Kotlin 新项目(Empty Activity),添加一个新属性(类型是非空 View),在 onCreate 函数初始化它。

    64320

    Kotlin 对象介绍

    介绍:在Kotlin可以包含:构造函数和初始化代码块,函数,属性,内部类,对象声明....:abstract) 介绍:抽象是面向对象编程特征之一.在Kotlin之中申明抽象或者函数使用关键字abstract 定义概念和java 抽象和抽象方法一样.不用进行具体实现....但是已经有嵌套了.为什么还有一个内部类? 因为内部类会带有一个对外部类对象引用.所以内部类是可以直接访问外部类属性和函数....只是Kotlin必须使用object关键字而已 修饰符 介绍:修饰符主要分为两个种类,一种是类属性修饰符(classModifier),一种是访问权限修饰符(accessModifier) 类属性修饰符...添加标注之后就可以被继承了 annotation 注解 访问权限修饰符:标注或者属性访问权限 关键字 介绍 private 私有,仅当前或同一个文件可访问 protected 保护,在同一个或者子类之中可访问

    20330
    领券