Câu trả lời:
Xem tài liệu
Khai báo nhập tĩnh tương tự như khai báo nhập thông thường. Trong trường hợp khai báo nhập thông thường nhập các lớp từ các gói, cho phép chúng được sử dụng mà không cần chứng nhận gói, khai báo nhập tĩnh nhập các thành viên tĩnh từ các lớp, cho phép chúng được sử dụng mà không cần chứng nhận lớp.
Vậy khi nào bạn nên sử dụng nhập tĩnh? Rất ít! Chỉ sử dụng nó khi bạn muốn khai báo các bản sao địa phương hoặc lạm dụng quyền thừa kế (Giao diện liên kết không đổi). Nói cách khác, sử dụng nó khi bạn yêu cầu truy cập thường xuyên đến các thành viên tĩnh từ một hoặc hai lớp. Nếu bạn quá lạm dụng tính năng nhập tĩnh, nó có thể làm cho chương trình của bạn không thể đọc được và không thể nhận biết được, gây ô nhiễm không gian tên của nó với tất cả các thành viên tĩnh mà bạn nhập. Người đọc mã của bạn (bao gồm cả bạn, một vài tháng sau khi bạn viết nó) sẽ không biết thành viên tĩnh đến từ lớp nào. Nhập tất cả các thành viên tĩnh từ một lớp có thể đặc biệt có hại cho khả năng đọc; nếu bạn chỉ cần một hoặc hai thành viên, hãy nhập chúng riêng lẻ. Được sử dụng phù hợp, nhập tĩnh có thể làm cho chương trình của bạn dễ đọc hơn,
Không có sự khác biệt giữa hai nhập khẩu mà bạn nêu. Tuy nhiên, bạn có thể sử dụng nhập tĩnh để cho phép truy cập không đủ điều kiện vào các thành viên tĩnh của các lớp khác. Nơi tôi từng phải làm điều này:
import org.apache.commons.lang.StringUtils;
.
.
.
if (StringUtils.isBlank(aString)) {
.
.
.
Tôi có thể làm điều này:
import static org.apache.commons.lang.StringUtils.isBlank;
.
.
.
if (isBlank(aString)) {
.
.
.
Bạn có thể xem thêm trong tài liệu .
Nhập tĩnh được sử dụng để nhập các trường / phương thức tĩnh của một lớp thay vì:
package test;
import org.example.Foo;
class A {
B b = Foo.B_INSTANCE;
}
Bạn có thể viết :
package test;
import static org.example.Foo.B_INSTANCE;
class A {
B b = B_INSTANCE;
}
Nó rất hữu ích nếu bạn thường được sử dụng một hằng số từ một lớp khác trong mã của bạn và nếu nhập tĩnh không mơ hồ.
Btw, trong ví dụ của bạn "nhập tĩnh org.example.Myclass;" Sẽ không hoạt động: nhập là dành cho lớp, nhập tĩnh là dành cho các thành viên tĩnh của một lớp.
Ý tưởng cơ bản của nhập tĩnh là bất cứ khi nào bạn đang sử dụng một lớp tĩnh, một biến tĩnh hoặc enum, bạn có thể nhập chúng và tự lưu lại từ một số thao tác gõ.
Tôi sẽ giải thích quan điểm của tôi với ví dụ.
import java.lang.Math;
class WithoutStaticImports {
public static void main(String [] args) {
System.out.println("round " + Math.round(1032.897));
System.out.println("min " + Math.min(60,102));
}
}
Cùng một mã, với nhập khẩu tĩnh:
import static java.lang.System.out;
import static java.lang.Math.*;
class WithStaticImports {
public static void main(String [] args) {
out.println("round " + round(1032.897));
out.println("min " + min(60,102));
}
}
Lưu ý : nhập tĩnh có thể làm cho mã của bạn khó đọc.
import static java.lang.Math
mà không có dấu hoa thị?
sự khác biệt giữa "nhập tĩnh com.showboy.Myclass" và "nhập com.showboy.Myclass"?
Đầu tiên sẽ tạo ra một lỗi biên dịch vì nhập tĩnh chỉ hoạt động để nhập các trường hoặc các loại thành viên. (giả sử MyClass không phải là một lớp bên trong hoặc thành viên từ showboy)
Tôi nghĩ bạn có nghĩa là
import static com.showboy.MyClass.*;
làm cho tất cả các trường tĩnh và thành viên từ MyClass có sẵn trong đơn vị biên dịch thực tế mà không cần phải đủ điều kiện ... như đã giải thích ở trên
Việc này import
cho phép lập trình viên java truy cập các lớp của gói mà không cần chứng nhận gói.
Các static import
tính năng cho phép để truy cập vào các thành viên tĩnh của một lớp mà không cần trình độ lớp.
Việc import
cung cấp khả năng truy cập vào các lớp và giao diện trong khi static import
cung cấp khả năng truy cập cho các thành viên tĩnh của lớp.
Thí dụ :
Với nhập khẩu
import java.lang.System.*;
class StaticImportExample{
public static void main(String args[]){
System.out.println("Hello");
System.out.println("Java");
}
}
Với nhập tĩnh
import static java.lang.System.*;
class StaticImportExample{
public static void main(String args[]){
out.println("Hello");//Now no need of System.out
out.println("Java");
}
}
Xem thêm: Nhập tĩnh trong Java 5 là gì
Giả sử bạn có các trường và phương thức tĩnh bên trong một lớp được gọi MyClass
bên trong một gói được gọi myPackage
và bạn muốn truy cập chúng trực tiếp bằng cách gõ myStaticField
hoặc myStaticMethod
không cần gõ mỗi lần MyClass.myStaticField
hoặc MyClass.myStaticMethod
.
Lưu ý: bạn cần thực hiện một
import myPackage.MyClass
hoặc myPackage.*
để truy cập các tài nguyên khác
Công cụ static
sửa đổi sau import
là để lấy / sử dụng các trường tĩnh của một lớp. Một lĩnh vực mà tôi sử dụng import static
là để lấy các hằng số từ một lớp. Chúng ta cũng có thể áp dụng import static
trên các phương thức tĩnh. Đảm bảo gõ import static
vì static import
sai.
Những gì có static import
trong Java - JavaRevisited - Một tài nguyên rất tốt để biết thêm vềimport static
.