Tất cả các ví dụ biên dịch (A
, B
, D
, E
) lấy chính xác cùng một lượng dung lượng lưu trữ. Thực tế, ngay cả
class F(val bar: String) extends A(bar)
sẽ có dữ liệu được lưu trữ trong một trường - nó chỉ nhận được phương thức truy cập phụ cho cùng một trường. Tuy nhiên, nếu bạn
class G(var bar: String) extends A(bar)
thì trường mới sẽ được tạo.
Bạn có thể kiểm tra tất cả các điều này bằng cách soạn thảo ví dụ của bạn ở trên và nhìn vào bytecode từ javap -c Classname
(chú ý putfield tại 2:
trong constructor của A
):
public class Sizes$A extends java.lang.Object implements scala.ScalaObject{
public java.lang.String foo();
Code:
0: aload_0
1: getfield #11; //Field foo:Ljava/lang/String;
4: areturn
public Sizes$A(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #11; //Field foo:Ljava/lang/String;
5: aload_0
6: invokespecial #18; //Method java/lang/Object."<init>":()V
9: return
}
(Và việc thiếu một putfield thêm trong F
...)
public Sizes$F(java.lang.String);
Code:
0: aload_0
1: aload_1
2: invokespecial #15; //Method Sizes$A."<init>":(Ljava/lang/String;)V
5: return
(Và sự hiện diện của một lần nữa trong G
...)
public Sizes$G(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #11; //Field bar:Ljava/lang/String;
5: aload_0
6: aload_1
7: invokespecial #18; //Method Sizes$A."<init>":(Ljava/lang/String;)V
10: return
Nguồn
2010-09-10 14:51:18
Chỉ cần lưu ý nhanh rằng cả hai phương thức var và val tạo trên các tệp lớp được tạo bởi Scala. Việc tạo ra các trường có phần mờ nhạt đối với người dùng, do đó bạn không thể dựa vào bất kỳ trường cụ thể nào được tạo ra hoặc tên của một trường như vậy. – jsuereth
cảm ơn thông tin jseureth –