Dấu gạch dưới thực sự làm gì trong mã Java này? [đóng cửa]


81

Tôi mới bắt đầu học Java.

Bạn của tôi, người đang giúp tôi học tập vừa gửi cho tôi cái này và nói 'hãy tìm ra cái này'.

Rất tiếc, tôi không thể đọc cái này. Nó trông giống như Perl đối với tôi.

class _{_ _;_(){_=this;}}

Nó có nghĩa là gì?


17
Câu hỏi này đang được thảo luận trên meta . Hãy lập luận cho hoặc chống lại việc đóng / xóa nó ở đó.
Adam Lear

63
@anotherordinary Có lẽ bạn nên cho bạn mình trở thành giáo viên lập trình nếu anh ấy / cô ấy nghĩ rằng việc bảo bạn tìm ra điều này sẽ là một cách tốt để học ngôn ngữ này. Ghi nhớ những câu chuyện phiếm không có ích gì cả. Ít hơn nhiều khi bạn bắt đầu học một ngôn ngữ.
Enno Shioji

2
@EnnoShioji Điểm tuyệt vời. "Không liên quan". Lấy làm tiếc.
Asad Saeeduddin

1
có phải ai đó đang cố gắng tạo "IOJCC" không? (google "IOCCC")
Olivier Dulac

1
@EnnoShioji Làm thế nào là "câu đố không liên quan" này cần ghi nhớ? Bất kỳ ai tự gọi mình là lập trình viên Java đều có thể hiểu điều này một cách dễ dàng.
phant0m

Câu trả lời:


154

_là tên lớp. Nó rất khó hiểu, nhưng nó hoạt động!

Với lớp được đổi tên:

class Something {Something something;Something(){something=this;}}

Và dọn dẹp:

class Something {
    Something something;
    Something() {
        something=this;
    }
}

Và bạn có thể phát điên với cách đặt tên kỳ quặc này :)

class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__=___;}}

Trên thực tế, Unicode thậm chí còn được hỗ trợ, vì vậy điều này hợp lệ:

class 合法類別名稱{合法類別名稱(){}}

29
Cá nhân tôi thích bản chỉnh sửa của @ Alvin :)
Bartek Banachewicz

4
Có một số sai lầm trong get crazyví dụ của bạn . (1) bạn quên để thêm dấu chấm phẩy sau ____=__(hai lần), (2) nếu bạn đang cố gắng quá tải _phương pháp thì bạn cũng cần để vượt qua loại rất _(___)nên _(_ ___). Đây là cách nó có thể trông class _{_ __;_ ____;_(){__=this;____=__;}_(_ ___){__ = ___;}}. Đợi tí. Tôi vừa gỡ lỗi dấu gạch dưới? Đã đến lúc cần phanh.
Pshemo

@Pshemo Lol, tôi không bao giờ thực sự có nghĩa là phải nghiêm túc về mã mà: P cố định
tckmn

Nhận +1 cho nhận xét về câu trả lời của tôi. Không thể nghĩ ra cách khác để thưởng cho bạn.
Ed Heal

71

_ là tên lớp, dấu gạch dưới là tên biến Java hợp lệ, bạn chỉ cần thụt đầu dòng mã của mình để giải mã nó:

class _{
    _ _;
    _(){
     _=this;
   }
}

Giống:

class A{
    A A;
    A(){
     A=this;
   }
}

Chỉnh sửa: cảm ơn @Daniel Fischer

Tên kiểu và tên biến có không gian tên khác nhau. và ví dụ mã class FOO { FOO FOO; }hợp lệ trong Java.

Tóm lược

  • _ là một tên lớp, ví dụ tại class _{
  • _là tên thành viên trong lớp, ví dụ tại _ _;_=this
  • _ là một tên phương thức khởi tạo, ví dụ tại _()

Hãy nhớ rằng: Java sử dụng sáu không gian tên khác nhau:

  • Tên gói,
  • gõ tên,
  • tên trường (biến),
  • tên phương thức,
  • tên biến cục bộ (bao gồm cả tham số) và
  • nhãn.

Ngoài ra, mỗi enum được khai báo có không gian tên riêng của nó. Tên giống nhau của các loại khác nhau không xung đột; ví dụ, một phương thức có thể được đặt tên giống như một biến cục bộ .


3
Không có sai lầm. Nó biên dịch tốt như tôi đã nhập. Tôi chỉ không hiểu nó cho đến bây giờ.
một bình thường khác

2
Tên kiểu @GrijeshChauhan và tên biến có không gian tên khác nhau. class FOO { FOO FOO; }làm.
Daniel Fischer

1
Ví dụ, trong Haskell, các kiểu và giá trị cũng có các không gian tên khác nhau. Một sự khác biệt ở đó là trường hợp có ý nghĩa, tên kiểu phải bắt đầu bằng chữ hoa, vì vậy bạn không thể đặt tên cho bất kỳ giá trị cũ nào như kiểu, mà chỉ có các hàm tạo mới data Foo = Foo | Bar Inthoạt động. Tất nhiên, nó chỉ có thể hoạt động ở những ngôn ngữ mà bạn có thể tìm ra loại mã định danh từ nơi nó xuất hiện.
Daniel Fischer

2
@anotherordinary đọc câu trả lời của tôi cập nhật Tôi đã thêm một liên kết cũng
Grijesh Chauhan

2
@GrijeshChauhan Tôi thấy rồi. Cảm ơn :)
một bình thường khác

12

đó là một ví dụ tốt. Java cho phép unicode làm mã định danh để bạn có thể viết những thứ như:

classlass {
ⲥlass claѕѕ;
}

ở đây tên lớp c là 'ⲥ' (U + 2CA5 CHỮ NHỎ COPTIC SIMA) và

tên đối tượng là 'ѕ' (U + 0455 KÍCH THƯỚC CHỮ NHỎ CYRILLIC).


Bạn không thể có một biến được đặt tên class, đó là một từ khóa.
nickb

14
@nickb: nó không phải là từ khóa Java 'class'. như tôi đã đề cập rằng tên đối tượng 'claѕѕ''ss'không phải là ký tự ascii. vì vậy thực sự tên của đối tượng claѕѕcla\u0455\u0455'tôi nghĩ rằng điều này rõ ràng là hiểu lầm. :)
ashgkwd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.