HOWTO · Java

Java のポインターの概要

このチュートリアルでは、Java のポインターとその使用方法について説明します。

今日は、Java のポインターと、それらを使用して利点を得る方法について学びますが、その前に、それらが Java で使用できるかどうかを確認します。 そうでない場合、代替手段は何ですか?

この記事では、これらすべての懸念にお答えします。 また、ポインターを C および C++ と呼ばれる他の言語と比較します。

Javaのポインター

ご存じのとおり、ポインタはメモリ アドレスを格納するオブジェクトです。 それらはアドレス管理とメモリ割り当てに便利ですが、言語にポインター演算がある場合にのみ機能します。

通常、言語にはポインター演算が事前にプログラムされていますが、Java の場合はそうではありません。 そのため、Java 言語にポインターの概念がないことに少しショックを受ける人もいるかもしれません。

代わりに、Java 言語にはポインタとしての参照があります。 ポインターを参照と呼ぶことができますが、参照はポインターではないため、逆は同じではないことに注意してください。

このガイドの例を使用して、この概念を詳しく見ていきましょう。

Java にポインタがない

多数派は、Java はポインターを使用しないほうがよいと主張しています。 それは以下の理由による。

  1. 算術 - 前述のように、ポインタは算術を使用して動作します。 さらに、ポインタは基本的に安全ではないメモリ管理で機能します。

    多くの人はそうではないと主張しますが、実際には、ポインターがメモリにアクセスできるようにすることは安全ではありません。 このため、Java はポインター演算をサポートしていません。 また、余分なメモリは使用されません。

  2. 操作 - ユーザーがポインターを誤用するのは簡単です。 ポインターを介してオブジェクトを操作することも非常に危険です。 全体として、Java はオブジェクト指向プログラミングでポインターを必要としません。

    また、Java 言語にポインターを追加すると、不必要に複雑さが増します。

代替手段: Java 言語での参照

前述のように、ポインターの概念は Java では使用できません。 したがって、ポインターの代わりに、ポインターと同じように機能する参照が使用されます。

ポインターという用語は、言語 C および C++ を指します。 Java ではポインターを使用できないため、参照と呼ばれる別の方法が使用されます。 前述のように、参照はポインターと同じように機能しますが、使用方法が少し異なります。

参照を使用する場合は、関数を使用して行います。 参照のコピーは、オブジェクトの呼び出しに使用される関数のスタックにコピーされ、必要に応じてオブジェクトを操作できます。

ユーザーがポインターを使用したい場合でも、参照を自由に使用できます。 Java での参照の使用を説明する例を次に示します。

class Shape {
  int length;
  int breadth;
}

public class ShapesUse {
  public static void main(String args[]) {
    /*
    Here, an example1 is used as a reference variable.
    Which means it holds the address of the Shapes object
    */
    Shape example1 = new Shape();

    /*
    example2 is another reference variable used,
    and example2 is initialized with example1
    example1 and example2 reference the same object,
    so no duplication and extra memory are used.
    */
    Shape example2 = example1;

    example1.length = 10;
    example2.breadth = 26;

    System.out.println("length of example 1 is: " + example1.length);
    System.out.println("breath of example 1 is: " + example2.breadth);
  }
}

この例では、example1example2 が参照として使用されています。 これは、オブジェクト shape のアドレスを保持しており、このオブジェクトを通じて lengthbreadth が呼び出されているためです。

これらの参照は、このプログラム以外では使用できないことに注意してください。 以下は、上記のコードの出力です。 ご覧のとおり、参照は目的どおりに機能します。

出力:

length of example 1 is: 10
breath of example 1 is: 26

Java で参照をポインターとして使用することの欠点

Java 言語でポインターを持たないことのいくつかの欠点を調べてみましょう。

  1. 明示的な使用 - 参照はポインターとして使用できますが、欠点があります。 参照を明示的に使用することはできません。 これらのポインターは、Java プログラムのスコープ外では使用できません。

    参照を使用して実行されるアクションは暗黙的であるため、表示されません。 リソースへのアクセスにポインタが使用されるため、これは非常に不利です。これは明示的に行うことができます。

    Cプログラミングでは、ポインターのアドレスを減算または加算して、物事を指すことができます。 ただし、Java では、参照は 1つのものしか指すことができません。

  2. 厳格な管理 - 参照は、C や C++ よりも厳密に管理されています。 残念ながら、これは型キャストが利用できないことを意味します。

    ただし、ポインタでは、たとえば、int から char への型キャストを行うことができます。 しかし Java では、参照は同じ型のオブジェクトのみを指すことができます。 したがって、たとえば、string 型のオブジェクトには string 参照のみを使用できます。