scala中的trait(特征)

                                                                    
 一.java中的接口不是面向对象的只是对多继承的一种补充 而scala是纯面向对象的所以使用trait(特征)相当于java中interface+abstract class


二.scala的没有implements关键字,它使用extends关键字实现trait


三.scala沿用也java的库所以scala中java的所有库可以当做trait来使用
    trait Cloneable extends java.lang.Cloneable

四.scala也是单继承的使用trait满足了多继承的要求


   1. 没有父类 class  类名   extends   特质1   with    特质2   with   特质3 ..
   2. 有父类class  类名   extends   父类   with  特质1   with   特质2   with 特质3
   3. 实战


 五.trait 可以拥有抽象方法也可以拥有实现的方法(我们将scala的class文件反编译成java文件了解底层原理)


 1.底层原理  抽象方法和 具体实现方法 被封装在不同的地方当中
      a.具体来说抽象方法和具体实现方法的抽象方法放在一个接口这个接口名就是我们声明的特征名
      b.具体实现就放在了另一个抽象类中(并定义为一个静态方法方便调用)
      c.当我们在scala中继承特质时,底层会自动将实现方法的抽象方法给实现(即调用抽象类的静态方法)

 2.源码

 

package edu.lulu.oop.chapter6

object Test11 {
  def main(args: Array[String]): Unit = {

    var a = new MyTrait01
    a.test00()
    a.test01()
  }
}


class MyTrait01 extends MyTrait{

  override def test00(): Unit = {
    println("test02")
  }
}



trait MyTrait{

  def test00()//定义一个抽象方法

  def test01(): Unit ={
    println("tees01")
  }

}

3.反编译产生的文件

    a.

    b.

package edu.lulu.oop.chapter6;

import scala.Predef.;

public abstract class MyTrait$class
{
  public static void test01(MyTrait $this)
  {
    Predef..MODULE$.println("tees01");
  }

  public static void $init$(MyTrait $this)
  {
  }
}




--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


package edu.lulu.oop.chapter6;

import scala.Predef.;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001\0012A!\001\002\001\027\tIQ*\037+sC&$\b'\r\006\003\007\021\t\001b\0315baR,'O\016\006\003\013\031\t1a\\8q\025\t9\001\"\001\003mk2,(\"A\005\002\007\025$Wo\001\001\024\007\001a!\003\005\002\016!5\taBC\001\020\003\025\0318-\0317b\023\t\tbB\001\004B]f\024VM\032\t\003'Qi\021AA\005\003+\t\021q!T=Ue\006LG\017C\003\030\001\021\005\001$\001\004=S:LGO\020\013\0023A\0211\003\001\005\0067\001!\t\005H\001\007i\026\034H\017\r\031\025\003u\001\"!\004\020\n\005}q!\001B+oSR\004")
public class MyTrait01
  implements MyTrait
{
  public void test01()
  {
    MyTrait.class.test01(this);
  }
  public void test00() { Predef..MODULE$.println("test02"); }


  public MyTrait01()
  {
    MyTrait.class.$init$(this);
  }
}


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


package edu.lulu.oop.chapter6;

import scala.Predef.;
import scala.reflect.ScalaSignature;

@ScalaSignature(bytes="\006\001\0012A!\001\002\001\027\tIQ*\037+sC&$\b'\r\006\003\007\021\t\001b\0315baR,'O\016\006\003\013\031\t1a\\8q\025\t9\001\"\001\003mk2,(\"A\005\002\007\025$Wo\001\001\024\007\001a!\003\005\002\016!5\taBC\001\020\003\025\0318-\0317b\023\t\tbB\001\004B]f\024VM\032\t\003'Qi\021AA\005\003+\t\021q!T=Ue\006LG\017C\003\030\001\021\005\001$\001\004=S:LGO\020\013\0023A\0211\003\001\005\0067\001!\t\005H\001\007i\026\034H\017\r\031\025\003u\001\"!\004\020\n\005}q!\001B+oSR\004")
public class MyTrait01
  implements MyTrait
{
  public void test01()
  {
    MyTrait.class.test01(this);
  }
  public void test00() { Predef..MODULE$.println("test02"); }


  public MyTrait01()
  {
    MyTrait.class.$init$(this);
  }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scala,Seq是一个序列,它是有序的且可重复的。它是一个trait,有许多实现,如List、Array、Vector、Queue等等。 以下是Seq的基本用法: 1. 创建Seq 可以使用以下方式创建一个Seq: ```scala val seq1 = Seq(1, 2, 3) val seq2 = Seq("a", "b", "c") ``` 2. 访问元素 可以使用索引访问Seq的元素: ```scala val seq = Seq(1, 2, 3) println(seq(0)) // 输出1 println(seq(1)) // 输出2 println(seq(2)) // 输出3 ``` 3. 遍历Seq 可以使用for循环遍历Seq的元素: ```scala val seq = Seq(1, 2, 3) for (i <- seq) { println(i) } ``` 也可以使用foreach方法: ```scala val seq = Seq(1, 2, 3) seq.foreach(i => println(i)) ``` 4. 追加元素 可以使用:+操作符追加元素到Seq的末尾: ```scala val seq1 = Seq(1, 2, 3) val seq2 = seq1 :+ 4 println(seq2) // 输出Seq(1, 2, 3, 4) ``` 5. 过滤元素 可以使用filter方法过滤Seq的元素: ```scala val seq = Seq(1, 2, 3, 4, 5) val filtered = seq.filter(_ % 2 == 0) println(filtered) // 输出Seq(2, 4) ``` 6. 转换元素 可以使用map方法转换Seq的元素: ```scala val seq = Seq(1, 2, 3) val transformed = seq.map(_ * 2) println(transformed) // 输出Seq(2, 4, 6) ``` 7. 合并Seq 可以使用++操作符合并两个Seq: ```scala val seq1 = Seq(1, 2, 3) val seq2 = Seq(4, 5, 6) val merged = seq1 ++ seq2 println(merged) // 输出Seq(1, 2, 3, 4, 5, 6) ``` 以上是Seq的基本用法。Seq还有很多其他的方法可以使用,可以查看Scala官方文档获得更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值