`
shangboz
  • 浏览: 14280 次
文章分类
社区版块
存档分类
最新评论

Java VS Scala(三)java接口(Interface)和scala特质(Trait)

阅读更多

java8之前规定java接口只能有方法定义,不能有方法实现,java8之后增加了函数式接口,函数式接口可以有一个带实现的抽象方法,scala的特质跟java的接口有点类似,但是没有java代码那样的方法实现数量限制

 

1.接口不会有构造器,特质可以有构造器,并且在实现类继承特质的时候,先要调用特质的构造器。

2.接口中不能有未初始化的属性,且属性的修饰都是public static final,特质中可以有未初始化的属性变量,即抽象字段

3.类实现implements多个接口,且用逗号“,”隔开,类继承extends多个trait且用with隔开。

4.Java中接口不能继承普通类,但是scala中特质可以extends class,并且该类成为所有继承trait的类的父类

实际的我们看例子:

public interface JavaInterface {

    default void test(String agg) {
        System.out.println("Interface test");
    }
}

public class JavaInterfaceImpl implements JavaInterface {

    public void test2(String args) {
        test("Java interface test: " + args);

        System.out.println("Java interface impl test" + args );
    }

    public static void main(String args[]) {
        JavaInterfaceImpl javaInterface = new JavaInterfaceImpl();
        javaInterface.test("11111");
        javaInterface.test2("11111");
    }
}
运行结果:
Interface test
Interface test
Java interface impl test11111

 

 

trait ScalaTraitTest {

  val name:String//抽象字段
  println("name: "+name)//特质中构造器执行的语句

  def test(arg:String) ={
    println(s"Scala Trait test $arg")
  }

  def test2(arg:String, arg2:String) ={
    println(s"Scala Trait test2 $arg, $arg2")
  }

}

class ScalaTraitClass() extends {
  val name = "jack"
} with ScalaTraitTest {

  def test3(arg3:String) ={
  test(arg3)
  test2(arg3, "2222")
  println(s"Scala Trait class test 3 $arg3")

  }
}

object ScalaTraitClass {

  def main(args: Array[String]): Unit = {
    val classTest = new ScalaTraitClass

    classTest.test3("33333")
  }
}
运行结果:
name: jack
Scala Trait test 33333
Scala Trait test2 33333, 2222
Scala Trait class test 3 33333

 执行结果首先打印name: jack

 

通过上面的例子,我们反推一下具体的原因,还从class文件入手,通过反编译class文件查看其实际运行

java的函数式接口反编译后是一个abstract interface,其接口的本质没有改变

 

import java.io.PrintStream;

public abstract interface JavaInterface
{
  public void test(String agg)
  {
    System.out.println("Interface test");
  }
}
 但是scala的特质反编译后有两个class文件,ScalaTraiteTest.class和ScalaTraiteTest$class.class,ScalaTraiteTest$class.class是abstrac class,这里有$init$函数,就是一个构造器,ScalaTraiteTest.class是一个abstract interface

 

 

import scala.reflect.ScalaSignature;

public abstract interface ScalaTraitTest
{
  public abstract String name();
  
  public abstract void test(String paramString);
  
  public abstract void test2(String paramString1, String paramString2);
}
 

 

 

import scala.Predef.;
import scala.StringContext;
import scala.collection.mutable.StringBuilder;

public abstract class ScalaTraitTest$class
{
  public static void $init$(ScalaTraitTest $this)
  {
    Predef..MODULE$.println(new StringBuilder().append("name: ").append($this.name()).toString());
  }
  
  public static void test(ScalaTraitTest $this, String arg)
  {
    Predef..MODULE$.println(new StringContext(Predef..MODULE$.wrapRefArray((Object[])new String[] { "Scala Trait test ", "" })).s(Predef..MODULE$.genericWrapArray(new Object[] { arg })));
  }
  
  public static void test2(ScalaTraitTest $this, String arg, String arg2)
  {
    Predef..MODULE$.println(new StringContext(Predef..MODULE$.wrapRefArray((Object[])new String[] { "Scala Trait test2 ", ", ", "" })).s(Predef..MODULE$.genericWrapArray(new Object[] { arg, arg2 })));
  }
}
 

 

 我们再看其实现类ScalaTraitClass,ScalaTraitClass类确实实现了ScalaTraitTest接口,但是做了很多的事情,首先他的构造里调用了ScalaTraitTest$class的构造器,这跟java类的构造流程一样;其次,ScalaTraitClass里面实现了接口定义的方法test和test2,但是内部实现是分别调用ScalaTraitTest$class的test和test2方法

 

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

public class ScalaTraitClass
  implements ScalaTraitTest
{
  private final String name;
  
  public void test(String arg)
  {
    ScalaTraitTest.class.test(this, arg);
  }
  
  public void test2(String arg, String arg2)
  {
    ScalaTraitTest.class.test2(this, arg, arg2);
  }
  
  public String name()
  {
    return this.name;
  }
  
  public ScalaTraitClass()
  {
    ScalaTraitTest.class.$init$(this);
  }
  
  public void test3(String arg3)
  {
    test(arg3);
    test2(arg3, "2222");
    Predef..MODULE$.println(new StringContext(Predef..MODULE$.wrapRefArray((Object[])new String[] { "Scala Trait class test 3 ", "" })).s(Predef..MODULE$.genericWrapArray(new Object[] { arg3 })));
  }
}

 

这样来看就清晰了很多,Scala的特质是把java的抽象类和接口特性揉在了一起,这样给编程带来了很大的灵活性也方便了很多。

分享到:
评论

相关推荐

    Scala Trait(特质).html

    2.特质用于在类之间共享程序接口和字段,类似Java接口 3.特质是字段和方法的集合,可以提供字段和方法实现 4.类和单例对象都可以扩展特质(extends) 5.特质不能被实例化,因此没有构造参数,类似Java接口 6.特质...

    scala和java混合编译

    在现代软件开发中,Java和Scala是两种广泛使用的编程语言。它们各有特色,Java以其稳定性和广泛的社区支持而著名,Scala则以其强大的函数式编程特性及对Java虚拟机(JVM)的无缝集成受到青睐。当一个项目中同时包含...

    SpringBoot + SpringData Jpa + Scala + Mysql(java+Scala混编)

    在Java项目中使用Scala,通常被称为Java和Scala的混编。这种混编允许开发团队在已有的Java项目中逐渐引入Scala代码,以利用其优势,同时保持与现有Java代码的兼容性。在实际应用中,可能会在服务端逻辑或者特定组件...

    面向Java开发人员的Scala指南

    类、继承和接口依然存在,但Scala通过特质来提供更加灵活的多重继承解决方案。同时,Scala的case类简化了创建轻量级数据结构的过程。 4. **模式匹配**:Scala的模式匹配是其一大特色,它允许开发者在条件语句中对值...

    面向Java开发人员Scala指南,Scala和servlet的比较

    Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,为Java开发者提供了一种更高效、更简洁的编程选择。在Java开发领域,Servlet是用于构建Web应用程序的标准API,广泛应用于服务器端编程。本...

    2018 Scala for Java Developers: A Practical Primer

    Master the fundamentals of Scala and understand its emphasis on functional programming that sets it apart from Java. This book will help you translate what you already know in Java to Scala to start ...

    基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip

    基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于...

    Scala—— 10.trait特质(接口)(未完待续)

    在Scala编程语言中,接口这一概念并不存在,取而代之的是特质(Trait),它结合了接口和抽象类的功能。特质是一种定义行为的蓝图,可以被多个类共享,从而实现多态性。Scala中的trait关键字用于声明特质,其基本结构...

    基于maven的scala与java相互调用的简单实例

    本示例着重讲解如何在Java和Scala之间进行互调用,这是基于Maven构建系统的。Maven是Apache开发的项目管理工具,它可以帮助开发者管理项目的构建、依赖关系以及文档的生成。在Java和Scala的混合开发环境中,Maven...

    scala java相关开发工具

    标题中的“Scala Java相关开发工具”表明我们讨论的是与Java和Scala编程语言相关的开发环境和工具。Java和Scala都是在JVM(Java虚拟机)上运行的语言,它们有着紧密的联系,但各自拥有独特的特性和用途。 首先,...

    基于Java和Scala的DAF4J设计源码:数据访问简化与统一接口实现

    该项目是一款名为DAF4J的Java与Scala混合编写的...项目总文件量为135个,其中包含112个Java源文件、11个Scala源文件、4个XML配置文件、3个Markdown文件、2个文本文件、1个Git忽略文件、1个许可证文件和1个属性文件。

    基于Java、Scala和Spark的数据处理与分析设计源码

    本资源提供了一套基于Java、Scala和Spark的数据处理与分析设计源码,包含1381个文件,其中包括634个CRC文件,316个BK文件,35个Class字节码文件,20个XML配置文件,15个Java源代码文件,13个JAR打包文件,8个...

    scala-java8-compat_2.11-0.7.0-API文档-中英对照版.zip

    赠送jar包:scala-java8-compat_2.11-0.7.0.jar; 赠送原API文档:scala-java8-compat_2.11-0.7.0-javadoc.jar; 赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-...

    为Java虚拟机编译Scala(Michel Schinz)Compiling Scala for the Java Virtual Machine (Michel Schinz)

    例如,Scala的trait如何通过接口和具体类实现等。 ### 总结 由于文档是通过OCR扫描,一些细节可能缺失或不精确。但从提供的信息可以看出,为Java虚拟机编译Scala涉及了编程语言设计的深层次概念,如mixin继承、...

    scala-java8-compat_2.11-0.7.0-API文档-中文版.zip

    赠送jar包:scala-java8-compat_2.11-0.7.0.jar; 赠送原API文档:scala-java8-compat_2.11-0.7.0-javadoc.jar; 赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-...

    scala sdk scala-2.12.3

    8. **面向对象编程**:Scala支持传统的类、继承、封装和多态性,同时也引入了特质(trait),可以用来实现混合类型和行为。 9. **函数式编程**:函数在Scala中是一等公民,可以作为参数传递,也可以作为返回值。...

    scala trait.pptx

    scala trait.pptx

    面向Java开发者的Scala教程

    - ** Trait**:Scala的Trait类似于Java的接口,但可以包含实现,允许多重继承的模拟。 通过这个面向Java开发者的Scala教程,你可以逐步了解并掌握Scala的基本语法和特性,从而扩展你的编程技能,适应现代软件开发的...

    scala-to-java:将Scala代码转换为Java代码的命令行工具

    Scala到Java 用Scala编写的简单工具,揭示了Scala编译器的奥秘。 从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 ...

Global site tag (gtag.js) - Google Analytics