
遂に最終章
年内にはたどり着けませんでしたが・・・
staticのつくものは2つ
static変数(クラス変数)と staticメソッド(クラスメソッド)があり
まとめてstaticメンバと呼ばれている。
staticが付かないものはインスタンスメンバといい
インスタンス変数 と インスタンスメソッド がある。

package sample20_01;
public class Number {
private int val = 10;
static int num = 20;
public void dispVal() {
System.out.println("val=" + val);
}
public static void dispNum() {
System.out.println("num=" + num);
}
public Number(int val) {
super();
this.val = val;
}
public int getVal() {
return val;
}
public static int getNum() {
return num;
}
}
実行前に1つだけ実体化されます・
public static void dispNum() {
System.out.println("num=" + num);
}
package sample20_02;
public class Number {
private int val = 10;
static int num = 20;
public void dispVal() {
System.out.println("val=" + val);
}
public static void dispNum() {
//System.out.println("val=" + val); //コンパイルエラー
System.out.println("num=" + num);
}
コレはコンパイルエラーになります。
Numberオブジェクトが作成された後なら、dispValからアクセスできます。
★メンバ間のアクセスツール
インスタンスメソッドはインスタンス変数とstatic変数にアクセス可
staticメソッドは、staticメソッドだけにアクセスできる
staticメソッドは、オブジェクトを作成すればインスタンス変数にアクセスできます。
なお、newでオブジェクトを作成することを インスタンス化する ということで、
そのオブジェクトを インスタンス ということがあります。
staticメソッドはthisを使えません。
理由は、 インスタンス(オブジェクト)の中でのみ有効なシステム変数だからです。
package sample20_03;
public class Number {
private int val = 10;
static int num = 20;
public void dispVal() {
System.out.println("val=" + val);
System.out.println("num=" + num);
}
public static void main(String[] args){
//System.out.println(this.val); //コンパイルエラー
//System.out.println(this.num); //コンパイルエラー
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
}
ここからは変数についてやっていきます。
r例題はテストのためデフォルトアクセスに
package sample20_04;
class Person {
String name = "田中宏"; //
}
class Friend extends Person {
String name = "ひろちゃん"; //
}
public class Exec {
public static void main(String[] args) {
Friend friend = new Friend(); //
Person person = friend; //
System.out.println(friend.name); // name
System.out.println(person.name); // name
}
}
同名の変数を定義するとサブクラスで定義した方が優先され
スーパクラスのほうは見えなくなる。
これを フィールドの隠ぺい という。
package sample20_05;
class Person {
static String name = "田中宏";
}
class Friend extends Person {
static String name = "ひろちゃん";
}
public class Exec {
public static void main(String[] args) {
System.out.println(Friend.name);
System.out.println(Person.name);
}
}
実行すると・・・・
ひろちゃん
田中宏
と出てきますwww
package sample20_06;
class Person {
String name = "田中宏"; //
}
class Friend extends Person {
String name = "ひろちゃん"; //
public void printSuperName(){
System.out.println(super.name);
}
}
public class Exec {
public static void main(String[] args) {
Friend friend = new Friend(); //
friend.printSuperName();
}
}
public void printSuperName(){
System.out.println(super.name);
}
}
super.nameで、スーパクラスのnameクラスにアクセスできる
mainメソッドでは使用できない
super.はthisと同様オブジェクトが持つシステム変数
オブジェクトの外では使用不可
本来インターフェース宣言は図のような形式です。

インターフェースを実装するクラスでは、defaultメソッドをそのまま使うことができ、独自に実装も可能です。
代表的な実装がある場合は、
それをあらかじめ提供しようというのがdefaultメソッド。
これをデフォルト実装という。
package sample20_07;
interface Printable {
String getString(); //
default void print() { //
System.out.println(getString()); // getString
}
}
class Person implements Printable { //
private String name; //
public Person(String name) { //
this.name = name;
}
@Override
public String getString() { //
return name; //
}
}
public class Exec {
public static void main(String[] args) {
Person tanaka = new Person("田中宏"); // Person
tanaka.print(); //
}
}
これを実行すると
田中宏 とコンソールに表示されます
で、defaultメソッドはインスタンスメソッド
defaultの代わりにstaticを付けると
インタフェース名を通して使うstaticメソッドに
package sample20_08;
interface Printable {
String getString(); //
static void print() { //
System.out.println("**Printableインタフェース**、");
}
}
class Person implements Printable { //
private String name; //
public Person(String name) { //
this.name = name;
}
@Override
public String getString() { //
return name; //
}
}
public class Exec {
public static void main(String[] args) {
Person tanaka = new Person("田中宏");
Printable.print(); // }
}
メソッドはインタフェースに帰属するので
インタフェース名.メソッド名 で使います
次にメソッドの衝突について
メソッドの衝突がどのような結果になるか
次の順番で決まります。
①同じ名前でも、引数構成が違う抽象メソッドはオーバーロードになる。
②名前と引数構成が同じでも、戻り値型が違う抽象メソッドはコンパイルエラーに
③同じ抽象メソッドなら、全体で1つの抽象メソッドとみなし、コンパイルエラーにならない。
④同じメソッドでも、その中の一つ以上がデフォルトメソッドならコンパイルエラーになる。
★クラス継承とインタフェース実装で衝突するケースはクラスが優先
二次元配列、多次元配列とも言います。
現実には二次元以上の配列を使うことはありません。
二次元配列とは言わず 配列の配列という場合があります。
言葉だけではわかりにくいので・・・
2.2次元配列の例題から
package sample20_09;
import java.util.Arrays;
public class Exec1 {
public static void main(String[] args) {
int[][] numbers = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
for (int[] array : numbers) {
System.out.print(Arrays.toString(array) + "\t");
}
}
}[1, 2, 3] [4, 5, 6] [7, 8, 9]
実行すると上のように文字がコンソールに表示されます
続いて配列を番号で操作する方のプログラムヲ
package sample20_09;
public class Exec2 {
public static void main(String[] args) {
int[][] numbers = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
for (int i = 0; i < numbers.length; i++) {
for (int j = 0; j < numbers[0].length; j++) {
System.out.print(numbers[i][j] + "\t");
}
System.out.println();
}
}
}1 2 3
4 5 6
7 8 9
実行すると上のように文字がコンソールに表示される。
最後に ファイルとプログラムの実行について
Javaファイルの実行に関する規則
●ソースファイルの拡張子はJavaである。
●コンパイルすると、同じ名前で拡張子を
classにかえた実行可能なファイルができる。
●classファイルにはクラスに含まれるパッケージの情報も
書き込まれている。
●classファイルを実行するには、
パッケージ名から指定しなければならない。
package sample20_10;
public class Exec {
public static void main(String[] args) {
System.out.println("Execクラス");
}
}
eclipseの標準設定では、コンパイルしたプログラムはプロジェクトフォルダの中
bin に入っている。
Windowsで手動で起動するにはコマンドプロンプトを起動
これまで無意識に書いてきたmainメソッドの引数は何に使うのか?
コマンドラインで実行時に値を受け取るもの
コマンドラインとは
マウスを使わずに文字でパソコンに命令を出す方法
package sample20_11;
public class Exec {
public static void main(String[] args) {
System.out.println("args[0]=" + args[0]); //
int val = Integer.parseInt(args[1]); //
System.out.println("args[1]=" + val); //
}
}で、(自分のパソコンorソフトが古いせいか修正しても動かないので↑)
本来Integer クラス Double クラスは int や doubleをオブジェクトとしてあts買うクラスで、 ラッパークラス と呼ばれる。
詳しくはJava API
ここまでご覧いただきありがとうございました。
長かったァァァァァァァァァァァァ
BY マんタ
参考書は__________________________________
川場 隆 Kawaba Takashi
秀和システム
______________________________________











