簡體   English   中英

static關鍵字在導入java.lang.System類中的作用是什么?

[英]What is the role of static keyword in importing java.lang.System class?

導入System類時,我不明白關鍵字static的含義:

import static java.lang.System.*

我正在讀關於Java的書,它寫在那里:

任何不使用static一詞的import聲明都必須以包的名稱開頭,並且必須以下列之一結束:

  • 該包中的類的名稱
  • 星號(表示該包中的所有類)

例如,聲明導入java.util.Scanner; 是有效的,因為java.util是Java API java.util包的名稱, Scannerjava.util包中類的名稱。

這是另一個例子。 聲明import javax.swing.*; 是有效的,因為javax.swing是Java API中包的名稱,星號是指javax.swing包中的所有類。

我有以下代碼:

public class Addition {

   public static void main(String[] args) {
      double num;
      num = 100.53;

      num = num + 1000;

      // So when I want to import the whole package java.lang as written in the book, it doesn't work:
      // import java.lang.*;
      // or like this:
      // import static java.lang.*;
      // NetBeans in both cases doesn't see these abbreviated names `out` and throws errors. Why?
      out.print("The result is ");
      out.print(num);
      out.println(" .");
   }
}

當我以這種方式導入時它可以工作:

import static java.lang.System.out;
import static java.lang.System.*

但是當我嘗試這樣做時不起作用:

import java.lang.System.out;
import java.lang.System.*

在這種特殊情況下, static關鍵字的含義是什么?

為什么要import java.lang.*; 不導入包含System類的整個包?

static導入允許您編寫:

out.print("The result is ");

而不是這個:

System.out.print("The result is ");

參見例如http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

我經常在單元測試中使用靜態導入,如下所示:

import static org.junit.Assert.*;

這允許我編寫這段代碼:

assertEquals(2, list.size());

而不是這段代碼:

Assert.assertEquals(2, list.size());

靜態導入是Java編程語言中引入的一項功能,它允許在Java代碼中使用類中定義的成員(字段和方法)作為公共靜態,而無需指定定義字段的類。 此功能已在5.0版本的語言中引入。

該功能提供了一種類型安全機制,可以將常量包含在代碼中,而無需引用最初定義字段的類。 它還有助於棄用創建常量接口的做法:一個只定義常量然后編寫實現該接口的類的接口,這被認為是對接口的不恰當使用。

當您使用static關鍵字導入時,這意味着您只是在您的類中以某種方式插入它,您可以像調用自己的類的方法一樣使用它的方法。

例如:

import static java.lang.Math.*;
import static java.lang.System.out;

並且:

out.println("I have a house with an area of " + (PI * pow(2.5,2)) + " sq. cm");

問題:

1)當我以這種方式導入時它可以工作:

a. import static java.lang.System.out;
b. import static java.lang.System.*

但是當我嘗試這樣做時不起作用:

c. import java.lang.System.out;
d. import java.lang.System.*;

2)在這種特殊情況下,static關鍵字的含義是什么?

3)為什么要導入java.lang。*; 不導入包含System類的整個包?

-------------------------------------------------- ------------------------------

回答:

1)&2)靜態導入例如(import static java.lang.System.out)用於從System類導入在此特定情況下在其他類中聲明為static的方法或字段。

a. import static java.lang.System.out; //Works because "out" is a static field
b. import static java.lang.System.*; //Works because you are importing ALL static fields and methods inside the System class

c. import java.lang.System.out; //Does NOT work because you are trying to import a static field in a non-static way. (see a.)
d. import java.lang.System.*; //Actually Works because of the * wildcard which allows you to include all imports.

您希望以靜態方式導入方法或字段的主要原因是,您可以省略對這些方法或字段的所有調用的類規范。 所以不要寫:

System.out.print("Hello");
System.out.print("World");

只寫

import static java.lang.System.*   //or   import static java.lang.System.out if you only plan on using the 'out' field.
out.print("Hello");
out.print("World");

3)導入java.lang。*是多余的! Java會自動並隱式地為您導入此包! :)是的,它用它導入System類,但不要混淆,除非你將它作為靜態導入導入,你仍然需要寫出很長的路:

System.out.print("hi");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM