伴生类和伴生对象 设计初衷 由于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()
@ 目录 说在前面 运行原理 代码体现 解析 说在前面 scala是纯面向对象的语言,C是纯面向过程的语言,Java就是面向过程+面向对象的语言。...在说到伴生对象之前,要先说到java的static关键字,static关键字修饰的变量、方法可以使类对象共享,而非某个对象单独拥有,所以是通过类名.变量名/方法名去调用。...而这违背了scala面向对象的初衷,因为这没有通过对象去调用。...Scala是纯面向对象的,去除了java中的static关键字,通过伴生对象模拟static的效果(类名.变量名/方法名) 伴生对象 伴随着某个类产生的一个对象 当我们对源文件进行编译之后,默认会生成两个字节码文件...,一个是伴生类,另一个是伴生对象所属类 真正的伴生对象是伴生对象所属类中创建的单例对象 如果不想默认生成伴生类,可以手动生成,要求伴生类名称和伴生对象名称一致 所以在scala程序中,如果要想实现static
2)scala中的类同样通过class来进行声明。 3)scala中的类同样可以具有成员变量和成员方法。 4)scala中的类同样可以通过new关键字来创建出对象。 ...2)单例对象需要通过object关键字来声明。 3)一个单例对象可以单独存在,也可以绑定到一个类上。 ...5)当一个单例对象和某个类写在同一个源文件中且共享同一个名字时,他们就产生了一个绑定的关系。此时单例对象称为该类的伴生对象。类称为该对象的伴生类。 ...6)类和他的伴生对象可以互相访问其私有成员。 7)以伴生的方式为类增加静态成员成为了可能。 8)单例对象不能new,因此也没有构造参数。 ...val arr = Array[String](); 上一篇:Scala中的集合类型
Scala:面向对象、Object、抽象类、内部类、特质Trait 学习目标 掌握scala类与object的用法 掌握继承的用法 掌握trait(特质)的用法 1....这个object称为伴生对象,这个class称为伴生类 伴生对象必须要和伴生类一样的名字 伴生对象和伴生类在同一个scala源文件中 伴生对象和伴生类可以互相访问private属性 示例 示例说明 参考代码...伴生对象也不可以访问 示例 示例说明 定义一个Person类,包含一个name字段 定义Person类的伴生对象,定义printPerson方法 测试伴生对象是否能访问private[this]权限的成员...如果要求精确地判断出对象就是指定类的对象,那么就只能使用 getClass 和 classOf 。...抽象类 和Java语言一样,scala中也可以定义抽象类 12.1 定义 如果类的某个成员在当前类中的定义是不包含完整的,它就是一个抽象类 不完整定义有两种情况: 方法没有方法体(抽象方法) 变量没有初始化
一个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[类名]可以精确获取数据类型
抽象类 Scala 的抽象类跟Java的一样,不能被实例化。 1.1抽象字段 抽象类中,变量不使用就无需初始化,可以等到子类继承时再进行初始化。...teaching Math 1.3抽象类型 Scala 中的类型成员也可以是抽象的。...比如,在Trait中,你可以让类型成员保持抽象。...,触发了apply(),所以生成了一个新的Foo对象。...parameters bar2() ^ 2.2 伴生类和伴生对象中的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
C++通过对象名和成员运算符访问对象中的成员 C++不仅可以在类外引用对象的公用数据成员,还可以调用对象的公用成员函数,但同样必须指出对象名,应该注意所访问的成员是公用的还是私有的,只能访问public...stu.number=101; //假设num已定义为公用的整型数据成员 表示将整数101赋给对象stu中的数据成员number,其中.是成员运算符,用来对成员进行限定,指明所访问的是哪一个对象中的成员...访问对象中成员的一般形式为 对象名. 成员名 C++在类外只能调用公用的成员函数,在一个类中应当至少有一个公用的成员函数,作为对外的接口,否则就无法对对象进行任何操作。...C++通过指向对象的指针访问对象中的成员 C++可以通过指针引用结构体中的成员,用指针访 问对象中的成员的方法与此类似。...在C++中,如果为一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已,因此完全可以通过引用变量来访问对象中的成员。
1、Scala基本的程序结构说明 scala //对 scala 的基本的程序结构说明 //1. object 是一个关键字,表示一个伴生对象 //2....1) Scala 中伴生对象采用 object 关键字声明,伴生对象中声明的全是 “静态“内容,可以通过伴生对象名称直接调用。...2) 伴生对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。...3) 伴生对象中的属性和方法都可以通过伴生对象名直接调用访问 4) 从语法角度来讲,所谓的伴生对象其实就是类的静态方法和静态变量的集合 5) 从技术角度来讲,scala 还是没有生成静态的内容,只不过是将伴生对象生成了一个新的类...4) 动态混入可以在不影响原有的继承关系的基础上,给指定的类扩展功能。
object 通常用于作为单例模式的实现或者放在 class 的静态成员。...伴生类和伴生对象必须存放在一个 .scala 文件之中。 伴生类和伴生对象最大的特点在于可以互相访问 private field 。...之外,object 也可以继承抽象类,并覆盖抽象类中的方法。...通常在伴生对象中实现 apply 方法,并在其中实现构造伴生类的对象的功能。...创建伴生类的对象时,通常不会使用 new Class 的方式,而是使用 Class() 的方式,隐式地调用伴生对象的 apply 方法。
文章目录 面向对象的scala Unified Types Classes Traits 面向对象的scala 我们知道Scala是一种JVM语言,可以合java无缝衔接,这也就大大的扩展了scala的应用范围...,大数据里面有名的spark就是使用scala编写的,那么scala到底有什么奥秘和特性呢?...首先scala是一门面向对象的编程语言,他的面向对象性主要表现在如下几个方面: Unified Types Classes Traits 下面我们分别的说明他们各自的特定。...Setter语法 Scala的成员默认是public的。...这里我们还定义了一个Point的伴生对象,用于启动main方法。有关伴生对象的概念我们后面会详细讲诉。
伴生对象与伴生类 伴生对象与伴生类在Scala的面向对象编程方法中占据极其重要的位置,例如Scala中许多工具方法都是由伴 生对象提供的。...在Scala中,单例对象分为两种,一种是并未自动关联到特定类上的单例对象,称为独立对象 (Standalone Object);另一种是关联到一个类上的单例对象,该单例对象与该类共有相同名字,则这种单例对象称为伴生对象...Java中的类,可以既有静态成员,又有实例成员。...而在Scala中没有静态成员(静态字段和静态方法),因为静态成员从严格意义而言是破坏面向对象纯洁性的,因此,Scala借助伴生对象来完整支持类一级的属 性和操作。...实际上,特质最终会被编译成Java的接口及相应的实现类。Scala的特质提供的特性远比Java的接口灵活,让我们直接来看点有趣的东西吧。 ? ? 我们先是定义了一个Programmer抽象类。
// 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 抽象类使用的注意事项和细节讨论 ?
} // object ScalaPerson 是伴生对象,将静态的内容写到该对象中 // object ScalaPerson 编译后生成 ScalaPerson$.class // 对于伴生对象的内容...8.1.4 伴生对象的小结 ?...我们使用伴生对象来解决。...嵌套类的使用1 请编写程序,定义 Scala 的成员内部类和静态内部类,并创建相应的对象实例。...2、当对象调用所在类中不存在的方法或成员时,编译器会自动将对象进行隐式转换(根据类型)。 3、即:当对象调用所在类中存在的方法或成员时,编译器不会将对象进行隐式转换。
方法 4、样本类可以通过==来比较两个对象,不在构造方法内地属性不会用在比较上 5.2 class class是⼀个类 class在构造对象的时候需要使⽤new关键字才可以。...7、scala中的伴生类和伴生对象是怎么一回事 在 Scala 中,每个类都可以有一个同名的伴生对象(companion object),用于存放静态方法和属性,或者说是类级别的方法和属性。...伴生对象的名称与类的名称相同,但它们的定义使用了 object 关键字而不是 class 关键字。 相对应的,伴生对象和伴生类之间是有关联的。...具体来说,一个类和它的伴生对象必须在同一个源文件中定义,并且它们的名称必须相同。 伴生类和伴生对象之间可以互相访问对方的私有成员。...也就是说,伴生对象可以访问伴生类的私有成员,伴生类也可以访问伴生对象的私有成员。
延续以上6篇推文,本文介绍类和对象,主要包括: 关于面向对象的理解 类、对象和特质 伴生类(对象)、抽象类、样例类 01 关于面向对象的理解 提到面向对象,首先就不得不讲述编程语言中范式的概念。...03 伴生类(对象)、抽象类、样例类 最后介绍类的几个拓展相关概念。...1)伴生类(对象)——Companions 在Scala中,当定义了一个同名的class和object时,这个类和对象互为伴生,即这个class为object的伴生类,这个object为class的伴生对象...伴生的要求就是同名,伴生的好处就是可以互相访问对方的属性和方法,甚至也因此带来一些实现上的便利。...2)抽象类——abstract class Scala中支持定义抽象类,这里的抽象在于定义一些属性和方法时只给出声明而不提供具体的赋值和逻辑,所以对于使用者而言是抽象的(或者说不具体的),定义方法只需在普通
类的私有成员 对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的访问限制不同: 静态字段(静态属性) 公有静态字段:类可以访问;类内部可以访问...__add() # 派生类中不能访问 私有方法 总结: 对于这些私有成员来说,他们只能在类的内部使用,不能再类的外部以及派生类中使用. *ps:非要访问私有成员的话,可以通过 对象....类的其他成员 这里的其他成员主要就是类方法: 方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。...原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,那么这个方法就可以定义为类方法。另外,如果需要继承,也可以定义为类方法。...因为我实例化的是学生,但是如果我从学生这一个实例中获得班级总人数,在逻辑上显然是不合理的。同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的。
它写出的程序像动态语言一样简洁,但事实上它却是严格意义上的静态语言。总结起来就是面向对象和函数式的完美结合。 2 什么是函数式编程?有什么优点?...面向对象类 对于面向对象的考察更多是概念,如对象、类、抽象类、单例对象、伴生对象、构造器、特质,如何继承?还需要关注重载、apply/unapply方法、包装语法。...28 什么是伴生对象和伴生类? 在Scala中,单例对象object与class名称相同时,该对象被称为该类的伴生对象,该类被称为该对象的伴生类。...伴生类和伴生对象要处在同一个源文件中,伴生对象和伴生类可以互相访问其私有成员,不与伴生类同名的对象称之为孤立对象。 29 类的参数加和不加关键字(val和var)有区别吗?...抽象类是在普通类的基础上增加了abstract关键字,无法对其进行实例化,它是用来被子类继承的,抽象类中可以只定义字段和方法,具体的值和实现在其子类中实现,子类也可以进行重写。
创作时间:2022 年 7 月 2 日 博客主页: 点此进入博客主页 —— 新时代的农民工 —— 换一种思维逻辑去看待这个世界 ---- 文章目录 一、抽象类 二、单例对象(伴生对象) 三...(伴生对象) Scala是一门完全面向对象的语言,没有静态操作。...单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致,必须在同一个文件中。 单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。...Scala底层对于伴生对象的apply方法进行了优化,调用时可以省略方法名,直接使用单例对象的名称+调用apply方法的参数 当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时...,scala 会对所有的特质及其父特质按照一定的顺序进行排序,而此案例中的super.describe()调用的实际上是排好序后的下一个特质中的 describe()方法。
领取专属 10元无门槛券
手把手带您无忧上云