Chuyển đổi và khuyến mại trong Java
Trong bài viết này, chúng tôi sẽ thảo luận về chuyển đổi nguyên thủy .
· Chuyển đổi kiểu
∘ Chuyển đổi kiểu ngầm định
∘ Chuyển đổi kiểu rõ ràng
· Quảng bá kiểu tự động trong các biểu thức
· Sự khác biệt giữa ép kiểu và ép buộc kiểu
Trong khoa học máy tính, chuyển đổi kiểu , truyền kiểu , cưỡng chế kiểu và tung hứng kiểu là những cách khác nhau để thay đổi biểu thức từ kiểu dữ liệu này sang kiểu dữ liệu khác. Một ví dụ sẽ là việc chuyển đổi một giá trị số nguyên thành một giá trị dấu phẩy động hoặc biểu diễn văn bản của nó dưới dạng một chuỗi và ngược lại. Chuyển đổi loại có thể tận dụng các tính năng nhất định của phân cấp loại hoặc biểu diễn dữ liệu. Hai khía cạnh quan trọng của chuyển đổi kiểu là liệu nó xảy ra ngầm (tự động) hay rõ ràng và liệu biểu diễn dữ liệu cơ bản được chuyển đổi từ biểu diễn này sang biểu diễn khác hay biểu diễn đã cho chỉ được diễn giải lạidưới dạng biểu diễn của một kiểu dữ liệu khác. Nói chung, cả hai loại dữ liệu nguyên thủy và hỗn hợp đều có thể được chuyển đổi.
Mỗi ngôn ngữ lập trình có các quy tắc riêng về cách chuyển đổi các loại. Các ngôn ngữ có kiểu gõ mạnh thường thực hiện ít chuyển đổi ngầm và không khuyến khích việc diễn giải lại các biểu diễn, trong khi các ngôn ngữ có kiểu gõ yếu thực hiện nhiều chuyển đổi ngầm giữa các loại dữ liệu. Ngôn ngữ gõ yếu thường cho phép buộc trình biên dịch diễn giải tùy ý một mục dữ liệu có các cách biểu diễn khác nhau — đây có thể là lỗi lập trình không rõ ràng hoặc một phương pháp kỹ thuật để xử lý trực tiếp phần cứng bên dưới.
Java cung cấp nhiều loại dữ liệu khác nhau giống như bất kỳ ngôn ngữ động nào khác, chẳng hạn như boolean, char, int, unsigned int, sign int, float, double, long, v.v. tổng cộng cung cấp 7 loại trong đó mỗi kiểu dữ liệu có được không gian khác nhau khi lưu trữ trong bộ nhớ.
Chuyển đổi loại
Nếu bạn đã có kinh nghiệm lập trình trước đây, thì bạn đã biết rằng việc gán giá trị của một loại cho một biến thuộc loại khác là khá phổ biến. Nếu hai loại tương thích, thì Java sẽ tự động thực hiện chuyển đổi (chuyển đổi loại ) . Ví dụ, luôn có thể gán giá trị int cho biến long. Tuy nhiên, không phải tất cả các loại đều tương thích và do đó, không phải tất cả các chuyển đổi loại đều được cho phép hoàn toàn . Chẳng hạn, không có chuyển đổi tự động nào được xác định từ gấp đôi thành byte. May mắn thay, vẫn có thể có được chuyển đổi giữa các loại không tương thích. Để làm như vậy, bạn phải sử dụng một cast , thực hiện một cách rõ ràngchuyển đổi giữa các loại không tương thích. Hãy xem xét cả chuyển đổi loại tự động hoặc mở rộng ( ép buộc loại , tung hứng loại ) và Chuyển đổi thu hẹp hoặc rõ ràng ( ép kiểu ).
Như bạn có thể thấy, có thể thực hiện ép kiểu trên một giá trị số cũng như trên một biến. Lưu ý rằng bạn có thể giới thiệu các diễn viên không cần thiết; ví dụ, trình biên dịch sẽ tự động tăng giá trị int lên long khi cần thiết. Tuy nhiên, bạn được phép sử dụng các diễn viên không cần thiết để tạo điểm nhấn hoặc để làm rõ mã của mình. Trong các tình huống khác, một diễn viên có thể cần thiết chỉ để biên dịch mã.
Trong C và C++, chuyển đổi kiểu có thể gây ra một số vấn đề đau đầu. Trong Java, chuyển đổi là an toàn, ngoại trừ khi bạn thực hiện cái gọi là chuyển đổi thu hẹp (nghĩa là khi bạn chuyển từ kiểu dữ liệu có thể chứa nhiều thông tin hơn sang kiểu không chứa nhiều thông tin), bạn chạy lệnh nguy cơ mất thông tin. Ở đây, trình biên dịch buộc bạn phải sử dụng phép ép kiểu (kiểu ép kiểu) , thực tế là nói rằng, “Làm việc này có thể nguy hiểm — nếu bạn muốn tôi làm việc đó thì bạn phải thực hiện chuyển đổi một cách rõ ràng.” Với chuyển đổi mở rộng, không cần truyền (truyền rõ ràng), vì loại mới sẽ giữ nhiều hơn thông tin từ loại cũ để không có thông tin nào bị mất. Java cho phép bạn chuyển đổi bất kỳ kiểu nguyên thủy nào sang bất kỳ kiểu nguyên thủy nào khác, ngoại trừ boolean, kiểu này hoàn toàn không cho phép ép kiểu. Các loại lớp không cho phép ép kiểu. Để chuyển đổi cái này sang cái khác, phải có các phương pháp đặc biệt. (…)
Chuyển đổi kiểu ẩn
Còn được gọi là 'chuyển đổi loại tự động hoặc theo thứ tự'.
- Do trình biên dịch tự thực hiện mà không có bất kỳ kích hoạt bên ngoài nào từ người dùng.
- Thường diễn ra khi trong một biểu thức có nhiều hơn một loại dữ liệu. Trong điều kiện đó, việc chuyển đổi loại (khuyến mãi loại) diễn ra để tránh mất dữ liệu.
- Tất cả các kiểu dữ liệu của biến được nâng cấp lên kiểu dữ liệu của biến có kiểu dữ liệu lớn nhất.
bool -> char -> short int -> int ->
unsigned int -> long -> unsigned ->
long long -> float -> double -> long double
Việc chuyển đổi ngầm định có thể làm mất thông tin, mất dấu (khi có dấu được chuyển đổi ngầm định thành không dấu) và có thể xảy ra tràn (khi long long được chuyển đổi ngầm định thành float).
đôi khi chúng tôi gọi loại chuyển đổi này là loại ceorcion.
Trong Java, cơ chế chuyển đổi một loại đối tượng thành một đối tượng khác thuộc loại khác có nội dung tương tự được gọi là ép buộc. Nói cách khác, chúng ta có thể nói rằng ép buộc là quá trình chuyển đổi một loại dữ liệu sang một loại dữ liệu khác. Theo một cách cụ thể hơn, chuyển đổi ngầm định được gọi là ép buộc . Nó còn được gọi là kiểu ép buộc .
Trong kiểu ceorcion , một kiểu dữ liệu được trình biên dịch tự động chuyển đổi thành kiểu dữ liệu khác tại thời điểm trình biên dịch. Trong kiểu ceorcion , kiểu dữ liệu đích không thể nhỏ hơn kiểu dữ liệu nguồn, đó là lý do tại sao nó còn được gọi là chuyển đổi mở rộng. Một điều quan trọng hơn là nó chỉ có thể được áp dụng cho các loại dữ liệu tương thích.
Nhập ví dụ Ceorcion –
int x=30;
float y;
y=x; // y==30.000000.
Java sẽ tự động ép buộc dữ liệu theo hướng mũi tên, có thể là nét liền hoặc nét đứt. Ví dụ:
Phép cưỡng chế đi qua mũi tên chấm được cho phép nhưng có thể dẫn đến mất độ chính xác. Điều đó có nghĩa là giá trị được chuyển đổi có thể không bằng giá trị ban đầu. Ví dụ:
Trình biên dịch sẽ xảy ra lỗi nếu bất kỳ câu lệnh nào cố ép buộc dữ liệu theo hướng mũi tên.
Hãy xem một ví dụ về ép kiểu ẩn trong Java.
Ở đây, chúng ta sẽ chuyển đổi một giá trị int thành giá trị long và cuối cùng thành giá trị double bằng cách sử dụng toán tử gán đơn giản:
public class Main {
public static void main(String[] args) {
int a = 20;
long b = a; //implicit casting from int to long data type
double c = b;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
} // implicit casting from long to double data type
20
20
20.0
Nói cách khác, "chuyển đổi loại" đề cập đến quá trình chung của việc thay đổi một loại, trong khi ép buộc loại đề cập cụ thể hơn đến việc chuyển đổi ngầm định một loại. Chúng ta có thể chia nhỏ hơn nữa kiểu ép buộc thành hai loại - do lập trình viên kiểm soát và do trình biên dịch kiểm soát (đôi khi được gọi là tung hứng ).
Chuyển đổi loại rõ ràng
Mặc dù các chuyển đổi loại tự động rất hữu ích nhưng chúng sẽ không đáp ứng mọi nhu cầu. Ví dụ, nếu bạn muốn gán một giá trị int cho một biến byte thì sao? Việc chuyển đổi này sẽ không được thực hiện tự động, vì một byte nhỏ hơn một int. Loại chuyển đổi này đôi khi được gọi là truyền kiểu và nó do người dùng xác định.
Quá trình này còn được gọi là chuyển đổi loại thu hẹp, vì rõ ràng bạn đang làm cho giá trị hẹp hơn để nó phù hợp với loại mục tiêu.
Để tạo chuyển đổi giữa hai loại không tương thích, bạn phải sử dụng truyền kiểu. Một diễn viên chỉ đơn giản là một chuyển đổi loại rõ ràng.
Trong Java, nó có thể được thực hiện bằng cách sử dụng toán tử ép kiểu () :
Điều này được thực hiện bằng cách xác định rõ ràng loại được yêu cầu trước biểu thức trong ngoặc đơn.
Nó có dạng chung này:
(target-type) expression
Ở đây, loại mục tiêu chỉ định loại mong muốn để chuyển đổi giá trị đã chỉ định thành. Ví dụ: đoạn sau chuyển một int thành một byte . Nếu giá trị của số nguyên lớn hơn phạm vi của một byte , nó sẽ bị giảm theo modulo (phần còn lại của phép chia số nguyên cho) phạm vi của byte.
int a;
byte b; // …
b = (byte) a;
Chương trình sau minh họa một số chuyển đổi kiểu yêu cầu ép kiểu:
// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;
System.out.println("\nConversion of int to byte.");
b = (byte) i;
System.out.println("i and b " + i + " " + b);
System.out.println("\nConversion of double to int.");
i = (int) d;
System.out.println("d and i " + d + " " + i);
System.out.println("\nConversion of double to byte.");
b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}
Conversion of int to byte. i and b 257 1
Conversion of double to int. d and i 323.142 323
Conversion of double to byte. d and b 323.142 67
Hãy xem một ví dụ về ép kiểu tường minh trong Java:
public class Main {
public static void main(String args[]) {
double d = 57.17;
int i = (int)d; // Explicit casting from long to int data type
System.out.println(d);
System.out.println(i); //fractional part lost
}
}
57.17
57
57
Quảng cáo loại tự động trong biểu thức
Quảng cáo kiểu là một sự xuất hiện phổ biến trong lập trình Java, có thể đạt được tự động với các kiểu dữ liệu nguyên thủy thông qua việc sử dụng quảng cáo kiểu tự động. Nó còn được gọi là quảng cáo kiểu dữ liệu tự động.
Như bạn có thể biết ngoài các phép gán, còn có một nơi khác mà một số chuyển đổi kiểu nhất định có thể xảy ra: trong các biểu thức.
Dưới đây là sơ đồ minh họa các loại khuyến mãi có thể có:
Bạn sẽ khám phá ra rằng nếu bạn thực hiện bất kỳ thao tác toán học hoặc thao tác bit nào trên các kiểu dữ liệu nguyên thủy nhỏ hơn một int (nghĩa là char, byte hoặc short), các giá trị đó sẽ được thăng cấp thành int trước khi thực hiện các thao tác và kết quả là giá trị sẽ là kiểu int. Vì vậy, nếu bạn muốn gán lại vào loại nhỏ hơn, bạn phải sử dụng phép ép kiểu. (Và, vì bạn đang gán lại thành một loại nhỏ hơn, nên bạn có thể làm mất thông tin.) Nói chung, loại dữ liệu lớn nhất trong một biểu thức là loại xác định kích thước của kết quả của biểu thức đó; nếu bạn nhân một số float và một số double, kết quả sẽ là gấp đôi; nếu bạn thêm int và long, kết quả sẽ là long.
Để hiểu thêm:
xem xét những điều sau đây. Trong một biểu thức, độ chính xác cần thiết của một giá trị trung gian đôi khi sẽ vượt quá phạm vi của một trong hai toán hạng. Ví dụ: kiểm tra biểu thức sau:
byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;
Dù hữu ích như các quảng cáo tự động, chúng có thể gây ra các lỗi thời gian biên dịch khó hiểu. Ví dụ: mã có vẻ đúng này gây ra sự cố:
byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!
Trong trường hợp bạn hiểu hậu quả của tràn, bạn nên sử dụng một cách rõ ràng, chẳng hạn như
byte b = 50;
b = (byte)(b * 2);
Quy tắc thăng hạng tự động
Phải tuân thủ các quy tắc sau để tăng kiểu khi thực thi các biểu thức trong Java để đạt được kết quả chính xác:
- Tất cả các biến thuộc loại byte , short và char phải là loại tự động được thăng cấp thành int .
- Nếu bất kỳ biến nào tham gia vào một hoạt động là dài , kết quả hoạt động phải dài .
- Nếu bất kỳ biến nào tham gia vào một phép toán là float thì kết quả của phép toán phải là float .
Hãy xem một số ví dụ Java mô tả các quy tắc khuyến mãi số trong Java-
1- Khi một trong các toán hạng là gấp đôi.
public class PromotionExample {
public static void main(String[] args) {
int i = 30;
double d = 2.5;
double result = i * d;
System.out.println("Result is- " + result);
}
}
// output :
// Result is- 75.0
2- Khi một trong các toán hạng float.
public class PromotionExample {
public static void main(String[] args) {
short s = 4;
int i = 30;
float f = 6.75f;
float result = (s+i) * f;
System.out.println("Result is- " + result);
}
}
//output
// Result is- 229.5
3- Cố gắng gán kết quả cho int khi một trong các toán hạng là float.
public class PromotionExample {
public static void main(String[] args) {
byte a= 100;
byte b= 50;
int i= 80;
float f = 80;
result = f/i *b; // line 6
}
}
error line 6
Hãy xem sự khác biệt giữa Type casting và Type Coercion được đưa ra dưới đây:
- Trong truyền kiểu, một kiểu dữ liệu được chuyển đổi thành kiểu dữ liệu khác bởi một lập trình viên sử dụng toán tử truyền. Trong khi trong kiểu ép buộc, một kiểu dữ liệu được trình biên dịch chuyển đổi thành kiểu dữ liệu khác.
- Truyền kiểu có thể được áp dụng cho các kiểu dữ liệu tương thích cũng như các kiểu dữ liệu không tương thích . Trong khi đó, ép buộc kiểu chỉ có thể được áp dụng cho các kiểu dữ liệu tương thích .
- Trong truyền kiểu, toán tử truyền là cần thiết để truyền một kiểu dữ liệu sang một kiểu dữ liệu khác. Trong khi ép kiểu, không cần toán tử truyền.
- Trong ép kiểu ( chuyển đổi kiểu rõ ràng ), kiểu dữ liệu đích có thể nhỏ hơn kiểu dữ liệu nguồn, khi chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác. Trong khi ép buộc kiểu ( chuyển đổi kiểu ẩn ) thì kiểu dữ liệu đích không được nhỏ hơn kiểu dữ liệu nguồn.
- Truyền kiểu diễn ra trong quá trình thiết kế chương trình bởi lập trình viên. Trong khi đó, chuyển đổi kiểu ( implecit type convertion ) được thực hiện tại thời điểm biên dịch.
- Ép kiểu còn được gọi là chuyển đổi thu hẹp vì trong trường hợp này, kiểu dữ liệu đích có thể nhỏ hơn kiểu dữ liệu nguồn. Trong khi đó, ép kiểu ( chuyển đổi kiểu ngầm định ) còn được gọi là chuyển đổi mở rộng vì trong trường hợp này, kiểu dữ liệu đích không được nhỏ hơn kiểu dữ liệu nguồn.
- Truyền kiểu thường được sử dụng trong các công việc viết mã và lập trình cạnh tranh. Trong khi đó, ép buộc kiểu ( chuyển đổi kiểu ngầm định ) ít được sử dụng trong viết mã và lập trình cạnh tranh vì nó có thể gây ra câu trả lời sai.
- Truyền kiểu hiệu quả và đáng tin cậy hơn. Trong khi ép buộc kiểu ( chuyển đổi kiểu ẩn ) kém hiệu quả và kém tin cậy hơn.
Hãy ủng hộ ấn phẩm của chúng tôi bằng cách theo dõi nó
Cũng tham khảo các bài viết sau.
Các xu hướng React JS năm 2023 cần theo dõi Click jacking và các biện pháp phòng ngừa Tích hợp Splunk với SpringBoot Part — 1 Coding: Kiểm tra xem hai chuỗi có phải là đảo ngữ trong Javascript Tại sao Java là ngôn ngữ lập trình được yêu thích nhất trên hành tinh Hiểu các phương thức trong Java 5 câu hỏi JavaScript phổ biến: Giới thiệu về Spark Architecture 25. Cây con tìm kiếm nhị phân lớn nhất (BST)
![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































