クラスの外から勝手にアクセスできないようにするためには、private メンバとして設定しておきます。
class Car
{
private int number;
private String color;
}
public class JavaSampleClass{
public static void main(String[] args) {
Car car1 = new Car();
car1.number = 123456; // アクセスできない為、エラー
System.out.println("ナンバーを取得しました:" + car1.number); // アクセスできない為、エラー
}
}
private メンバにクラスの外からアクセスできるようにするには、public メンバにした、関数を利用しアクセスします。
クラスの中にデータとメソッドをひとまとめにし、メンバにprivateをつけアクセス制限することをカプセル化といいます。
class Car
{
private int number;
private String color;
public void setColor(String c) {
color = c;
}
public String getColor() {
return color;
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car car1 = new Car();
car1.setColor("red");
System.out.println("カラーを取得しました:" + car1.getColor());
}
}
同じクラス内に、同じ名前のメソッドを2つ以上定義することができます。これをメソッドのオーバーロードといいます。
オーバーロードの注意点としては、オーバーロードするメソッドは、引数の型や数が異なっていないといけません。同じだとどのメソッドを呼び出せばいいかわからないからです。
「 setCar 」のように1つの名前のメソッドが、その状況に応じて別々の働きを持つことを「 多態性(ポリモーフィズム)」といいます。
class Car
{
private int number;
private String color;
public void setCar(int n) {
number = n;
System.out.println("ナンバーを" + number + "にしました。");
}
public void setCar(String s) {
color = s;
System.out.println("カラーを" + color + "にしました。");
}
public void setCar(int n, String s) {
number = n;
color = s;
System.out.println("ナンバーを" + number + "、カラーを" + color + "にしました。");
}
public void show() {
System.out.println("ナンバー:" + number);
System.out.println("カラー:" + color);
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car car1 = new Car();
car1.setCar(1234);
car1.setCar("red");
car1.show();
car1.setCar(7777, "blue");
car1.show();
}
}
クラスの中には、フィールドとメソッドのほかに、コンストラクタを設定することができます。
コンストラクタとは、クラスのオブジェクトが作成されたときに、定義しておいたコンストラクタ内の処理が自動的に行われます。
コンストラクタの利用方法は、オブジェクトのメンバに自動的に初期値を設定したりすることに利用されます。
コンストラクタを設定する際の注意点は、「 コンストラクタの名前は必ずクラス名と同じ 」にします。また、戻り値を設定することはできません。
class Car
{
private int number;
private String color;
public Car() {
number = 1234;
color = "silver";
System.out.println("初期値を設定しました。");
}
public void show() {
System.out.println("ナンバー:" + number + ", カラー:" + color);
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car car1 = new Car();
car1.show();
}
}
コンストラクタもメソッドと同じように、引数の型と数が異なっていればオーバーロードすることができます。
class Car
{
private int number;
private String color;
public Car() {
number = 0000;
color = "silver";
System.out.println("設定を初期化しました。");
}
public Car(int n, String s) {
number = 1234;
color = "red";
System.out.println("ナンバー:" + number + "、 カラー:" + color + "を設定しました。");
}
public void show() {
System.out.println("車情報");
System.out.println("ナンバー:" + number + ", カラー:" + color);
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car car1 = new Car();
car1.show();
Car car2 = new Car(1234, "red");
car2.show();
}
}
コンストラクタ内で別のコンストラクタを呼び出すには、this を使います。
class Car
{
private int number;
private String color;
public Car() {
number = 0000;
color = "silver";
System.out.println("設定を初期化しました。");
}
public Car(int n, String s) {
this();
number = 1234;
color = "red";
System.out.println("ナンバー:" + number + "、 カラー:" + color + "を設定しました。");
}
public void show() {
System.out.println("車情報");
System.out.println("ナンバー:" + number + ", カラー:" + color);
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car car1 = new Car();
car1.show();
Car car2 = new Car(1234, "red");
car2.show();
}
}
// 結果
設定を初期化しました。
車情報
ナンバー:0, カラー:silver
設定を初期化しました。 // this()の呼び出しで引数のないコンストラクタが呼び出された結果
ナンバー:1234、 カラー:redを設定しました。
車情報
ナンバー:1234, カラー:red
コンストラクタもメソッドと同じように、public、private という修飾子を設定することができます。
private を指定した、コンストラクタは、クラスの外でコンストラクタが呼び出されるようなオブジェクトの作成ができなくなります。
class Car
{
private int number;
private String color;
private Car() {
number = 0000;
color = "silver";
System.out.println("設定を初期化しました。");
}
public Car(int n, String s) {
this();
number = 1234;
color = "red";
System.out.println("ナンバー:" + number + "、 カラー:" + color + "を設定しました。");
}
public void show() {
System.out.println("車情報");
System.out.println("ナンバー:" + number + ", カラー:" + color);
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car car1 = new Car(); // private に指定されている為、作成できずエラー
car1.show();
Car car2 = new Car(1234, "red");
car2.show();
}
}
クラスでは、オブジェクトに関連されておらずクラスに関連されているフィールドを「 クラス変数 」、メソッドを「 クラスメソッド 」といいます。
クラス変数、クラスメソッドを定義するには、「 static 」を指定します。
class Car
{
// クラス変数
public static int sum = 0;
private int number;
private String color;
public Car() {
number = 0000;
color = "silver";
sum++; // クラス変数に値を追加
System.out.println("車を作成しました。");
}
public void show() {
System.out.println("車情報");
System.out.println("ナンバー:" + number + ", カラー:" + color);
}
public static void showSum() {
System.out.println("車の合計数:" + sum);
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car.showSum(); // クラスメソッドの為、オブジェクトを作成していなくても呼び出せる
Car car1 = new Car();
car1.show();
Car.showSum();
}
}
クラスメソッド内では、インスタンス変数・インスタンスメソッドにアクセスすることができません。
また、クラスメソッド内では、「 this. 」を使うことができません。
class Car
{
// クラス変数
public static int sum = 0;
private int number;
private String color;
public Car() {
number = 0000;
color = "silver";
sum++;
System.out.println("車を作成しました。");
}
public void show() {
System.out.println("車情報");
System.out.println("ナンバー:" + number + ", カラー:" + color);
System.out.println("車の合計数:" + this.sum); // インスタンス変数内では、this. も利用可能。クラス変数へのアクセスも可能
}
public static void showSum() {
System.out.println("車の合計数:" + this.sum); // クラスメソッド内では、this. は利用できない為、エラー
System.out.println("車のナンバー:" + number); // クラスメソッド内では、インスタンス変数にアクセスできない為、エラー
}
}
public class JavaSampleClass{
public static void main(String[] args) {
Car.showSum(); // クラスメソッドの為、オブジェクトを作成していなくても呼び出せる
Car car1 = new Car();
car1.show();
Car.showSum();
}
}