以下に、私の示す解説 (もしくはGemini による解説) をよく理解したうえで、確認のための Forms に回答せよ。
プリミティブ型とは
- 「Javaにおけるプリミティブ型について説明して」(Gemini による解説)
- 以下の Forms に答えよ
変数とスコープ
- 「Java におけるインスタンス変数、クラス変数、局所変数について説明して」(Gemini による解説)
- 以下の Forms に答えよ
オブジェクトとメモリイメージ
C言語の構造体の授業や、Java のクラスオブジェクトの授業の基本を習うと、実際のデータがどのように格納されているか理解が浅い場合があるので、簡単なプログラム例によってオブジェクトの説明を行う。
クラス宣言の基本
class クラス名 {
// インスタンス変数 // インスタンス変数の前には private, public をつけると
型名 インスタンス変数1 ; // public クラス外でも使える
型名 インスタンス変数2 ; // private クラスのメソッドの中でしか使えない
// クラス変数
static 型名 クラス変数3 ;
// コンストラクタの定義
// 【具体的な値を持ったインスタンスを作る時の処理】
クラス名( 型名 仮引数4 , 型名 仮引数5 ... ) {
this.インスタンス変数 = 値 ;
:
}
// メソッドの定義
型名 メソッド名( 型名 仮引数6 , 型名 仮引数7 ... ) {
:
}
}
実際のプログラム例で説明
import java.util.*;
class Person {
// インスタンス変数
String name ; // 本来なら private String name と書くべき
int age ; // name , age は、インスタンス変数
// クラス変数
public static int count = 0 ; // クラス変数は複数のインスタンスで共有される、
// 1つの実体をもつ変数。new しなくても使える
// コンストラクタ
Person( String n , int a ) {
this.name = n ; // this はメソッドの対象となるインスタンス全体を表す暗黙の変数。
this.age = a ; // name = n ; と書いてもいいが、局所変数と混同しないように
count++ ; // this.name = n ; と書くことが多い。
}
// メソッド
public void print() {
System.out.print( "Name=" + this.name ) ;
System.out.println( "Age=" + this.age ) ;
}
// オブジェクトを文字列に必要に応じて自動的に変換させたい時のメソッド
// toString() は自動生成されるが、自分で定義しなおす場合は、
// 「自分でメソッド内容を上書きするよ!」という意味の @Override をつける。
@Override
public String toString() {
return "Name=" + this.name + ",Age=" + this.age ;
}
}
public class Main {
public static void main( String[] args ) {
// 単純なインスタンス(具体的な値の入ったオブジェクト)の生成
Person tsaitoh = new Person( "t-saitoh" , 61 ) ;
tsaitoh.print() ; // インスタンス.メソッド()
// Person の配列を作る
Person family[] = new Person[ 2 ] ;
family[ 0 ] = new Person( "Mitsuki" , 27 ) ;
family[ 1 ] = new Person( "Ayuka" , 25 ) ;
// Personのクラス変数 count を参照
// クラス変数を参照するには、クラス名.クラス変数
System.out.println( Person.count ) ;
// 配列の参照
for( int i = 0 ; i < family.length ; i++ )
System.out.println( family[ i ] ) ; // toString() が自動的に呼び出される。
}
}
上記のプログラムのデータがどのように保存されているかのイメージ
