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.特质...
在现代软件开发中,Java和Scala是两种广泛使用的编程语言。它们各有特色,Java以其稳定性和广泛的社区支持而著名,Scala则以其强大的函数式编程特性及对Java虚拟机(JVM)的无缝集成受到青睐。当一个项目中同时包含...
在Java项目中使用Scala,通常被称为Java和Scala的混编。这种混编允许开发团队在已有的Java项目中逐渐引入Scala代码,以利用其优势,同时保持与现有Java代码的兼容性。在实际应用中,可能会在服务端逻辑或者特定组件...
类、继承和接口依然存在,但Scala通过特质来提供更加灵活的多重继承解决方案。同时,Scala的case类简化了创建轻量级数据结构的过程。 4. **模式匹配**:Scala的模式匹配是其一大特色,它允许开发者在条件语句中对值...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,为Java开发者提供了一种更高效、更简洁的编程选择。在Java开发领域,Servlet是用于构建Web应用程序的标准API,广泛应用于服务器端编程。本...
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基于...
在Scala编程语言中,接口这一概念并不存在,取而代之的是特质(Trait),它结合了接口和抽象类的功能。特质是一种定义行为的蓝图,可以被多个类共享,从而实现多态性。Scala中的trait关键字用于声明特质,其基本结构...
本示例着重讲解如何在Java和Scala之间进行互调用,这是基于Maven构建系统的。Maven是Apache开发的项目管理工具,它可以帮助开发者管理项目的构建、依赖关系以及文档的生成。在Java和Scala的混合开发环境中,Maven...
标题中的“Scala Java相关开发工具”表明我们讨论的是与Java和Scala编程语言相关的开发环境和工具。Java和Scala都是在JVM(Java虚拟机)上运行的语言,它们有着紧密的联系,但各自拥有独特的特性和用途。 首先,...
该项目是一款名为DAF4J的Java与Scala混合编写的...项目总文件量为135个,其中包含112个Java源文件、11个Scala源文件、4个XML配置文件、3个Markdown文件、2个文本文件、1个Git忽略文件、1个许可证文件和1个属性文件。
本资源提供了一套基于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-...
例如,Scala的trait如何通过接口和具体类实现等。 ### 总结 由于文档是通过OCR扫描,一些细节可能缺失或不精确。但从提供的信息可以看出,为Java虚拟机编译Scala涉及了编程语言设计的深层次概念,如mixin继承、...
赠送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-...
8. **面向对象编程**:Scala支持传统的类、继承、封装和多态性,同时也引入了特质(trait),可以用来实现混合类型和行为。 9. **函数式编程**:函数在Scala中是一等公民,可以作为参数传递,也可以作为返回值。...
scala trait.pptx
- ** Trait**:Scala的Trait类似于Java的接口,但可以包含实现,允许多重继承的模拟。 通过这个面向Java开发者的Scala教程,你可以逐步了解并掌握Scala的基本语法和特性,从而扩展你的编程技能,适应现代软件开发的...
Scala到Java 用Scala编写的简单工具,揭示了Scala编译器的奥秘。 从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 ...