Câu trả lời:
Không, Java không hỗ trợ quá tải toán tử do người dùng định nghĩa. Khía cạnh duy nhất của Java gần với quá tải toán tử "tùy chỉnh" là việc xử lý + cho các chuỗi, dẫn đến kết hợp thời gian biên dịch của các hằng số hoặc nối thời gian thực hiện bằng StringBuilder / StringBuffer. Mặc dù vậy, bạn không thể xác định toán tử riêng của mình hoạt động theo cùng một cách.
Đối với một ngôn ngữ Java như (và JVM-based) mà không điều hành hỗ trợ quá tải, bạn có thể nhìn vào Kotlin hay Groovy . Ngoài ra, bạn có thể tìm thấy may mắn với giải pháp plugin trình biên dịch Java .
BigInteger
trong Java, sau đó xem mã tương tự bằng BigInteger
cách sử dụng toán tử trong C #. Tôi không thấy các đại biểu phá vỡ các nguyên tắc OOP - bạn cần chính xác hơn nhiều so với các phản đối của bạn. Tôi không biết chi tiết lý do tại sao các nhà thiết kế Java không bao gồm các tính năng khác nhau, nhưng tôi nghi ngờ có sự pha trộn giữa áp lực tài nguyên và mong muốn giữ cho ngôn ngữ nhỏ và tương đối đơn giản.
m0
như một Matrix
và v0
, v1
, v2
, v3
, và v4
như Vector
s, chỉ cần so sánh bao lâu nó sẽ đưa bạn đến một cách chính xác giải thích các biểu thức toán học sau m0.transpose().mult(v0.add(v1.mult(v2)).cross(v3)).sub(v4);
. Đã bao gồm hỗ trợ cho quá tải toán tử, nó có thể được viết là m0.transpose() * (v0 + v1 * v2).cross(v3) - v4;
.
Java không cho phép quá tải toán tử. Cách tiếp cận ưa thích là xác định một phương thức trên lớp của bạn để thực hiện hành động: a.add(b)
thay vì a + b
. Bạn có thể xem tóm tắt về các bit khác mà Java bỏ qua từ C như các ngôn ngữ ở đây: Các tính năng bị xóa khỏi C và C ++
Bạn không thể tự làm điều này vì Java không cho phép quá tải toán tử.
Tuy nhiên, với một ngoại lệ. + và + = bị quá tải cho các đối tượng String.
&
, |
và ^
là quá tải cho boolean
các loại và tích phân. Và thực tế, các toán tử số học và quan hệ bị quá tải cho các loại số khác nhau. (Tất nhiên, ngữ nghĩa của tình trạng quá tải gần hơn nhiều ...)
Như nhiều người khác đã trả lời: Java không hỗ trợ quá tải toán tử do người dùng định nghĩa.
Có thể đây là ngoài chủ đề, nhưng tôi muốn bình luận về một số điều tôi đọc trong một số câu trả lời.
Về khả năng đọc.
Đối chiếu:
Nhìn lại!
Cái nào dễ đọc hơn?
Một ngôn ngữ lập trình cho phép tạo ra các loại do người dùng xác định, sẽ cho phép chúng hoạt động giống như các loại tích hợp (hoặc các kiểu nguyên thủy).
Vì vậy, Java phá vỡ một nguyên tắc cơ bản của Lập trình chung:
Chúng ta sẽ có thể trao đổi các đối tượng của các kiểu dựng sẵn với các đối tượng của các kiểu do người dùng định nghĩa.
(Bạn có thể tự hỏi: "Anh ấy có nói 'đối tượng tích hợp' không?". Vâng, xem tại đây .)
Về nối chuỗi:
Các nhà toán học sử dụng ký hiệu + cho các phép toán giao hoán trên các tập hợp.
Vì vậy, chúng ta có thể chắc chắn rằng a + b = b + a.
Nối chuỗi (trong hầu hết các ngôn ngữ lập trình) không tôn trọng ký hiệu toán học phổ biến này.
a := "hello"; b := "world"; c := (a + b = b + a);
hoặc trong Java:
String a = "hello"; String b = "world"; boolean c = (a + b).equals(b + a);
Thêm:
Lưu ý làm thế nào trong sự bình đẳng và nhận dạng Java bị nhầm lẫn. Ký hiệu == (đẳng thức) có nghĩa là:
a. Bình đẳng cho các loại nguyên thủy.
b. Do đó, kiểm tra danh tính cho các loại do người dùng xác định, do đó, chúng tôi buộc phải sử dụng hàm bằng () cho đẳng thức.
Nhưng ... Điều này có liên quan gì đến việc quá tải toán tử?
Nếu ngôn ngữ cho phép toán tử quá tải, người dùng có thể đưa ra ý nghĩa chính xác cho toán tử đẳng thức.
==
được sử dụng cho sự bình đẳng trong Java, như trong C và C ++. Điều này không có gì để làm với quá tải toán tử.
Người ta có thể thử quá tải toán tử Java . Nó có những hạn chế riêng, nhưng nó đáng để thử nếu bạn thực sự muốn sử dụng quá tải toán tử.
Chỉ cần sử dụng Xtend cùng với mã Java của bạn. Nó hỗ trợ quá tải toán tử:
package com.example;
@SuppressWarnings("all")
public class Test {
protected int wrapped;
public Test(final int value) {
this.wrapped = value;
}
public int operator_plus(final Test e2) {
return (this.wrapped + e2.wrapped);
}
}
package com.example
class Test2 {
new() {
val t1 = new Test(3)
val t2 = new Test(5)
val t3 = t1 + t2
}
}
Trên trang web chính thức, có một danh sách các phương pháp để thực hiện cho mỗi nhà khai thác!
Hoặc, bạn có thể tạo Java Groovy và chỉ cần quá tải các hàm này để đạt được những gì bạn muốn
//plus() => for the + operator
//multiply() => for the * operator
//leftShift() = for the << operator
// ... and so on ...
class Fish {
def leftShift(Fish fish) {
print "You just << (left shifted) some fish "
}
}
def fish = new Fish()
def fish2 = new Fish()
fish << fish2
Ai không muốn / sử dụng Groovy? : D
Không, bạn không thể sử dụng các JAR Groovy đã biên dịch trong Java theo cùng một cách. Nó vẫn là một lỗi biên dịch cho Java.
Không giống như C ++, Java không hỗ trợ quá tải toán tử do người dùng định nghĩa. Quá tải được thực hiện trong nội bộ java.
Chúng ta có thể lấy +
(cộng) ví dụ:
int a = 2 + 4;
string = "hello" + "world";
Ở đây, cộng thêm hai số nguyên và nối hai chuỗi. Vì vậy, chúng ta có thể nói rằng Java hỗ trợ quá tải toán tử nội bộ nhưng không do người dùng định nghĩa.