簡體   English   中英

這個java代碼如何執行代碼?

[英]How does this java code execute code?

我的編程課中有一個項目,我沒有測試用例。 我查看測試驅動程序並找到:

 private static boolean testSquareArch()
  {
  boolean pass = true;
  int test = 1;
  int cnt;
  Square sq;
  Class cl;

  System.out.println("Square architecture tests...");

  sq = new Square(true, true, true, true, 0, 0);

  cl = sq.getClass();
  cnt = cl.getFields().length;
  pass &= test(cnt == 5, test++);  //FAILING THIS TEST

這是做什么的以及如何檢查我的代碼?

我也在這里,這又做什么?

  // Count and test number of of PACKAGE fields
  cnt = cl.getDeclaredFields().length
      - countModifiers(cl.getDeclaredFields(), Modifier.PRIVATE)
      - countModifiers(cl.getDeclaredFields(), Modifier.PROTECTED)
      - countModifiers(cl.getDeclaredFields(), Modifier.PUBLIC);
  pass &= test(cnt == 5, test++);  // Test 8 

我沒有通過這些測試用例,只是想知道原因。 謝謝

如果您詢問&=賦值運算符,只有當右側參數也為真時,它才會使變量保持為真(如果它已經為假,則它將保持為假)。 它的工作方式與+=a &= ba = a & b ,運算符&是布爾結合(AND)。

 pass &= test(cnt == 5, test++); 

是簡寫

 if( ! test( cnt == 5, test ) )
     pass = false;
 test++;

我假設它是單元測試代碼的一部分,並斷言cnt == 5,還計算測試次數和總結果(通過或失敗)。

使用Junit,您不必手動處理測試次數或最終結果,您可以編寫

assertEquals("count is correct", 5, cnt);

這也將產生有用的輸出,以幫助確定失敗的確切內容(例如錯誤計數的值)。

它似乎是在檢查您在班級中聲明了多少個字段,以及其中有多少是私人可見性。

如果你想知道&= ,這是JLS 15.22.2的引用 布爾邏輯運算符&,^和|

對於&,如果兩個操作數值都為真,則結果值為true; 否則,結果是錯誤的。

運營商&| 對於布爾人來說,是&&15.23 )和||鮮為人知的表兄弟 15.24 )。 后兩者是“有條件”的運營商; 它們是短路的,只有在實際需要時才評估右側。

&&運算符類似於& (§15.22.2),但僅當其左側操作數的值為true時才計算其右側操作數。

&=是的化合物分配版本& JLS 15.26.2。 復合賦值運算符

形式E1 op = E2的復合賦值表達式等效於E1 =(T)((E1)op(E2)),其中T是E1的類型,除了E1僅被評估一次。

換句話說,這些是等價的(假設boolean b ):

b &= bool_expr;
b = b & bool_expr;
if (!bool_expr) b = false;

這也可能是你的問題( java.lang.Class#getDeclaredFields ):

返回Field對象的數組,這些對象反映由此Class對象表示的類或接口聲明的所有字段。 這包括公共,受保護,默認(包)訪問和私有字段, 但不包括繼承的字段

如果您還要計算繼承的字段,則計數可能不正確。

在Java中,變量和方法的名稱空間不會發生沖突。 所以看起來驅動程序既有變量又有一個名為“test”的方法。

如果沒有test()方法和您自己的源代碼,很難說出了什么問題,但看起來您的Square類中的字段數量是錯誤的。 (應該有五個。)

是的,似乎需要更多的字段來完成聲明,這應該修復命名空間。

暫無
暫無

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

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