關於scala中的主建構函式
在前期scala的學習中我們一般新增變數時採用的是java風格的成員定義方式,例如下面的程式碼。
class Student{
var name : String = _
}
Scala會生成一個預設的建構函式和Scala風格的SetXXX(public java.lang.String name())和GetXXX(public name_(java.lang.String))。實際上Scala提供了更為簡化的成員變數和建構函式的定義方式,即將成員變數和構造方法交織在一起,例如:
object demo03 {
def main(args: Array[String]): Unit = {
}
}
class Person(var name : String,var age : Int){
}
通過對這段程式碼反編譯得到:
E:\WorkSpace\scalaFiles\target\classes\com\mo\chapter06\myconstructor>javap -private Person.class
Compiled from "demo03.scala"
public class com.mo.chapter06.myconstructor.Person {
private java.lang.String name;
private int age;
public java.lang.String name();
public void name_$eq(java.lang.String);
public int age();
public void age_$eq(int);
public com.mo.chapter06.myconstructor.Person(java.lang.String, int);
可以看到class Person(var name : String,var age : Int)做了一下三件事情:
1.定義了一個類並實現了建構函式Person(var name : String,var age : Int)。
2.定義了name和age成員變數。
3.分別生成了scala風格得Setxxx()和Getxxx()方法。
如果使用java語言來實現class Person(var name : String,var age : Int)同樣功能的話,則需要如下的程式碼。
public class demo04 {
String name ;
int age ;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public demo04(String name,int age){
this.name = name;
this.age = age;
}
}
可以看到scala只用了一行程式碼就是實現了java多行程式碼的功能。
在java語言中,如果希望在建立物件時執行某些動作,則需要在建構函式中新增相應的程式碼,但是在scala中只需要將程式碼直接放在定義的類中,例如:
object demo03 {
def main(args: Array[String]): Unit = {
val person = new Person("tom",18)
//this is a part of constructor~~~
}
}
class Person(val name :String , val age : Int){
println("this is a part of constructor~~~")
//println語句作為主構造器的一部分,在建立物件時被執行。
override def toString: String = name + " " + age
}
注意在上面的程式碼中,在Person類體中放置了一個println語句,在條語句便會作為主構造器的一部分,在建立物件時被執行,它相當於下面的java程式碼。
public class demo04 {
public static void main(String[] args) {
new demo04("tom" , 18);
}
String name ;
int age ;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
public demo04(String name,int age){
System.out.println("this is a part of constructor~~~");
this.name = name;
this.age = age;
}
}
注意:
**
- Scala構造器作用是完成對新物件的初始化,構造器沒有返回值。
- 主構造器的宣告直接放置於類名之後。
- 主構造器會執行類定義中的所有語句(把類中寫的語句放入到主構造器),這裡可以體會到Scala的函數語言程式設計和麵向物件程式設計融合在一起,即:構造器也是方法(函式),傳遞引數和使用方法和前面的函式部分內容沒有區別。**
相關文章
- 關於建構函式與解構函式的分享函式
- 關於python建構函式的過載Python函式
- 關於C++中建構函式的常見疑問C++函式
- C#12中的Primary Constructors(主建構函式)C#Struct函式
- 主建構函式有啥用函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 繼承中的建構函式繼承函式
- 類的建構函式和解構函式函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- Kotlin 主建構函式引數的修飾符Kotlin函式
- 建構函式與解構函式函式
- ## 建構函式函式
- C++ 建構函式和解構函式C++函式
- scala(三)函式函式
- 關於cuda中的函式問題函式
- Scala 的方法與函式函式
- 建構函式與普通函式的區別函式
- dart系列之:dart類中的建構函式Dart函式
- JavaScript 建構函式JavaScript函式
- 關於 js 中的回撥函式 callbackJS函式
- 關於C++當中的“模板函式”C++函式
- PHP筆記:建構函式與解構函式PHP筆記函式
- 在Scala中構建Web API的4大框架WebAPI框架
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- 建構函式之間的呼叫函式
- swoole 服務的建構函式函式
- js建構函式的繼承JS函式繼承
- 11-建構函式函式
- 初識建構函式函式
- JavaScript Date()建構函式JavaScript函式
- 建構函式建立物件函式物件
- 建構函式詳解函式
- 建構函式和類函式
- C++入門記-建構函式和解構函式C++函式
- 關於javascript中變數及函式的提升JavaScript變數函式
- 前端建構函式、原型、例項物件之間的關係前端函式原型物件
- 預設建構函式和帶預設值的建構函式不能同時存在函式
- 關於count函式的理解函式