1. オブジェクトを比較する==
初心者プログラマーのよくある間違いは、==
演算子を使用してオブジェクト (特に文字列) を比較することです。例えば:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
System.out.println("The strings are equal");
}
このコードでは、2 つの異なる文字列オブジェクトへの参照を比較するため、「文字列は等しい」とは表示されませんif
。
コードの正しいバージョンは次のとおりです。
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
System.out.println("The strings are equal");
}
2.String
オブジェクトの変更
初心者プログラマは、クラスのすべてのオブジェクトがimmutableであること、およびString
クラスのすべてのメソッドが新しいオブジェクトを返すこと、つまり現在のオブジェクトは決して変更されないことを忘れがちです。
例:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
このコードは正しいコードとよく似ていますが、期待どおりに動作しません。このtoUpperCase()
メソッドは、呼び出されるオブジェクトを変更しません。正しいコードは次のようになります。
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
3. 配列の要素であるオブジェクトの初期化を忘れる
もう 1 つのよくある間違いは、配列変数の初期化を忘れることです。例:
int[] array;
array[0] = 1;
array[0] = 2;
このコードは機能しません。配列の要素を格納するコンテナ オブジェクトへの参照と等しい配列変数を明示的に設定する必要があります。
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
4. インスタンス変数の代わりにローカル変数を使用します。
初心者は、変数に長くて意味のある名前を考えることを好みません。a
彼らは、b
、 、 などの 1 文字の名前を頻繁に使用します。i
コードに次のような変数がいくつかある場合、これは残酷な行為です。
配列の 100 個のセルに数値 99 を入れます |
---|
|
上記のコードはコンパイルされません。正しいバージョンは次のようになります。
配列の 100 個のセルに数値 99 を入れます |
---|
|
5. コレクションアイテムの削除
特定の要素をコレクションから削除する必要がある状況がよくあります。コードはおおよそ次のようになります。
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);
for (Integer value: list)
if (value < 0)
list.remove(value);
for-each ループを使用してコレクションの要素を同時に走査し、そのコレクションを変更することはできないため、このコードは機能しません。
解決策はいくつかあります。まず、1 つのコレクションを調べて、別のコレクションを変更します。
解決策 1 |
---|
|
次に、Java 8 以降、コレクションにremoveIf()
はメソッドがあり、どの要素を削除するかを示すルール (ラムダ関数) を渡すことができます。
例:
解決策 2 |
---|
|
6.public
修飾子を含む複数のクラスを 1 つのファイルに配置する
ファイル内に存在できるパブリック クラスは 1 つだけです。ファイル内でさらに多くのクラスを宣言できますが、それらはパブリック クラスの内部クラスであるか、修飾子を持たない必要がありますpublic
。例:
Solution.java ファイルの内容 | ノート |
---|---|
|
これは許可されていません。1 つのファイル内に 2 つのパブリック クラスがあります。 |
|
しかし、これならできます。Mainクラスはパブリックではありません |
|
そして、これを行うことができます。Main クラスはネストされたクラスです |
main()
7. 静的メソッドからクラスの通常の (非静的) メソッドを呼び出す
main()
初心者プログラマは、メソッドまたは他の静的メソッドから非静的変数やメソッドにアクセスしようとすることがあります。もちろん、そのようなコードは機能しません。
public class Solution
{
public int n = 100;
public int[] createArray()
{
return new int[n];
}
public static void main(String[]args)
{
int[] array = createArray();
}
}
main メソッドは静的メソッド/変数のみを参照できます。そうでなければ、最初にクラスのインスタンスを作成してSolution
から、そのオブジェクトの非静的メソッドを呼び出す必要があります。例:
解決策 1 | 解決策 2 |
---|---|
|
|
8. メソッドのようなコンストラクターの宣言
もう 1 つのよくある間違いは、クラス コンストラクターを誤って宣言することです。コンストラクターの名前はクラスの名前と同じである必要があり、コンストラクターには結果の型がありません。最も一般的な間違いは次のとおりです。
|
ここには戻り値の型があってはなりません |
|
コンストラクター名が無効です。コンストラクターの名前はクラス名と一致する必要があります |
|
this 不足している。変数value はそれ自体に割り当てられます |
|
それはすべて正しいです |
9. インターフェースの不正な継承
Java の作成者は Java を英語に非常に近づけようとしたため、特定の関連概念に対して異なるキーワードを選択しました。
クラスがクラスを継承するときは、次のextends
キーワードを使用する必要があります。
class Pet
{
}
class Cat extends Pet
{
}
クラスがインターフェイスを継承する場合、次のimplements
キーワードを使用する必要があります。
interface Meow
{
}
class Cat implements Meow
{
}
インターフェイスがインターフェイスを継承する場合は、extends
次のキーワードを使用します。
interface Meow
{
}
interface Voice extends Meow
{
}
10.文中break
の省略switch
break
そして、今日の私たちにとっての最後の間違いは、初心者にとっての最後の間違いではありませんが、ステートメントにステートメントを含めないことですswitch
。例
間違い | 右 |
---|---|
|
|
GO TO FULL VERSION