Javaオブジェクトにデータを保存する方法

最終更新日:2020年1月

スヌーズボタンはおそらく目覚まし時計で最も一般的に使用されるボタンですが、単純なAlarmClockクラスでもさらにいくつかの機能が必要です。たとえば、目覚まし時計がスヌーズモードにとどまる時間を制御したい場合があります。このような機能を追加するには、Javaがデータを制御する方法を理解する必要があります。

開発者はJavaの変数を使用してデータを保持し、すべての変数にはデータ型と名前があります。データ型は、変数が保持できる値を決定します。このチュートリアルでは、整数型が整数を保持し、浮動小数点型が実数を保持し、文字列型が文字列を保持する方法を学習します。次に、Javaクラスでインスタンス変数の使用を開始します。

変数とプリミティブ型

プリミティブ型と呼ばれる整数型と浮動小数点型は、Javaで最も単純なデータ型です。次のプログラムは、正と負の両方の整数を保持できる整数型を示しています。このプログラムは、コードを文書化するコメントも示していますが、プログラムにはまったく影響しません。

/ **これもコメントです。コンパイラは、最初の/ *からコメントを終了する「スタースラッシュ」までのすべてを無視します。**これがコメントを終了する「スタースラッシュ」です。* / public class IntegerTest {public static void main(String [] args){//これはanIntegerと呼ばれるint変数の宣言です。//初期値100を指定します。intanInteger= 100; // anIntegerを宣言して初期化しますSystem.out.println(anInteger); //出力100 //標準の算術演算子を使用して、プリミティブ型で//算術を実行することもできます。anInteger = 100 + 100; System.out.println(anInteger); //出力200}}

Javaは浮動小数点型も使用します。これは、小数点以下を含む数値を意味する実数を保持できます。プログラムの例を次に示します。

public class DoubleTest {public static void main(String [] args){//これがaDoubleと呼ばれるdouble変数の宣言です。// aDoubleに5.76の初期値も指定します。double aDouble = 5.76; // aDoubleを宣言して初期化しますSystem.out.println(aDouble); //出力5.76 //浮動小数点型を使用して算術演算を実行することもできます。aDouble = 5.76 + 1.45; System.out.println(aDouble); //出力7.21}}

上記のプログラムを実行してみてください。それらを実行する前にコンパイルする必要があることを忘れないでください。

javac * .java java IntegerTest java DoubleTest 

次の表に示すように、Javaは4つの整数型と2つの浮動小数点型を使用します。これらは両方とも異なる範囲の数値を保持し、さまざまな量のストレージスペースを占有します。

整数型

タイプ バイト ショート Int 長いです
サイズ(ビット) 8 16 32 64
範囲 -128〜127 -32,768〜32,767 -2,147,483,648から2,147,483,647 -263から263-1

浮動小数点型(IEEE 754形式)

 
タイプ 単精度浮動小数点 倍精度浮動小数点
サイズ(ビット) 32 64
範囲 +/- 1.18x10-38〜 +/- 3.4x1038 +/- 2.23x10-308から+/- 1.8x10308

文字列型は文字列を保持し、違ったやり方積分からハンドルにそれらをし、浮動小数点型は、数値を扱います。Java言語には、String文字列を表すクラスが含まれています。タイプを使用して文字列を宣言し、次にString示すように、二重引用符で囲まれた文字のシーケンスである引用符で囲まれた文字列で初期化します。+演算子を使用して2つの文字列を結合することもできます。

//コードフラグメント// String型の変数の宣言//引用符で囲まれた文字列「Hello」による初期化。String s = "Hello"; // s内の文字列と引用符で囲まれた文字列 "World"の連結Stringt = s + "World"; System.out.println(t); //出力のHello World

可変スコープ

タイプに加えて、スコープも変数の重要な特性です。スコープは、変数が作成および破棄されるタイミングと、開発者がプロ​​グラム内の変数にアクセスできる場所を確立します。プログラム内で変数を宣言する場所によって、そのスコープが決まります。

これまで、メソッド内で使用する一時データを保持するローカル変数について説明してきました。ローカル変数はメソッド内で宣言し、それらのメソッド内からのみアクセスできます。あなたはローカル変数のみ取得できることをこれは意味anIntegerあなたが使用、IntegerTestaDoubleあなたが使用し、DoubleTestそれらが宣言され、他のどこにもされた主な方法から、。

ローカル変数は任意のメソッド内で宣言できます。以下のサンプルコードは、AlarmClock snooze()メソッドでローカル変数を宣言しています。

public class AlarmClock {public void snooze(){//ミリ秒単位のスヌーズ時間= 5秒の長さsnoozeInterval = 5000; System.out.println( "ZZZZZ for:" + snoozeInterval); }}

宣言した場所であるメソッドsnoozeIntervalからのみアクセスできsnooze()ますsnoozeInterval, as shown here: 

public class AlarmClockTest {public static void main(String [] args){AlarmClock aClock = new AlarmClock(); aClock.snooze(); //これはまだ問題ありません。//コードの次の行はERRORです。// snoozeメソッドの外部でsnoozeIntervalにアクセスすることはできません。snoozeInterval = 10000; }}

メソッドパラメータ

メソッドパラメータローカル変数に類似範囲を有し、変数の別のタイプです。メソッドパラメータは、引数をメソッドに渡します。メソッドを宣言するときは、パラメーターリストでその引数を指定します。メソッドを呼び出すときに引数を渡します。メソッドパラメータは、リンク先のメソッドのスコープ内にあり、メソッド全体で使用できるという点で、ローカル変数と同様に機能します。ただし、ローカル変数とは異なり、メソッドパラメータは、メソッドを呼び出すときに呼び出し元から値を取得します。これは、を渡すことができる目覚まし時計の変更ですsnoozeInterval

public class AlarmClock {public void snooze(long snoozeInterval){System.out.println( "ZZZZZ for:" + snoozeInterval); }}
public class AlarmClockTest {public static void main(String [] args){AlarmClock aClock = new AlarmClock(); //メソッドを呼び出すときに、スヌーズ間隔を渡します。aClock.snooze(10000); // 10000ミリ秒スヌーズします。}}

メンバー変数:オブジェクトがデータを格納する方法

ローカル変数は便利ですが、一時的なストレージしか提供しないため、値が制限されます。それらの有効期間は宣言されたメソッドの長さに及ぶため、ローカル変数は、電話を受けるたびに表示されるメモ帳と比較されますが、電話を切ると消えます。この設定はメモを書き留めるのに役立ちますが、より永続的なものが必要になる場合があります。プログラマーは何をしますか?メンバー変数を入力します

メンバー変数(インスタンス静的の2つがあります)は、クラスの一部を構成します。

可変スコープとライフタイム

開発者は、クラスに役立つデータを含むインスタンス変数を実装します。インスタンス変数は、スコープと存続期間の性質においてローカル変数とは異なります。クラス全体が、宣言されたメソッドではなく、インスタンス変数のスコープを構成します。つまり、開発者はクラス内のどこからでもインスタンス変数にアクセスできます。さらに、インスタンス変数の有効期間は、クラスの特定のメソッドに依存しません。つまり、その存続期間は、それを含むインスタンスの存続期間です。

インスタンスは、クラス定義で設計したブループリントから作成する実際のオブジェクトです。クラス定義でインスタンス変数を宣言し、ブループリントから作成する各インスタンスに影響を与えます。各インスタンスにはこれらのインスタンス変数が含まれており、変数内に保持されるデータはインスタンスごとに異なる可能性があります。

AlarmClockクラスを考えてみましょう。渡すsnoozeIntervalsnooze()方法は素晴らしいデザインではありません。スヌーズボタンを探すたびに、目覚まし時計にスヌーズ間隔を入力する必要があると想像してみてください。代わりに、目覚まし時計全体にを与えるだけsnoozeIntervalです。AlarmClock以下に示すように、クラス内のインスタンス変数を使用してこれを完了します。

public class AlarmClock { // You declare snoozeInterval here. This makes it an instance variable. // You also initialize it here. long m_snoozeInterval = 5000; // Snooze time in millisecond = 5 secs. public void snooze() { // You can still get to m_snoozeInterval in an AlarmClock method // because you are within the scope of the class. System.out.println("ZZZZZ for: " + m_snoozeInterval); } } 

You can access instance variables almost anywhere within the class that declares them. To be technical about it, you declare the instance variable within the class scope, and you can retrieve it from almost anywhere within that scope. Practically speaking, you can access the variable anywhere between the first curly bracket that starts the class and the closing bracket. Since you also declare methods within the class scope, they too can access the instance variables.

You can also access instance variables from outside the class, as long as an instance exists, and you have a variable that references the instance. To retrieve an instance variable through an instance, you use the dot operator together with the instance. That may not be the ideal way to access the variable, but for now, complete it this way for illustrative purposes:

public class AlarmClockTest { public static void main(String[] args) { // Create two clocks. Each has its own m_snoozeInterval AlarmClock aClock1 = new AlarmClock(); AlarmClock aClock2 = new AlarmClock(); // Change aClock2 // You'll soon see that there are much better ways to do this. aClock2.m_snoozeInterval = 10000; aClock1.snooze(); // Snooze with aClock1's interval aClock2.snooze(); // Snooze with aClock2's interval } } 

このプログラムを試してみるとaClock1、間隔が5,000であるのに対しaClock2、間隔は10,000であることがわかります。この場合も、各インスタンスには独自のインスタンスデータがあります。

クラス定義は単なる青写真であるため、青写真からインスタンスを作成するまで、インスタンス変数は実際には存在しないことを忘れないでください。クラスの各インスタンスには、インスタンス変数の独自のコピーがあり、ブループリントはそれらのインスタンス変数がどうなるかを定義します。

JavaWorld

カプセル化

Encapsulation is one of the foundations of object-oriented programming. When using encapsulation, the user interacts with the type through the exposed behavior, not directly with the internal implementation. Through encapsulation, you hide the details of a type's implementation. In Java, encapsulation basically translates to this simple guideline: "Don't access your object's data directly; use its methods."

That is an elementary idea, but it eases our lives as programmers. Imagine, for example, that you wanted to instruct a Person object to stand up. Without encapsulation, your commands could go something like this: "Well, I guess you'd need to tighten this muscle here at the front of the leg, loosen this muscle here at the back of the leg. Hmmm -- need to bend at the waist too. Which muscles spark that movement? Need to tighten these, loosen those. Whoops! Forgot the other leg. Darn. Watch it -- don't tip over ..." You get the idea. With encapsulation, you would just need to invoke the standUp() method. Pretty easy, yes?

Some advantages to encapsulation:

  • Abstraction of detail: The user interacts with a type at a higher level. If you use the standUp() method, you no longer need to know all the muscles required to initiate that motion.
  • Isolation from changes: Changes in internal implementation don't affect the users. If a person sprains an ankle, and depends on a cane for a while, the users still invoke only the standUp() method.
  • Correctness: Users can't arbitrarily change the insides of an object. They can only complete what you allow them to do in the methods you write.

Here's a short example in which encapsulation clearly helps in a program's accuracy:

// Bad -- doesn't use encapsulation public class Person { int m_age; } public class PersonTest { public static void main(String[] args) { Person p = new Person(); p.m_age = -5; // Hey -- how can someone be minus 5 years old? } } // Better - uses encapsulation public class Person { int m_age; public void setAge(int age) { // Check to make sure age is greater than 0. I'll talk more about // if statements at another time. if (age > 0) { m_age = age; } } } public class PersonTest { public static void main(String[] args) { Person p = new Person(); p.setAge(-5); // Won't have any effect now. } } 

その単純なプログラムでさえ、クラスの内部データに直接アクセスした場合に問題が発生する可能性があることを示しています。プログラムが大きく複雑になるほど、カプセル化の重要性が増します。また、多くのプログラムは最初は小さく、その後無期限に続くことを忘れないでください。そのため、最初から正しく設計することが不可欠です。にカプセル化を適用するにAlarmClockは、スヌーズ間隔を操作するメソッドを作成するだけです。

メソッドに関するメモ

メソッドは、呼び出し元が使用する値を返すことができます。値を返すには、void以外の戻り値の型を宣言し、returnステートメントを使用します。getSnoozeInterval()以下の例に示される方法は、これを示しています。

プログラムを書く