關於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的函數語言程式設計和麵向物件程式設計融合在一起,即:構造器也是方法(函式),傳遞引數和使用方法和前面的函式部分內容沒有區別。**
相關文章
- 關於建構函式與解構函式的分享函式
- 關於建構函式的一點理解函式
- 【Scala篇】--Scala中的函式函式
- 關於C++中建構函式的常見疑問C++函式
- 關於C#中建構函式的繼承的問題C#函式繼承
- 關於python建構函式的過載Python函式
- 關於function建構函式特別注意的Function函式
- C#12中的Primary Constructors(主建構函式)C#Struct函式
- 主建構函式有啥用函式
- 關於類的建構函式不能為虛擬函式的幾點理由!函式
- 關於string類的建構函式及部分方法函式
- Effective c++(筆記) 中關於建構函式、解構函式以及賦值操作符的知識C++筆記函式賦值
- 繼承中的建構函式繼承函式
- C#中的建構函式C#函式
- javascript關於Array()建構函式引數注意點JavaScript函式
- C++中建構函式,拷貝建構函式和賦值函式的詳解C++函式賦值
- 關於oracle內建函式的使用Oracle函式
- 預設建構函式、引數化建構函式、複製建構函式、解構函式函式
- 類的建構函式和解構函式函式
- 拷貝建構函式中的陷阱函式
- android中Fragment的建構函式AndroidFragment函式
- Oracle中關於函式的使用Oracle函式
- 關於qt中的tr()函式QT函式
- 建構函式與解構函式函式
- 關於“建構函式”中的幾個小問題,也許面試會問到哦~函式面試
- 建構函式中丟擲的異常函式
- 關於Java建構函式(Constructor)的常見問題總結Java函式Struct
- ## 建構函式函式
- 建構函式函式
- scala函式函式
- Kotlin 主建構函式引數的修飾符Kotlin函式
- Java的建構函式Java函式
- 建構函式的作用函式
- [譯] 建構函式已死,建構函式萬歲!函式
- 關於cuda中的函式問題函式
- C/C++——建構函式、複製建構函式和解構函式的執行時刻C++函式
- C++ 建構函式和解構函式C++函式
- dart系列之:dart類中的建構函式Dart函式