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

scala中的伴生类和伴生对象

伴生类和伴生对象 设计初衷 由于static定义的类和对象破坏了 面向对象编程的规范完整性,因此scala 在设计之初就没有static关键字概念,类相关的静态属性都放在伴生对象object中。...其中伴生类和伴生对象需要同名。 在Scala里,类和伴生对象之间没有界限——它们可以互相访问彼此的private字段和private方法。...创建语法 伴生对象中的属性可以直接使用类名进行调用;伴生类中的属性,需要先实例化对象,才能够进行调用。 没有class,只有object则是单例模式类。...scala中伴生类&伴生对象的语法如下: class AssociatedDemo { val a:Int = 10; var b:Int = 2; } object AssociatedDemo...()).a); } } 输出结果: 伴生对象变量:变量1 伴生类变量:10 apply() apply()是一个语法糖,直接调用类(对象)名称时候,默认执行的是该类(对象)的apply()

90500

解析scala的伴生类和伴生对象所属类

@ 目录 说在前面 运行原理 代码体现 解析 说在前面 scala是纯面向对象的语言,C是纯面向过程的语言,Java就是面向过程+面向对象的语言。...在说到伴生对象之前,要先说到java的static关键字,static关键字修饰的变量、方法可以使类对象共享,而非某个对象单独拥有,所以是通过类名.变量名/方法名去调用。...而这违背了scala面向对象的初衷,因为这没有通过对象去调用。...Scala是纯面向对象的,去除了java中的static关键字,通过伴生对象模拟static的效果(类名.变量名/方法名) 伴生对象 伴随着某个类产生的一个对象 当我们对源文件进行编译之后,默认会生成两个字节码文件...,一个是伴生类,另一个是伴生对象所属类 真正的伴生对象是伴生对象所属类中创建的单例对象 如果不想默认生成伴生类,可以手动生成,要求伴生类名称和伴生对象名称一致 所以在scala程序中,如果要想实现static

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

    原 荐 Scala的面向对象

    2)scala中的类同样通过class来进行声明。     3)scala中的类同样可以具有成员变量和成员方法。     4)scala中的类同样可以通过new关键字来创建出对象。     ...2)单例对象需要通过object关键字来声明。     3)一个单例对象可以单独存在,也可以绑定到一个类上。     ...5)当一个单例对象和某个类写在同一个源文件中且共享同一个名字时,他们就产生了一个绑定的关系。此时单例对象称为该类的伴生对象。类称为该对象的伴生类。     ...6)类和他的伴生对象可以互相访问其私有成员。     7)以伴生的方式为类增加静态成员成为了可能。     8)单例对象不能new,因此也没有构造参数。     ...val arr = Array[String](); 上一篇:Scala中的集合类型

    853130

    Scala:面向对象、Object、抽象类、内部类、特质Trait(二)

    Scala:面向对象、Object、抽象类、内部类、特质Trait 学习目标 掌握scala类与object的用法 掌握继承的用法 掌握trait(特质)的用法 1....这个object称为伴生对象,这个class称为伴生类 伴生对象必须要和伴生类一样的名字 伴生对象和伴生类在同一个scala源文件中 伴生对象和伴生类可以互相访问private属性 示例 示例说明 参考代码...伴生对象也不可以访问 示例 示例说明 定义一个Person类,包含一个name字段 定义Person类的伴生对象,定义printPerson方法 测试伴生对象是否能访问private[this]权限的成员...如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。...抽象类 和Java语言一样,scala中也可以定义抽象类 12.1 定义 如果类的某个成员在当前类中的定义是不包含完整的,它就是一个抽象类 不完整定义有两种情况: 方法没有方法体(抽象方法) 变量没有初始化

    88110

    02.Scala:面向对象、Object、抽象类、内部类、特质Trait

    Scala:面向对象、Object、抽象类、内部类、特质Trait 学习目标 掌握scala类与object的用法 掌握继承的用法 掌握trait(特质)的用法 1....这个object称为伴生对象,这个class称为伴生类 伴生对象必须要和伴生类一样的名字 伴生对象和伴生类在同一个scala源文件中 伴生对象和伴生类可以互相访问private属性 示例 示例说明 参考代码...伴生对象也不可以访问 示例 示例说明 定义一个Person类,包含一个name字段 定义Person类的伴生对象,定义printPerson方法 测试伴生对象是否能访问private[this]权限的成员...如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。...抽象类 和Java语言一样,scala中也可以定义抽象类 12.1 定义 如果类的某个成员在当前类中的定义是不包含完整的,它就是一个抽象类 不完整定义有两种情况: 方法没有方法体(抽象方法) 变量没有初始化

    1.2K10

    Scala学习二-面向对象

    一个class和obect具有相同的名字,这个object称为伴生对象,这个class称为伴生类 注意: 伴生对象必须要和伴生类一样的名字 伴生对象和伴生类在同一个scala源文件中 伴生对象和伴生类可以相互访问...()= println(s"猴子爱吃${eat.foodName}") } //定义伴生对象,用来保存食物香蕉,注意这个对象中的成员是静态变量 object Monkey{...Scala代码中可以在子类中使用override来重写父类的成员,也可以使用super来引用父类的成员.可以使用override来重新一个val字段。...asInstanceOf:将对象转换为指定类型 2.getClass/classOf:如果要求精确地判断出对象的类型就是指定的数据类型,那么就只能使用 getClass 和 classOf...如果要求精确地判断出对象的类型就是指定的数据类型,那就只能使用getClass和classOf来实现 getClass和classOf getClass可以精确获取对象的类型 classOf[类名]可以精确获取数据类型

    89321

    scala 学习笔记(04) OOP(上)主从构造器私有属性伴生对象(单例静态类)apply方法嵌套类

    三、static成员/伴生对象Object/apply方法 scala里并没有static关键字,要达到类似的效果,可以借助object对象,object天然是singleton模式,比如下面的代码:...= { println("apply in Object People") new People(name) } } 后面的object People称为class People的伴生对象...= People("jimmy") println(p.name) People.whoami 这里我们没有用new关键字来创建对象,而是"隐式"调用了伴生对象的静态方式apply,以下是输出结果...: apply in Object People main constructor in Class People jimmy I am a people 伴生对象+apply方法,这是scala中经常使用的一个技巧...从object的使用上,还可以看出静态方法的调用上scala与java的不同,java中静态方法即可以用"类名.静态方法()",也可以用"对象实例.静态方法()"来调用,说实话,有点不太讲究,而Scala

    92680

    C++对象成员的引用 | 对象成员引用

    C++通过对象名和成员运算符访问对象中的成员 C++不仅可以在类外引用对象的公用数据成员,还可以调用对象的公用成员函数,但同样必须指出对象名,应该注意所访问的成员是公用的还是私有的,只能访问public...stu.number=101; //假设num已定义为公用的整型数据成员 表示将整数101赋给对象stu中的数据成员number,其中.是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员...访问对象中成员的一般形式为  对象名. 成员名 C++在类外只能调用公用的成员函数,在一个类中应当至少有一个公用的成员函数,作为对外的接口,否则就无法对对象进行任何操作。...C++通过指向对象的指针访问对象中的成员 C++可以通过指针引用结构体中的成员,用指针访 问对象中的成员的方法与此类似。...在C++中,如果为一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已,因此完全可以通过引用变量来访问对象中的成员。

    2.1K64

    大数据利器--Scala语言学习(基础)

    1、Scala基本的程序结构说明 scala //对 scala 的基本的程序结构说明 //1. object 是一个关键字,表示一个伴生对象 //2....1) Scala 中伴生对象采用 object 关键字声明,伴生对象中声明的全是 “静态“内容,可以通过伴生对象名称直接调用。...2) 伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。...3) 伴生对象中的属性和方法都可以通过伴生对象名直接调用访问 4) 从语法角度来讲,所谓的伴生对象其实就是类的静态方法和静态变量的集合 5) 从技术角度来讲,scala 还是没有生成静态的内容,只不过是将伴生对象生成了一个新的类...4) 动态混入可以在不影响原有的继承关系的基础上,给指定的类扩展功能。

    1K10

    多面编程语言Scala

    伴生对象与伴生类 伴生对象与伴生类在Scala的面向对象编程方法中占据极其重要的位置,例如Scala中许多工具方法都是由伴 生对象提供的。...在Scala中,单例对象分为两种,一种是并未自动关联到特定类上的单例对象,称为独立对象 (Standalone Object);另一种是关联到一个类上的单例对象,该单例对象与该类共有相同名字,则这种单例对象称为伴生对象...Java中的类,可以既有静态成员,又有实例成员。...而在Scala中没有静态成员(静态字段和静态方法),因为静态成员从严格意义而言是破坏面向对象纯洁性的,因此,Scala借助伴生对象来完整支持类一级的属 性和操作。...实际上,特质最终会被编译成Java的接口及相应的实现类。Scala的特质提供的特性远比Java的接口灵活,让我们直接来看点有趣的东西吧。 ? ? 我们先是定义了一个Programmer抽象类。

    2.5K40

    大数据技术之_16_Scala学习_05_面向对象编程-中级

    // 2、object Clerk 称为伴生对象 // 因为 scala 的设计者将 static 拿掉了,他就设计了 伴生类 和 伴生对象 的概念 // 将非静态的内容放在 伴生类 中 // 将静态的内容放在... 伴生对象 中 object Clerk { // 伴生对象   def test(c: Clerk): Unit = {     // 这里体现出:在伴生对象中,可以访问伴生类的私有属性 c.sal...// 2、object Clerk 称为伴生对象 // 因为 scala 的设计者将 static 拿掉了,他就设计了 伴生类 和 伴生对象 的概念 // 将非静态的内容放在 伴生类 中 // 将静态的内容放在... 伴生对象 中 object Clerk { // 伴生对象   def test(c: Clerk): Unit = {     // 这里体现出:在伴生对象中,可以访问伴生类的私有属性 c.sal...7.6.10 Scala 抽象类使用的注意事项和细节讨论 ?

    1.3K30

    Scala

    方法   4、样本类可以通过==来比较两个对象,不在构造方法内地属性不会用在比较上 5.2 class   class是⼀个类   class在构造对象的时候需要使⽤new关键字才可以。...7、scala中的伴生类和伴生对象是怎么一回事   在 Scala 中,每个类都可以有一个同名的伴生对象(companion object),用于存放静态方法和属性,或者说是类级别的方法和属性。...伴生对象的名称与类的名称相同,但它们的定义使用了 object 关键字而不是 class 关键字。   相对应的,伴生对象和伴生类之间是有关联的。...具体来说,一个类和它的伴生对象必须在同一个源文件中定义,并且它们的名称必须相同。   伴生类和伴生对象之间可以互相访问对方的私有成员。...也就是说,伴生对象可以访问伴生类的私有成员,伴生类也可以访问伴生对象的私有成员。

    19230

    Scala入门系列终章:类与对象

    延续以上6篇推文,本文介绍类和对象,主要包括: 关于面向对象的理解 类、对象和特质 伴生类(对象)、抽象类、样例类 01 关于面向对象的理解 提到面向对象,首先就不得不讲述编程语言中范式的概念。...03 伴生类(对象)、抽象类、样例类 最后介绍类的几个拓展相关概念。...1)伴生类(对象)——Companions 在Scala中,当定义了一个同名的class和object时,这个类和对象互为伴生,即这个class为object的伴生类,这个object为class的伴生对象...伴生的要求就是同名,伴生的好处就是可以互相访问对方的属性和方法,甚至也因此带来一些实现上的便利。...2)抽象类——abstract class Scala中支持定义抽象类,这里的抽象在于定义一些属性和方法时只给出声明而不提供具体的赋值和逻辑,所以对于使用者而言是抽象的(或者说不具体的),定义方法只需在普通

    50520

    面向对象 类的成员

    类的私有成员 对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的访问限制不同: 静态字段(静态属性) 公有静态字段:类可以访问;类内部可以访问...__add() # 派生类中不能访问 私有方法 总结: 对于这些私有成员来说,他们只能在类的内部使用,不能再类的外部以及派生类中使用. *ps:非要访问私有成员的话,可以通过 对象....类的其他成员 这里的其他成员主要就是类方法: 方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。...原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,那么这个方法就可以定义为类方法。另外,如果需要继承,也可以定义为类方法。...因为我实例化的是学生,但是如果我从学生这一个实例中获得班级总人数,在逻辑上显然是不合理的。同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的。

    84620

    大数据分析工程师面试集锦2-Scala

    它写出的程序像动态语言一样简洁,但事实上它却是严格意义上的静态语言。总结起来就是面向对象和函数式的完美结合。 2 什么是函数式编程?有什么优点?...面向对象类 对于面向对象的考察更多是概念,如对象、类、抽象类、单例对象、伴生对象、构造器、特质,如何继承?还需要关注重载、apply/unapply方法、包装语法。...28 什么是伴生对象和伴生类? 在Scala中,单例对象object与class名称相同时,该对象被称为该类的伴生对象,该类被称为该对象的伴生类。...伴生类和伴生对象要处在同一个源文件中,伴生对象和伴生类可以互相访问其私有成员,不与伴生类同名的对象称之为孤立对象。 29 类的参数加和不加关键字(val和var)有区别吗?...抽象类是在普通类的基础上增加了abstract关键字,无法对其进行实例化,它是用来被子类继承的,抽象类中可以只定义字段和方法,具体的值和实现在其子类中实现,子类也可以进行重写。

    2.1K20

    Scala 基础 (六):面向对象(下篇)

    创作时间:2022 年 7 月 2 日 博客主页: 点此进入博客主页 —— 新时代的农民工 —— 换一种思维逻辑去看待这个世界 ---- 文章目录 一、抽象类 二、单例对象(伴生对象) 三...(伴生对象) Scala是一门完全面向对象的语言,没有静态操作。...单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致,必须在同一个文件中。 单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。...Scala底层对于伴生对象的apply方法进行了优化,调用时可以省略方法名,直接使用单例对象的名称+调用apply方法的参数 当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时...,scala 会对所有的特质及其父特质按照一定的顺序进行排序,而此案例中的super.describe()调用的实际上是排好序后的下一个特质中的 describe()方法。

    49110
    领券