Scala学习笔记:Scala面向对象基础

目录

 

Scala面向对象基础

1.面向对象的基本概念

2.面向对象的特征

3.如何定义一个类

4.内部类

5.类的构造器 

6.单例对象(object)

单例模式

7.应用程序对象

8.apply方法

9.类的继承 

10.抽象类

11.特质(Trait)

12.包的使用


Scala面向对象基础

1.面向对象的基本概念

对象:表示具体的事物。对象实现了数据与操作的结合,使数据和操作封装在对象中。对象具有状态,用数据值描述;对象具有操作,用于改变对象的状态,对象及其操作就是对象的行为。
:具有相同属性和行为的对象的抽象就是类,类具有属性,它是对象的状态的抽象;类具有方法,它是对象的行为的抽象。

2.面向对象的特征

1.对象唯一性:每个对象都是唯一的,在其生命周期内,对象的标识不变,不同的对象标识也不同
2.抽象性:将具有相同属性和行为的对象的抽象成类
3.封装性:把类(对象)的属性和行为封装起来,并尽可能的隐藏对象的属性和实现细节。保护数据成员,不让类以外的程序直接访问或修改,只能通过提供的公共接口访问,从而实现数据封装。方法的细节对用户隐藏,只提供外部接口,而内容的修改不会影响到外部调用,从而实现方法封装。类成员的访问修饰符如下
Scala学习笔记:Scala面向对象基础_第1张图片
4.继承性:子类共享父类的属性和方法,在Java和Scala中都只能实现单继承,就是子类只有一个父类。子类在继承了父类的属性和方法的同时,也是可以加入自己的内容,或者重写父类的方法的。通过类的继承,使公共的特性可以共享,提高了重用性。
5.多态性:“一个接口,多个方法”,同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态需要有三个条件:继承(继承是多态的基础)、子类重写父类方法(多态下调用子类重写的方法)、父类引用变量指向子类对象(如Animal a =new cat(),cat继承自它的父类Animal,Animal类型的引用就可以指向cat类型的对象,这就是向上转型)。那么父类引用变量指向子类对象有什么意义呢,就是既可以使用子类的方法,又可以抽取父类的共性,对于子类中定义而父类中没有的方法,父类引用是无法调用的。

3.如何定义一个类


Scala学习笔记:Scala面向对象基础_第2张图片

       在这个例子里,Student类有两个成员变量StuName和StuAge,以及它们对应的setter和getter。保持对象健壮性的重要方法之一就是保证对象的状态,即实例变量的值,在对象整个生命周期中持续有效,第一步就是在字段前加上private修饰符以阻止外界直接对它的访问,因为private被定义成只能用在同一个类里的方法访问。那为什么可以在第三个输出语句中可以直接访问呢?因为当属性使用了private修饰符的时候,Scala会自动生成对应的get和set方法,因此在输出语句中看似访问了private的属性,实际上是调用了它的get方法来访问。
       那有没有办法可以在定义private属性的时候,让Scala只生成get方法而不生成set方法呢?答案是将它设成一个常量。
       如果只希望某个属性只属于类私有,则可以加上private[this]修饰符,这样就只能在类里访问了,也不会生成对应的get和set方法。

4.内部类

在类的内部再定义一个类

Scala学习笔记:Scala面向对象基础_第3张图片

5.类的构造器 

分为两种:主构造器和辅助构造器
主构造器和类的声明放在一起,只能有一个主构造器,而辅助构造器可以有多个,使用关键字this实现。在这个例子中,当只传入了age这个属性时,StuName会用字符串"no name"代替
Scala学习笔记:Scala面向对象基础_第4张图片

6.单例对象(object)

Scala中没有static修饰符,但在object对象中,所有的成员都可以看成是静态的。
Scala更面向对象,所以成员里不允许存在静态成员。
Scala中的object相当于Java中的静态块,静态块即在加载类的时候就会加载执行,而且只会执行一次。因此在object中一般可以为伴生类做一些初始化操作。
如果object对象跟class重名,这个object对象就是这个类的伴生对象,反之这个类则是object对象的伴生类。必须要在同一个源文件里定义类和它的伴生对象。类和它的伴生对象可以互相访问其私有成员,因此可以使用单例对象实现单例模式。

单例模式

单例模式确保某个类只有一个实例。以打印机的驱动为例,打印机的驱动会被设计成单例模式,每台计算机可以有多个打印机,但只能有一个Printer Spooler,避免两个相同的打印作业同时输出到打印机中。

单例模式特点:
1.单例类只能有一个实例(这一点跟类与伴生对象不谋而合)。
2.单例类必须创建自己的唯一实例。
3.单例类必须给其他对象提供这一实例。

适用场景:
系统只需要一个实例对象,如需要生成器提供一个唯一的序列号
客户调用类的单个实例只允许使用一个公共访问点,除了该访问点,不能通过其他方式访问实例

一张图看懂Scala单例模式(此处感谢该公众号>,<对于单例模式我也理解了挺久的,但是这个图让我一下就明白了)
Scala学习笔记:Scala面向对象基础_第5张图片

7.应用程序对象

只有使用object声明的对象(类),才可以拥有main方法
或者继承App类,这样就可以不用写main方法
Scala学习笔记:Scala面向对象基础_第6张图片

8.apply方法

apply是Scala的一种语法糖,在遇到形如object(arg1,arg2....argN)这样的表达式时,apply方法就会被调用
apply方法需要定义在伴生对象中

Scala学习笔记:Scala面向对象基础_第7张图片

apply方法的最佳实践就是拿来做工厂

object Client {

    def main(args: Array[String]): Unit = {
        val arr = new Array[Int](3)
        arr(0) = 0
        arr(1) = 1
        arr(2) = 2
        arr.foreach(x => print(x + " "))
        println()

        val array = Array(1,2,3)
        array.foreach(x => print(x + " "))
    }
}

9.类的继承 

Scala跟Java一样,是单继承,所以子类只能有一个父类
下面的例子中,子类Employee重写了Person类的字段,所以在重写的部分前使用了override关键字,extends后面也加上了重写的字段。同时还重写了父类的sayHello方法,所以在重写的方法前也使用了override关键字.
而对象p3则是在main方法中通过父类实例化的,这种叫做匿名子类,而且通过重写父类的方法我们可以看到效果。

Scala学习笔记:Scala面向对象基础_第8张图片

10.抽象类

抽象类包含抽象字段(没有初始值的字段)抽象方法(即没有方法体的方法),且抽象类只能用于继承。子类在继承抽象类的时候,必须实现所继承的类的抽象方法。抽象类可以用来实现简单工厂模式。

Scala学习笔记:Scala面向对象基础_第9张图片

如果父类中包含抽象字段,则子类则必须提供抽象字段的初始值,或者就必须声明为抽象的,否则会报错

Scala学习笔记:Scala面向对象基础_第10张图片

11.特质(Trait)

Scala Trait本质上就是抽象类,但Trait支持多继承,相当于Java的接口,但比接口更强大,因为它可以定义抽象方法或方法。
如果要继承多个特质,只要加上with 特质名就可以了。

Scala学习笔记:Scala面向对象基础_第11张图片

12.包的使用

Scala的包和Java中的包或者C++中的命名空间的目的是相同的:管理大型程序中的名称
Scala中的包可以像Java一样使用,包里包含所建立的类,而且Package是可以嵌套的
Scala中依然使用import作为引用包的关键字,如import com.my.io._可以引用com.my.io下的所有类型,import com.my.io.xxx._可以引用com.my.io.xxx的所有成员
而且Scala中的import可以写在任意地方,而Java中的import写在最前面
包可以包含类、对象、特质,但不能包含函数或者变量的定义,这是JVM的限制,而Scala中的包对象可以包含常量、变量、方法、类、对象、特质、包

 

你可能感兴趣的:(Scala)