Scala面向对象

打印 上一主题 下一主题

主题 616|帖子 616|积分 1848

类和对象

组成结构
•        构造函数: 在创建对象的时候给属性赋值
•        成员变量:
•        成员方法(函数)
•        局部变量
•        代码块
构造器

每个类都有一个主构造器,这个构造器和类定义"交织"在一起类名后面的内容就是主构造器,如果参数列表为空的话,()可以省略
scala的类有且仅有一个主构造器,要想提供更加丰富的构造器,就需要使用辅助构造器,辅助构造器是可选的,它们叫做this   def this
注意:主构造器会执行类定义中的所有语句
代码示例:
  1. // 类默认有一个无参的主构造函数
  2. class User {
  3. }
  4. val user: User = new User
  5. // 两个参数的主构造函数
  6. class User2(val name: String, age: Int) {
  7. }
  8. val user2 = new User2("jim", 23)
  9. // 使用val修饰的变量默认是成员变量,对象可以访问
  10. // user2.age   // age没有使用val或者var修饰 所以不能被访问,他不是一个成员变量,而是一个局部变量
  11. //辅助构造器
  12. class User3 {
  13.    var name: String = _
  14.    var age: Int = _
  15.   // 辅助构造函数
  16.   def this(name: String, age: Int) {
  17.     // 构造函数中的首行必须调用主构造函数或者其他构造函数
  18.     this()
  19.     this.name = name
  20.     this.age = age
  21.   }
  22.   // 辅助构造函数
  23.   def this(msg: String) = {
  24.     // 首行调用一个构造
  25.     this("ww", 12)
  26.     println(msg)
  27.   }
  28. }
  29. val u1 = new User3()
  30. val u2 = new User3("")
  31. val u3 = new User3("lisi", 23)
  32. println(u3.name)
复制代码
总结:

  • 有两类构造器:主构造器,辅助构造器
  • 构造器的定义位置:主构造器和类交织在一起,class Student2(val name: String, var age: Int)
  • 辅助构造器是一个特殊的方法,定义在类中 def this(name:String,age:Int,gender:String)
  • 辅助构造器,第一行必须调用主构造器(或者其他的辅助构造器)
  • 辅助构造器的参数不能和主构造器的参数完全一致(参数个数,参数类型,参数顺序)
  • 可以定义空参的辅助构造器,但是主构造器的参数必须进行初始化赋值
  • 作用域:辅助构造器的变量作用域,只在方法中,主构造器的作用域是类中除了成员属性和成员方法之外的所有范围(可以通过反编译查看源码)
构造器的参数说明

  • 主构造函数中使用val 和 var修饰的变量为成员变量
  • val 修饰的变量默认只有getter方法   一要初始化
  • var 修饰的变量默认有 get和set方法  直接点属性操作  使用 _ 占位可以稍后赋值
  • @BeanProperty会生成getMsg setMsg方法
成员方法/函数

在类的成员位置定义的函数或者方法是类的成员的一部分
代码块

在类或者对象中的代码块在实例化的时候会被调用

  • 在类成员位置的代码块  构造代码块 每次创建对象都会执行一次
  • 在object中成员位置的代码块是静态代码块  只执行一次
  • 代码有返回值
object类的底层原理
  1. package com.doit.day01.day02
  2. //如果构造器中的变量,不加var 或者val 那他就是一个局部变量
  3. //加了var 或者val 的话他就是一个私有的成员变量
  4. class Student1(var id: Int, val name: String) {
  5.   def sayHello: Unit = {
  6.     println(name + ":你好")
  7.   }
  8.   val sayFunc = () => {
  9.     println("hello:" + name)
  10.   }
  11. }
  12. object Student2{
  13.   var id: Int = 1
  14.   //如果在成员变量的位置上给一个_作为占位符,相当于是给他赋了一个默认值啊
  15.   var name: String =_
  16.   def sayHello: Unit = {
  17.     println(name + ":你好")
  18.   }
  19.   val sayFunc = (x:String) => {
  20.     println("hello:" + name + x)
  21.   }
  22. }
  23. object Demo01_面向对象 {
  24.   def main(args: Array[String]): Unit = {
  25.     Student2.sayFunc("a")
  26.     val student1: Student1 = new Student1(1, "zhangsan")
  27.     println(student1.name)
  28.     println(student1.id)
  29.     //    student1.name = "lisi"  用val 修饰的,不能修改
  30.     student1.id = 2
  31.     println(student1.id)
  32.     student1.sayHello
  33.     student1.sayFunc()
  34.     println(Student2.name)
  35.   }
  36. }
复制代码
java手写实现:
  1. package com.doit;
  2. public class Person {
  3.     public static String getName(){
  4.         return Person$.person.getName();
  5.     }
  6.     public static Integer getAge(){
  7.         return Person$.person.getAge();
  8.     }
  9.     public static void setName(String name ){
  10.         Person$.person.setName(name);
  11.     }
  12.     public static void setAge(Integer age ){
  13.         Person$.person.setAge(age);
  14.     }
  15. }
  16. class Person$ {
  17.     //自己的对象
  18.     public static Person$ person ;
  19.     //成员变量
  20.     private String name;
  21.     private int age;
  22.     static {
  23.         person  = new Person$();
  24.     }
  25.     private Person$() {
  26.     }
  27.     public String getName() {
  28.         return name;
  29.     }
  30.     public void setName(String name) {
  31.         this.name = name;
  32.     }
  33.     public int getAge() {
  34.         return age;
  35.     }
  36.     public void setAge(int age) {
  37.         this.age = age;
  38.     }
  39. }
  40. class Test{
  41.     public static void main(String[] args) {
  42.         Person person = new Person();
  43.         person.setName("张三");
  44.         person.setAge(18);
  45.         String name1 = person.getName();
  46.         Integer age1 = person.getAge();
  47.         System.out.println(name1);
  48.         System.out.println(age1);
  49.     }
  50. }
复制代码
scala中底层反编译后的代码:
  1. package com.doit.day01.day02;
  2. import java.lang.invoke.SerializedLambda;
  3. import scala.Function1;
  4. import scala.Predef.;
  5. import scala.runtime.BoxedUnit;
  6. public final class Student2$ {
  7.    public static Student2$ MODULE$;
  8.    private int id;
  9.    private String name;
  10.    private final Function1 sayFunc;
  11.    static {
  12.       new Student2$();
  13.    }
  14.    public int id() {
  15.       return this.id;
  16.    }
  17.    public void id_$eq(final int x$1) {
  18.       this.id = x$1;
  19.    }
  20.    public String name() {
  21.       return this.name;
  22.    }
  23.    public void name_$eq(final String x$1) {
  24.       this.name = x$1;
  25.    }
  26.    public void sayHello() {
  27.       .MODULE$.println((new StringBuilder(3)).append(this.name()).append(":你好").toString());
  28.    }
  29.    public Function1 sayFunc() {
  30.       return this.sayFunc;
  31.    }
  32. // $FF: synthetic method
  33.    public static final void $anonfun$sayFunc$1(final String x) {
  34.       .MODULE$.println((new StringBuilder(6)).append("hello:").append(MODULE$.name()).append(x).toString());
  35.    }
  36.    private Student2$() {
  37.       MODULE$ = this;
  38.       this.id = 1;
  39.       this.sayFunc = (x) -> {
  40.          $anonfun$sayFunc$1(x);
  41.          return BoxedUnit.UNIT;
  42.       };
  43.    }
  44. // $FF: synthetic method
  45.    private static Object $deserializeLambda$(SerializedLambda var0) {
  46.       return var0.lambdaDeserialize<invokedynamic>(var0);
  47.    }
  48. }
  49. //decompiled from Student2.class
  50. package com.doit.day01.day02;
  51. import scala.Function1;
  52. import scala.reflect.ScalaSignature;
  53. @ScalaSignature(
  54.    bytes = "\u0006\u0001!;Q\u0001D\u0007\t\u0002Y1Q\u0001G\u0007\t\u0002eAQ\u0001I\u0001\u0005\u0002\u0005BqAI\u0001A\u0002\u0013\u00051\u0005C\u0004(\u0003\u0001\u0007I\u0011\u0001\u0015\t\r9\n\u0001\u0015)\u0003%\u0011%y\u0013\u00011AA\u0002\u0013\u0005\u0001\u0007C\u0005=\u0003\u0001\u0007\t\u0019!C\u0001{!Iq(\u0001a\u0001\u0002\u0003\u0006K!\r\u0005\u0006\u0001\u0006!\t!\u0011\u0005\b\u0005\u0006\u0011\r\u0011"\u0001D\u0011\u00199\u0015\u0001)A\u0005\t\u0006A1\u000b^;eK:$(G\u0003\u0002\u000f\u001f\u0005)A-Y=1e)\u0011\u0001#E\u0001\u0006I\u0006L\b'\r\u0006\u0003%M\tA\u0001Z8ji*\tA#A\u0002d_6\u001c\u0001\u0001\u0005\u0002\u0018\u00035\tQB\u0001\u0005TiV$WM\u001c;3'\t\t!\u0004\u0005\u0002\u001c=5\tADC\u0001\u001e\u0003\u0015\u00198-\u00197b\u0013\tyBD\u0001\u0004B]f\u0014VMZ\u0001\u0007y%t\u0017\u000e\u001e \u0015\u0003Y\t!!\u001b3\u0016\u0003\u0011\u0002"aG\u0013\n\u0005\u0019b"aA%oi\u00061\u0011\u000eZ0%KF$"!\u000b\u0017\u0011\u0005mQ\u0013BA\u0016\u001d\u0005\u0011)f.\u001b;\t\u000f5"\u0011\u0011!a\u0001I\u0005\u0019\u0001\u0010J\u0019\u0002\u0007%$\u0007%\u0001\u0003oC6,W#A\u0019\u0011\u0005IJdBA\u001a8!\t!D$D\u00016\u0015\t1T#\u0001\u0004=e>|GOP\u0005\u0003qq\ta\u0001\u0015:fI\u00164\u0017B\u0001\u001e<\u0005\u0019\u0019FO]5oO*\u0011\u0001\bH\u0001\t]\u0006lWm\u0018\u0013fcR\u0011\u0011F\u0010\u0005\b[\u001d\t\t\u00111\u00012\u0003\u0015q\u0017-\\3!\u0003!\u0019\u0018-\u001f%fY2|W#A\u0015\u0002\u000fM\f\u0017PR;oGV\tA\t\u0005\u0003\u001c\u000bFJ\u0013B\u0001$\u001d\u0005%1UO\\2uS>t\u0017'\u0001\u0005tCf4UO\\2!\u0001"
  55. )
  56. public final class Student2 {
  57.    public static Function1 sayFunc() {
  58.       return Student2$.MODULE$.sayFunc();
  59.    }
  60.    public static void sayHello() {
  61.       Student2$.MODULE$.sayHello();
  62.    }
  63.    public static void name_$eq(final String x$1) {
  64.       Student2$.MODULE$.name_$eq(var0);
  65.    }
  66.    public static String name() {
  67.       return Student2$.MODULE$.name();
  68.    }
  69.    public static void id_$eq(final int x$1) {
  70.       Student2$.MODULE$.id_$eq(var0);
  71.    }
  72.    public static int id() {
  73.       return Student2$.MODULE$.id();
  74.    }
  75. }
复制代码
伴生类和伴生对象

条件 1:在同一个源文件中, 条件 2:对象名和类名相同
  1.   //类名和object的名称一致
  2.   //类是对象的伴生类
  3.   //对象是类的伴生对象
  4. class Demo6(val name: String) {
  5. }
  6. object Demo6 {
  7. }
复制代码
条件 2:伴生对象和伴生类之间可以互相访问彼此的私有属性和私有方法
  1. package com.doit.day01.day02
  2. /**
  3. * 伴生对象的用途:
  4. *      1.可以将静态的成员变量和普通成员变量分别声明
  5. *      2.伴生对象自己内部定义了一个apply方法,可以简化创建对象(类的实例构造)
  6. *      3.伴生对象自己定义了一个unapply方法,可以用于模式匹配
  7. */
  8. class Car(var brand: String, var price: Double) {
  9.   def sayHello(): Unit ={
  10.     println("hello")
  11.   }
  12.   private val color: String = Car.color
  13.   Car.start()
  14. }
  15. object Car {
  16.   var color :String = "red"
  17.   def start(): Unit ={
  18.     println("汽车启动了,嗡~~~~~~~~")
  19.   }
  20. }
  21. object Demo02_伴生对象 {
  22.   def main(args: Array[String]): Unit = {
  23.     val car: Car = new Car("华为", 9.9)
  24.     println(car.brand)
  25.     println(car.price)
  26.     car.sayHello()
  27.     Car.start()
  28.   }
  29. }
复制代码
伴生对象的底层原理:
  1. //decompiled from Car.class
  2. package com.doit.day01.day02;
  3. import scala.Predef.;
  4. import scala.reflect.ScalaSignature;
  5. @ScalaSignature(
  6.    bytes = "\u0006\u0001E3A\u0001E\t\u00015!A\u0011\u0005\u0001BA\u0002\u0013\u0005!\u0005\u0003\u0005/\u0001\t\u0005\r\u0011"\u00010\u0011!)\u0004A!A!B\u0013\u0019\u0003\u0002\u0003\u001c\u0001\u0005\u0003\u0007I\u0011A\u001c\t\u0011m\u0002!\u00111A\u0005\u0002qB\u0001B\u0010\u0001\u0003\u0002\u0003\u0006K\u0001\u000f\u0005\u0006\u007f\u0001!\t\u0001\u0011\u0005\u0006\u000b\u0002!\tAR\u0004\u0006\u000fFA\t\u0001\u0013\u0004\u0006!EA\t!\u0013\u0005\u0006\u007f)!\tA\u0013\u0005\b\u0017*\u0001\r\u0011"\u0001#\u0011\u001da%\u00021A\u0005\u00025Caa\u0014\u0006!B\u0013\u0019\u0003"\u0002)\u000b\t\u00031%aA"be*\u0011!cE\u0001\u0006I\u0006L\bG\r\u0006\u0003)U\tQ\u0001Z1zaER!AF\f\u0002\t\u0011|\u0017\u000e\u001e\u0006\u00021\u0005\u00191m\\7\u0004\u0001M\u0011\u0001a\u0007\t\u00039}i\u0011!\b\u0006\u0002=\u0005)1oY1mC&\u0011\u0001%\b\u0002\u0007\u0003:L(+\u001a4\u0002\u000b\t\u0014\u0018M\u001c3\u0016\u0003\r\u0002"\u0001J\u0016\u000f\u0005\u0015J\u0003C\u0001\u0014\u001e\u001b\u00059#B\u0001\u0015\u001a\u0003\u0019a$o\\8u}%\u0011!&H\u0001\u0007!J,G-\u001a4\n\u00051j#AB*ue&twM\u0003\u0002+;\u0005I!M]1oI~#S-\u001d\u000b\u0003aM\u0002"\u0001H\u0019\n\u0005Ij"\u0001B+oSRDq\u0001\u000e\u0002\u0002\u0002\u0003\u00071%A\u0002yIE\naA\u0019:b]\u0012\u0004\u0013!\u00029sS\u000e,W#\u0001\u001d\u0011\u0005qI\u0014B\u0001\u001e\u001e\u0005\u0019!u.\u001e2mK\u0006I\u0001O]5dK~#S-\u001d\u000b\u0003auBq\u0001N\u0003\u0002\u0002\u0003\u0007\u0001(\u0001\u0004qe&\u001cW\rI\u0001\u0007y%t\u0017\u000e\u001e \u0015\u0007\u0005\u001bE\t\u0005\u0002C\u00015\t\u0011\u0003C\u0003"\u000f\u0001\u00071\u0005C\u00037\u000f\u0001\u0007\u0001(\u0001\u0005tCfDU\r\u001c7p)\u0005\u0001\u0014aA"beB\u0011!IC\n\u0003\u0015m!\u0012\u0001S\u0001\u0006G>dwN]\u0001\nG>dwN]0%KF$"\u0001\r(\t\u000fQj\u0011\u0011!a\u0001G\u000511m\u001c7pe\u0002\nQa\u001d;beR\u0004"
  7. )
  8. public class Car {
  9.    private String brand;
  10.    private double price;
  11.    public static void start() {
  12.       Car$.MODULE$.start();
  13.    }
  14.    public static void color_$eq(final String x$1) {
  15.       Car$.MODULE$.color_$eq(var0);
  16.    }
  17.    public static String color() {
  18.       return Car$.MODULE$.color();
  19.    }
  20.    public String brand() {
  21.       return this.brand;
  22.    }
  23.    public void brand_$eq(final String x$1) {
  24.       this.brand = x$1;
  25.    }
  26.    public double price() {
  27.       return this.price;
  28.    }
  29.    public void price_$eq(final double x$1) {
  30.       this.price = x$1;
  31.    }
  32.    public void sayHello() {
  33.       .MODULE$.println("hello");
  34.    }
  35.    public Car(final String brand, final double price) {
  36.       this.brand = brand;
  37.       this.price = price;
  38.       super();
  39.    }
  40. }
  41.         //decompiled from Car$.class
  42. package com.doit.day01.day02;
  43. import scala.Predef.;
  44. public final class Car$ {
  45.    public static Car$ MODULE$;
  46.    private String color;
  47.    static {
  48.       new Car$();
  49.    }
  50.    public String color() {
  51.       return this.color;
  52.    }
  53.    public void color_$eq(final String x$1) {
  54.       this.color = x$1;
  55.    }
  56.    public void start() {
  57.       .MODULE$.println("汽车启动了,嗡~~~~~~~~");
  58.    }
  59.    private Car$() {
  60.       MODULE$ = this;
  61.       this.color = "red";
  62.    }
  63. }
复制代码
图示:

伴生对象用途:

  • 可以将静态的成员变量和普通成员变量分别声明(class中没办法添加静态成员,需要经过object类来添加)
  • 伴生对象自己内部定义了一个apply方法,可以简化创建对象(类的实例构造)
  • 伴生对象自己定义了一个unapply方法,可以用于模式匹配
apply方法

使用此方法时,可以在main函数中不通过new来创建一个对象,即可以不用专门的一次一次地进行实例化,加载创建对象的这个类的时候,会自动调用apply这个方法,类似Java中的static静态块。

  • 通过伴生对象的 apply 方法,实现不使用 new 方法创建对象。
  • apply 方法可以重载。
  • Scala 中 obj(arg)的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。用以统一面向对象编程和函数式编程的风格。
  • 当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实是伴生对象的 apply 方法。
  1. object Test {
  2. def main(args: Array[String]): Unit = {
  3. //(1)通过伴生对象的 apply 方法,实现不使用 new 关键字创建对象。
  4. val p1 = Person()
  5. println("p1.name=" + p1.name)
  6. val p2 = Person("bobo")
  7. println("p2.name=" + p2.name)
  8. }
  9. }
  10. //(2)如果想让主构造器变成私有的,可以在()之前加上 private
  11. class Person private(cName: String) {
  12. var name: String = cName
  13. }
  14. object Person {
  15. def apply(): Person = {
  16. println("apply 空参被调用")
  17. new Person("xx")
  18. }
  19. def apply(name: String): Person = {
  20. println("apply 有参被调用")
  21. new Person(name)
  22. }
  23. }
复制代码
权限修饰符

在 Java 中,访问权限分为:public,private,protected 和默认。在 Scala 中,你可以通过类似的修饰符达到同样的效果。但是使用上有区别。
(1)Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字。
(2)private 为私有权限,只在类的内部和伴生对象中可用。
(3)protected 为受保护权限,Scala 中受保护权限比 Java 中更严格,同类、子类可以访问,同包无法访问。
(4)private[包名]增加包访问权限,包名下的其他类也可以使用
代码演示:
  1. class Person {
  2. private var name: String = "bobo"
  3. protected var age: Int = 18
  4. private[test] var sex: String = "男"
  5. def say(): Unit = {
  6. println(name)
  7. }
  8. }
  9. object Person {
  10. def main(args: Array[String]): Unit = {
  11. val person = new Person
  12. person.say()
  13. println(person.name)
  14. println(person.age)
  15. }
  16. }
  17. class Teacher extends Person {
  18. def test(): Unit = {
  19. this.age
  20. this.sex
  21. }
  22. }
  23. class Animal {
  24. def test: Unit = {
  25. new Person().sex
  26. }
  27. }
复制代码
特质和抽象类

特质

Trait(特质)相当于 java 的接口。比接口功能更强大。特质中可以定义属性和抽象方法和方法的实现。
Scala 的类只能够继承单一父类,但是可以实现(继承,混入)多个特质(Trait),使用的关键字是 with 和 extends
注意,特质不能有主构造函数
基本语法
  1. trait 特质名 {
  2. trait 主体
  3. }
复制代码
如何使用特质:
没有父类:class 类名 extends 特质 1 with 特质 2 with 特质 3 …
有父类:class 类名 extends 父类 with 特质 1 with 特质 2 with 特质 3…
代码演示:
  1. trait PersonTrait {
  2. // 声明属性
  3. var name:String = _
  4. // 声明方法
  5. def eat():Unit={
  6. }
  7. // 抽象属性
  8. var age:Int
  9. // 抽象方法
  10. def say():Unit
  11. }
复制代码
特质的本质就是抽象类+接口
特质的动态混入

1.创建对象时混入 trait,而无需使类混入该 trait
2.如果混入的 trait 中有未实现的方法,则需要实现
代码演示:
  1. trait PersonTrait {
  2. //(1)特质可以同时拥有抽象方法和具体方法
  3. // 声明属性
  4. var name: String = _
  5. // 抽象属性
  6. var age: Int
  7. // 声明方法
  8. def eat(): Unit = {
  9. println("eat")
  10. }
  11. // 抽象方法
  12. def say(): Unit
  13. }
  14. trait SexTrait {
  15. var sex: String
  16. }
  17. //(2)一个类可以实现/继承多个特质
  18. //(3)所有的 Java 接口都可以当做 Scala 特质使用
  19. class Teacher extends PersonTrait with java.io.Serializable {
  20. override def say(): Unit = {
  21. println("say")
  22. }
  23. override var age: Int = _
  24. }
  25. object TestTrait {
  26. def main(args: Array[String]): Unit = {
  27. val teacher = new Teacher
  28. teacher.say()
  29. teacher.eat()
  30. //(4)动态混入:可灵活的扩展类的功能
  31. val t2 = new Teacher with SexTrait {
  32. override var sex: String = "男"
  33. }
  34. //调用混入 trait 的属性
  35. println(t2.sex)
  36. }
  37. }
复制代码
抽象类

在 Scala 中, 使用 abstract 修饰的类称为抽象类. 在抽象类中可以定义属性、未实现的方法(抽象方法)和具体实现的方法。  含有抽象方法的类就是抽象类

  • 抽象类中的属性
  • 抽象方法
  • 具体实现的方法
  • 类的单继承
示例:
  1. /*
  2. * abstract 修饰的类是一个抽象类
  3. * */
  4. abstract class Animal {
  5.   println("Animal's constructor ....")
  6.   // 定义一个 name 属性
  7.   val name: String = "animal"
  8.   // 没有任何实现的方法
  9.   def sleep()
  10.   // 带有具体的实现的方法
  11.   def eat(f: String): Unit = {
  12.     println(s"$f")
  13.     }
  14.   }
复制代码
抽象类的继承和重写

  • 如果父类为抽象类,那么子类要么也是抽象类,要么就需要重写父类中的所有的抽象方法和抽象的成员变量
  • 重写非抽象方法需要用 override 修饰,重写抽象方法则可以不加 override。
  • 子类中调用父类的方法使用 super 关键字,在子类重写了父类的方法后,如果不加super,直接写方法名调用的就是子类重写后的,如果加了,调用的还是父类的
  • 子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var(var修饰具体方法和变量不好重写)
因为 var 修饰的为可变变量,子类继承之后就可以直接使用,没有必要重写
样例类

使用case修饰的类就是样例类(封装数据,模式匹配)

  • 构造器中的参数默认是val修饰的[成员,赋值1次]
  • 样例类会自动创建伴生对象, 同时在里面实现;的apply和unapply方法 ,创建对象的时候不用new
  • 很好的支持匹配模式
  • 默认实现了自己的toString , hashCode , copy , equals,序列化方法
定义一个样例类:
  1. case class Person(var name:String , var age:Int){}
  2. //如果类中没有别的需要定义的,可以不写大括号
复制代码
反编译之后的结果:
[code]//decompiled from Person$.classpackage com.doit.day01.day02;import scala.Option;import scala.Serializable;import scala.Some;import scala.Tuple2;import scala.None.;import scala.runtime.AbstractFunction2;import scala.runtime.BoxesRunTime;public final class Person$ extends AbstractFunction2 implements Serializable {   public static Person$ MODULE$;   static {      new Person$();   }   public final String toString() {      return "Person";   }   public Person apply(final String name, final int age) {      return new Person(name, age);   }   public Option unapply(final Person x$0) {      return (Option)(x$0 == null ? .MODULE$ : new Some(new Tuple2(x$0.name(), BoxesRunTime.boxToInteger(x$0.age()))));   }   private Object readResolve() {      return MODULE$;   }   // $FF: synthetic method   // $FF: bridge method   public Object apply(final Object v1, final Object v2) {      return this.apply((String)v1, BoxesRunTime.unboxToInt(v2));   }   private Person$() {      MODULE$ = this;   }}        //decompiled from Person.classpackage com.doit.day01.day02;import scala.Function1;import scala.Option;import scala.Product;import scala.Serializable;import scala.collection.Iterator;import scala.reflect.ScalaSignature;import scala.runtime.BoxesRunTime;import scala.runtime.Statics;import scala.runtime.ScalaRunTime.;@ScalaSignature(   bytes = "\u0006\u0001\u0005Uc\u0001\u0002\u000e\u001c\u0001\u0012B\u0001\"\r\u0001\u0003\u0012\u0004%\tA\r\u0005\t}\u0001\u0011\t\u0019!C\u0001\u007f!AQ\t\u0001B\tB\u0003&1\u0007\u0003\u0005G\u0001\tE\r\u0011\"\u0001H\u0011!Y\u0005A!a\u0001\n\u0003a\u0005\u0002\u0003(\u0001\u0005#\u0005\u000b\u0015\u0002%\t\u000b=\u0003A\u0011\u0001)\t\u000fU\u0003\u0011\u0011!C\u0001-\"9\u0011\fAI\u0001\n\u0003Q\u0006bB3\u0001#\u0003%\tA\u001a\u0005\bQ\u0002\t\t\u0011\"\u0011j\u0011\u001d\t\b!!A\u0005\u0002\u001dCqA\u001d\u0001\u0002\u0002\u0013\u00051\u000fC\u0004y\u0001\u0005\u0005I\u0011I=\t\u0013\u0005\u0005\u0001!!A\u0005\u0002\u0005\r\u0001\"CA\u0007\u0001\u0005\u0005I\u0011IA\b\u0011%\t\t\u0002AA\u0001\n\u0003\n\u0019\u0002C\u0005\u0002\u0016\u0001\t\t\u0011\"\u0011\u0002\u0018\u001dI\u00111D\u000e\u0002\u0002#\u0005\u0011Q\u0004\u0004\t5m\t\t\u0011#\u0001\u0002 !1q\n\u0006C\u0001\u0003[A\u0011\"!\u0005\u0015\u0003\u0003%)%a\u0005\t\u0013\u0005=B#!A\u0005\u0002\u0006E\u0002\"CA\u001c)\u0005\u0005I\u0011QA\u001d\u0011%\tY\u0005FA\u0001\n\u0013\tiE\u0001\u0004QKJ\u001cxN\u001c\u0006\u00039u\tQ\u0001Z1zaIR!AH\u0010\u0002\u000b\u0011\f\u0017\u0010M\u0019\u000b\u0005\u0001\n\u0013\u0001\u00023pSRT\u0011AI\u0001\u0004G>l7\u0001A\n\u0005\u0001\u0015Zc\u0006\u0005\u0002'S5\tqEC\u0001)\u0003\u0015\u00198-\u00197b\u0013\tQsE\u0001\u0004B]f\u0014VM\u001a\t\u0003M1J!!L\u0014\u0003\u000fA\u0013x\u000eZ;diB\u0011aeL\u0005\u0003a\u001d\u0012AbU3sS\u0006d\u0017N_1cY\u0016\fAA\\1nKV\t1\u0007\u0005\u00025w9\u0011Q'\u000f\t\u0003m\u001dj\u0011a\u000e\u0006\u0003q\r\na\u0001\u0010:p_Rt\u0014B\u0001\u001e(\u0003\u0019\u0001&/\u001a3fM&\u0011A(\u0010\u0002\u0007'R\u0014\u0018N\\4\u000b\u0005i:\u0013\u0001\u00038b[\u0016|F%Z9\u0015\u0005\u0001\u001b\u0005C\u0001\u0014B\u0013\t\u0011uE\u0001\u0003V]&$\bb\u0002#\u0003\u0003\u0003\u0005\raM\u0001\u0004q\u0012\n\u0014!\u00028b[\u0016\u0004\u0013aA1hKV\t\u0001\n\u0005\u0002'\u0013&\u0011!j\n\u0002\u0004\u0013:$\u0018aB1hK~#S-\u001d\u000b\u0003\u00016Cq\u0001R\u0003\u0002\u0002\u0003\u0007\u0001*\u0001\u0003bO\u0016\u0004\u0013A\u0002\u001fj]&$h\bF\u0002R'R\u0003\"A\u0015\u0001\u000e\u0003mAQ!M\u0004A\u0002MBQAR\u0004A\u0002!\u000bAaY8qsR\u0019\u0011k\u0016-\t\u000fEB\u0001\u0013!a\u0001g!9a\t\u0003I\u0001\u0002\u0004A\u0015AD2paf$C-\u001a4bk2$H%M\u000b\u00027*\u00121\u0007X\u0016\u0002;B\u0011alY\u0007\u0002?*\u0011\u0001-Y\u0001\nk:\u001c\u0007.Z2lK\u0012T!AY\u0014\u0002\u0015\u0005tgn\u001c;bi&|g.\u0003\u0002e?\n\tRO\\2iK\u000e\\W\r\u001a,be&\fgnY3\u0002\u001d\r|\u0007/\u001f\u0013eK\u001a\fW\u000f\u001c;%eU\tqM\u000b\u0002I9\u0006i\u0001O]8ek\u000e$\bK]3gSb,\u0012A\u001b\t\u0003WBl\u0011\u0001\u001c\u0006\u0003[:\fA\u0001\\1oO*\tq.\u0001\u0003kCZ\f\u0017B\u0001\u001fm\u00031\u0001(o\u001c3vGR\f%/\u001b;z\u00039\u0001(o\u001c3vGR,E.Z7f]R$\"\u0001^\u0011\u0007mtH/D\u0001}\u0015\tix%\u0001\u0006d_2dWm\u0019;j_:L!a ?\u0003\u0011%#XM]1u_J\f\u0001bY1o\u000bF,\u0018\r\u001c\u000b\u0005\u0003\u000b\tY\u0001E\u0002'\u0003\u000fI1!!\u0003(\u0005\u001d\u0011un\u001c7fC:Dq\u0001R\b\u0002\u0002\u0003\u0007A/\u0001\u0005iCND7i\u001c3f)\u0005A\u0015\u0001\u0003;p'R\u0014\u0018N\\4\u0015\u0003)\fa!Z9vC2\u001cH\u0003BA\u0003\u00033Aq\u0001\u0012\n\u0002\u0002\u0003\u0007A/\u0001\u0004QKJ\u001cxN\u001c\t\u0003%R\u0019B\u0001FA\u0011]A9\u00111EA\u0015g!\u000bVBAA\u0013\u0015\r\t9cJ\u0001\beVtG/[7f\u0013\u0011\tY#!\n\u0003#\u0005\u00137\u000f\u001e:bGR4UO\\2uS>t'\u0007\u0006\u0002\u0002\u001e\u0005)\u0011\r\u001d9msR)\u0011+a\r\u00026!)\u0011g\u0006a\u0001g!)ai\u0006a\u0001\u0011\u00069QO\\1qa2LH\u0003BA\u001e\u0003\u000f\u0002RAJA\u001f\u0003\u0003J1!a\u0010(\u0005\u0019y\u0005\u000f^5p]B)a%a\u00114\u0011&\u0019\u0011QI\u0014\u0003\rQ+\b\u000f\\33\u0011!\tI\u0005GA\u0001\u0002\u0004\t\u0016a\u0001=%a\u0005Y!/Z1e%\u0016\u001cx\u000e\u001c

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表