摘要:本文将简要介绍Java中的接口(interface),Java 8中接口default方法,以及Scala中的特质(trait),同时会比较Java接口与Scala特质的相似与差异。
1. Java 接口 (interface) 介绍
1.1 Java传统的接口 (interface)
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化。
Java接口的方法只能是抽象的和公开的,Java接口不能有构造器,Java接口可以有public、静态的和final属性。即接口中的属性可以定义为 public static final int value=5;
假设我们有用于记录日志的Logger接口,有两种不同的实现方式,一种是输出的到Console,一种是输出到文件。
以下为参考实现:
Logger接口 (interface):
publicinterface Logger {
//only public, static and final property is permitted
publicstaticfinalintmaxLength = 50;
//only public and abstract method
publicabstractvoid log(String msg);
}
ConsoleLogger输出到Console:
publicclass ConsoleLogger implements Logger {
@Override
publicvoid log(String msg) {
System.out.println(msg);
}
}
FileLogger输出到文件:
publicclass FileLogger implements Logger {
private PrintWriter fileOutput;
public FileLogger () {
try {
fileOutput = new PrintWriter("app。log");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
publicvoid log(String msg) {
fileOutput.println(msg);
fileOutput.flush();
}
}
1.2 Java 8中的interface
Java 8 允许我们使用default关键字,为接口声明添加非抽象的方法实现。
publicinterface Logger {
//only public, static and final property is permitted
publicstaticfinalintmaxLength = 50;
//Java 8 interface default implementation
publicdefaultvoid log(String msg) {
//You could implement default log behavior here
//......
}
}
可以在实现类中改变它接口中的缺省行为和实现:
publicclass ConsoleLogger implements Logger {
//Change default log behavior here
@Override
publicvoid log(String msg) {
System.out.println(msg);
}
}
Java 8之后的interface可以包含包含abstract方法,也可以都是default方法。
2. Scala 特质 (trait) 介绍
Scala中的特质 (trait) 和Java 8中的接口 (interface) 比较类似,一个Scala类可以扩展一个或多个特质,Scala特质可以给出方法的缺省实现。
2.1 纯接口的特质
traitLogger {
//abstract method, but no abstract declare required
deflog(msg: String)
}
你不需要将方法声明为abstract,特质中未被实现的方法默认就是抽象的。
//Use extends but not implements
classConsoleLoggerextendsLogger {
//no override required
deflog(msg: String) {
println(msg)
}
}
在重写特质的抽象方法时不需要给出override关键字
2.2 带缺省实现的特质
traitConsoleLogger {
//with implementation
deflog(msg: String) { println(msg) }
}
带有实现方法的特质类似于Java 8接口中的缺省方法。
以下是如何使用这个特质的示例:
class Circle extends Shape withConsoleLogger {
def draw() {
log(“Draw a circle …”);
//draw circle here
……
}
}
在Scala中,我们说ConsoleLogger的功能被“混入”了Circle类中。
2.3 带有特质的对象
Scala可以在创建对象时添加特质,这是Java接口所不具备的特性。
缺省的log方法什么没做:
traitLogger {
deflog(msg: String) { }
}
下面使用这个特质的Class什么日志都不会被记录:
class Circle extends Shape withLogger{
def draw() {
log(“Draw a circle …”);
//draw circle here
}
}
你可以实现一个更好的Logger特质,并在创建Circle对象是动态“混入”此特质。
traitConsoleLoggerextendsLogger {
overridedeflog(msg: String) { println(msg) }
}
val circle1 = new CirclewithConsoleLogger
这样circle在调用draw方法时,ConsoleLogger的log方法会被执行。
类似的,你可以在另一个对象加入另外一个特质:
val circle2 = new CirclewithFileLogger
2.4 叠加在一起的特质
就像Java Class可以实现多个接口一样,Scala Class也可以叠加多个特质,一般来说,特质从最后一个开始被处理。
假设有如下的Logger trait定义,分别有3个trait扩展自Logger。
traitLogger {
deflog(msg: String) { }
}
traitConsoleLogger extends Logger {
overridedeflog(msg: String) { println(msg) }
}
traitTimestampLoggerextends Logger {
overridedeflog(msg: String) { super.log(new Date() + “ “ + msg) }
}
traitShortLoggerextends Logger {
val maxLength = 15
overridedeflog(msg: String) {
super.log( if(msg.length<= maxLength) msg else msg.substring(0,
maxLength-3) + “…” )
}
}
上述log方法都将修改过的msg传递给super.log.
实际上,super.log调用的是特质层级中的下一个特质,具体是哪一个,取决于特质添加的顺序。一般来说,特质从最后一个开始被处理。
可以通过如下方式添加混入特质:
val circle1 = new CirclewithConsoleLogger with TimestampLogger with ShortLogger
此例中,ShortLogger的log方法先被执行,然后才是TimestampLogger的log方法。
val circle2 = new CirclewithConsoleLogger with ShortLogger with TimestampLogger
此例中,TimestampLogger的log方法先被执行,然后才是ShortLogger的log方法。
3. Java接口 (interface) 与Scala特质 (trait) 比较
通过上面对Java接口和Scala特质的学习,我们发现它们之间有很多的相似性,同时也有差别。
相似性:
Java接口和Scala特质都可以包含抽象方法和具体实现;
Scala和Java一样都不允许类从多个超类继承,但分别可以叠加多个特质和实现多个接口;
差异性:
Java只能在Class层面添加接口的实现,Scala可以在Class和对象层面“混入”特质。Scala通过在对象层面动态“混入”特质,相比而言具有更大的灵活性。
相关推荐
1.Scala中没有接口(interface)的概念 2.特质用于在类之间共享程序接口和字段,类似Java接口 3.特质是字段和方法的集合,可以提供字段和方法实现 4.类和单例对象都可以扩展特质(extends) 5.特质不能被实例化,...
此外,Scala还支持类型别名、特质(trait)和隐式转换,这些都是Java中没有的概念。 2. **函数式编程**:Scala鼓励函数式编程风格,支持不可变数据结构、柯里化函数和高阶函数。这些特性使得代码更加简洁,更易于...
在Scala编程语言中,接口这一概念并不存在,取而代之的是特质(Trait),它结合了接口和抽象类的功能。特质是一种定义行为的蓝图,可以被多个类共享,从而实现多态性。Scala中的trait关键字用于声明特质,其基本结构...
在面向对象编程方面,Scala引入了特质(Traits),这是一种类似于Java接口但可以包含具体方法和变量的结构。特质可以被用来实现多重继承,避免了Java中的"菱形问题"。此外,Scala还支持匿名类和对象,使得代码更加...
Learn Scala is split into four parts: a tour of Scala, a comparison between Java and Scala, Scala-specific features and functional programming idioms, and finally a discussion about adopting Scala in...
scala trait.pptx
7. **组合与继承**:Scala支持传统的继承机制,同时还提供了一种称为“特质”的机制,类似于Java中的接口,但功能更加强大,可以包含具体的方法实现。 8. **Scala的层次结构**:Scala有一套完整的类层次结构,所有的...
此外,Scala 还引入了特质(trait),作为接口和类的混合体,可以用来实现多重继承。 2. **函数式编程**:Scala 具有丰富的函数式编程特性,如高阶函数、柯里化(currying)、闭包和尾递归。这对于处理并发和复杂...
Scala是一种强大的多范式编程语言,它融合了面向对象和函数式编程的特性,为Java开发者提供了一种更高效、更简洁的编程选择。在Java开发领域,Servlet是用于构建Web应用程序的标准API,广泛应用于服务器端编程。本...
Then, we will provide a comparative analysis of Java and Scala. Finally, we will dive into Scala programming to get started with Scala. Chapter 2, Object-Oriented Scala, says that the object-oriented ...
在现代软件开发中,Java和Scala是两种广泛使用的编程语言。它们各有特色,Java以其稳定性和广泛的社区支持而著名,Scala则以其强大的函数式编程特性及对Java虚拟机(JVM)的无缝集成受到青睐。当一个项目中同时包含...
scala-js-java-time, 在JDK8中,java.time的Scala.js 实现 scalajs-java-time scalajs-java-time 是用于的java.time API的bsd许可 reimplementation,它支持在 Scala.js 项目中使用这里 API 。用法只需将以
本示例着重讲解如何在Java和Scala之间进行互调用,这是基于Maven构建系统的。Maven是Apache开发的项目管理工具,它可以帮助开发者管理项目的构建、依赖关系以及文档的生成。在Java和Scala的混合开发环境中,Maven...
例如,Scala的trait如何通过接口和具体类实现等。 ### 总结 由于文档是通过OCR扫描,一些细节可能缺失或不精确。但从提供的信息可以看出,为Java虚拟机编译Scala涉及了编程语言设计的深层次概念,如mixin继承、...
Java、Groovy、Scala和Kotlin是四种在Java平台上广泛使用的编程语言,它们各自具有独特的特点和优势。这里我们将深入探讨这四种语言的核心特性,并对比它们在实际开发中的应用。 首先,Java作为最古老的成员,自...
- ** Trait**:Scala的Trait类似于Java的接口,但可以包含实现,允许多重继承的模拟。 通过这个面向Java开发者的Scala教程,你可以逐步了解并掌握Scala的基本语法和特性,从而扩展你的编程技能,适应现代软件开发的...
在本压缩包中,我们关注的是Java、Hadoop、Scala和Spark这四个技术在Windows 10环境下的配置。这些工具广泛应用于大数据处理和分析领域,尤其是Spark在现代数据科学中扮演了重要角色。让我们逐一深入理解这些技术...
Scala到Java 用Scala编写的简单工具,揭示了Scala编译器的奥秘。 从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 ...