This commit is contained in:
罗祥
2019-06-04 10:35:13 +08:00
parent d09ca11daa
commit 52a294dbe6
8 changed files with 75 additions and 77 deletions

View File

@ -17,7 +17,7 @@
## 一、初识类和对象
Scala的类与Java的类具有非常多的相似性,这里为了有个直观上的印象,首先给出一个类的示例。
Scala的类与Java的类具有非常多的相似性示例如下:
```scala
// 1. 在scala中类不需要用public声明,所有的类都具有公共的可见性
@ -26,11 +26,11 @@ class Person {
// 2. 声明私有变量,用var修饰的变量默认拥有getter/setter属性
private var age = 0
// 3.如果声明的变量不需要进行初始赋值,此时scala无法进行类型推荐,需要显式指明类型
// 3.如果声明的变量不需要进行初始赋值,此时Scala无法进行类型推断,所以需要显式指明类型
private var name: String = _
// 4. 定义方法,应指明传参类型返回值类型
// 4. 定义方法,应指明传参类型返回值类型不是必须的Scala可以自动推断出来但是为了方便调用者建议指明
def growUp(step: Int): Unit = {
age += step
}
@ -58,7 +58,7 @@ class Person {
object Person {
def main(args: Array[String]): Unit = {
// 8.创建类的实例对象
// 8.创建类的实例
val counter = new Person()
// 9.用var修饰的变量默认拥有getter/setter属性可以直接对其进行赋值
counter.age = 12
@ -120,8 +120,8 @@ object Person {
>
> ```scala
> class Person {
> var name = ""
> private var age = ""
> var name = ""
> private var age = ""
> }
> ```
>
@ -132,21 +132,21 @@ object Person {
> > javap -private Person
> ```
>
> 编译结果如下从编译结果可以看到实际的get和set的方法名同时也验证了成员变量默认的可见性为public。
> 编译结果如下从编译结果可以看到实际的get和set的方法名(因为JVM不允许在方法名中出现所以它被翻译成$eq)同时也验证了成员变量默认的可见性为public。
>
> ```java
> Compiled from "Person.scala"
> public class Person {
> private java.lang.String name;
> private java.lang.String age;
>
> public java.lang.String name();
> public void name_$eq(java.lang.String);
>
> private java.lang.String age();
> private void age_$eq(java.lang.String);
>
> public Person();
> private java.lang.String name;
> private java.lang.String age;
>
> public java.lang.String name();
> public void name_$eq(java.lang.String);
>
> private java.lang.String age();
> private void age_$eq(java.lang.String);
>
> public Person();
> }
> ```
@ -172,7 +172,7 @@ object Person {
### 2.4 主构造器
和Java不同的是Scala类的主构造器直接写在类名后面同时需要注意以下两点:
和Java不同的是Scala类的主构造器直接写在类名后面注意以下两点:
+ 主构造器传入的参数默认就是val类型的即不可变你没有办法在内部改变传参
+ 写在主构造器中的代码块会在类初始化的时候被执行功能类似于Java的静态代码块`static{}`
@ -206,7 +206,7 @@ heibaiying:20
辅助构造器有两点硬性要求:
+ 辅助构造器的名称必须为this;
+ 辅助构造器的名称必须为this
+ 每个辅助构造器必须以主构造器或其他的辅助构造器的调用开始。
```scala
@ -236,7 +236,7 @@ object Person {
### 2.6 方法传参不可变
在Scala中方法传参默认是val类型即不可变这意味着你在方法体内部不能改变传入的参数。这和scala的设计理念有关Scala遵循函数式编程理念强调方法不应该有副作用。
在Scala中方法传参默认是val类型即不可变这意味着你在方法体内部不能改变传入的参数。这和Scala的设计理念有关Scala遵循函数式编程理念强调方法不应该有副作用。
```scala
class Person() {
@ -378,16 +378,19 @@ object Color extends Enumeration {
使用枚举类:
```scala
// 1.使用类型别名导入枚举类
import com.heibaiying.Color.Color
object ScalaApp extends App {
// 1.使用枚举类型,这种情况下需要导入枚举类,在枚举类中定义的类型别名就有用了
// 2.使用枚举类型,这种情况下需要导入枚举类
def printColor(color: Color): Unit = {
println(color.toString)
}
// 2.判断传入值和枚举值是否相等
// 3.判断传入值和枚举值是否相等
println(Color.YELLOW.toString == "yellow")
// 3.遍历枚举类和值
// 4.遍历枚举类和值
for (c <- Color.values) println(c.id + ":" + c.toString)
}