首页
学习
活动
专区
工具
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的,这些修饰符可以用在普通的类中,也可以用在构造器中。...小结 Kotlin中的类e和接口与Java中的本质上没有什么两样,只不过Kotlin为了体现差异,加入了一些语法糖,如接口允许函数带函数体,支持属性,不支持静态方法等。我们需要慢慢去熟悉它。

93330

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 修饰符来声明静态方法和变量,静态方法和变量属于类,而不是对象。 最后 看完如果觉得有帮助,欢迎 点赞、收藏、关注

    26100

    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的类采用的是饿汉式单例。

    68230

    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虚拟机为了保证类加载的安全性,所以这里就保证了线程安全。

    39230

    第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 当前类、子类、同一包路径下的类可见

    38920

    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。

    67020

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

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

    3.3K20

    钻钻 “单例” 的牛角尖

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

    45520

    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按照哈希算法来存取集合中的对象,存取速度比较快。

    40210

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

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

    56720

    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就类似我们java中的void,即没有返回值,此时我们可以省略 对于函数体,方法或者类等和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 函数中初始化它。

    64520

    Kotlin 类和对象介绍

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

    20930
    领券