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的抽象类和接口特性揉在了一起,这样给编程带来了很大的灵活性也方便了很多。
相关推荐
2.特质用于在类之间共享程序接口和字段,类似Java接口 3.特质是字段和方法的集合,可以提供字段和方法实现 4.类和单例对象都可以扩展特质(extends) 5.特质不能被实例化,因此没有构造参数,类似Java接口 6.特质...
Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明。理解trait等价于(interface+abstract class)。 1.trait的声明...
博客配套文件,详细演示了在maven中如何混合编译java和scala共存的代码。
SpringBoot + SpringData Jpa + Scala + Mysql(java+Scala混编)
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和Spark的数据处理与分析设计源码,包含1381个文件,其中包括634个CRC文件,316个BK文件,35个Class字节码文件,20个XML配置文件,15个Java源代码文件,13个JAR打包文件,8个...
赠送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-...
功能:实现google的PageRank算法,带完整的测试数据和结果,java、scala语言版本 ********************************************************* 版本: scala2.10.4 spark 1.6.1 Scala IDE Build id: 4.4.1-vfinal...
Scala到Java 用Scala编写的简单工具,揭示了Scala编译器的奥秘。 从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 ...
Java 和 Scala 并发性基础
面向Java开发人员的Scala指南 面向Java开发人员的Scala指南
Java电商大数据项目-推荐系统(java和scala语言) Bump spark.version from 2.1.0 to 2.4.7 in /MySparkProject dependencies #6 by dependabot bot was merged 4 minutes ago Bump junit from 3.8.1 to 4.13.1 in /...
面向Java开发人员Scala指南,Scala和servlet的比较 以及一些网上资料的整理,给大家分享分享!!!
JAVA+Scala语言开发基于机器学习的商品类目预测源码+文档说明.zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,...
1、资源内容:java电商大数据项目-推荐系统(java和scala语言) 2、适用人群:计算机,电子信息工程、数学等专业的学习者,作为java实战项目,课程设计,毕业设计“参考资料”参考学习使用。 3、解压说明:本资源需要...
相当于 Ruby 的 Rack、Python 的 WSGI、Haskell 的 WAI 和 Java 的 Servlet。 示例代码: // Make your model safe and streaming by using a scalaz-stream Process def getData(req: Request): ...
本项目是一个基于Java和Scala语言开发的Spark基础教程配套源码,包含55个文件,主要文件类型包括Java源代码、Scala源代码、XML配置文件、日志文件、Git忽略文件、LICENSE文件和Idea配置文件。系统设计旨在为学习...
主要介绍了Java 和 Scala 如何调用变参,帮助大家更好的理解和学习Java与Scala,感兴趣的朋友可以了解下
可以用scala ,也可以用java,我主要的目的是用来判断汉字是否为繁体,