privateスコープについて

このQ&Aのポイント
  • Javaの初心者がprivateスコープについて質問しています。
  • コードの中で、Fooクラスのインスタンスのフィールドの値を比較する方法について疑問を持っています。
  • privateアクセスができない理由について説明してほしいという質問です。
回答を見る
  • ベストアンサー

privateスコープについて

はじめまして。Javaの初心者です。 どうしてもわからないことがあります。 以下のコードを見てみてください。 ************************************************ final class Foo { private int a; Foo(int a) { this.a = a; } public int func(Foo f) { if(this.a <= f.a) { return 1; } else { return -1; } } } final class Demo01 { public static void main(String[] args) { Foo obj1 = new Foo(10); Foo obj2 = new Foo(20); System.out.println(obj1.func(obj2)); } } ************************************************ Fooクラスの2つの異なるインスタンスのフィールドの 値の比較は、funcメソッドの呼び出しによって行われるのですが、funcメソッドの中で、実行中のインスタ ンス(this)のaにアクセス(this.a)することができるこ とは理解できるのですが、実行中のインスタンスとは 異なるFooクラスのインスタンスのaにアクセス(f.a)し たときprivateアクセスのため、参照できないとはなら ないのは、なぜなのでしょうか?どうかご教授をお願 いします。

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#19197
noname#19197
回答No.2

クラスがテンプレートという意識は誤解です。 クラスは定義です。 どういうプロパティ、メソッドを持っているという情報だけです。 テンプレートという意味とは違います。 各インスタンスの変数は別のスタックに持ってますので考え方としては合っています。 しかし、アクセスできるかどうかはクラスの定義のセキュリティによるものなので、スタックは関係なくクラスの定義に依存します。 別の考え方をすると、インスタンス変数がアクセスできるかどうかを判断するのではなく、定義であるクラスが判断するので、アクセスのスコープについてはインスタンスという考え方は無視できると思います。

re-entry
質問者

お礼

emi2006様へ ご回答ありがとうございました。大変参考になりました。そして、大変勉強になりました。

その他の回答 (1)

noname#19197
noname#19197
回答No.1

privateは、同一クラスからしかアクセスできないので、インスタンスが別であろうと同一クラスなのでアクセスできます。 クラスとインスタンスの区別はついてますでしょうか?

re-entry
質問者

補足

すみません。クラスとインスタンスの区別がついて いないと思いますので、どうか教えてください。 クラスは、テンプレート的な存在であり、 インスタンスは、実体、つまり、メモリ上に存在 するものと認識しております。privateスコープは、 同一クラスからしかアクセスできないとおっしゃって おりましたが、実際にJVMが処理を行っているのは、 メモリ上のインスタンスについてだと思いますので、 privateスコープが同一クラス内であるならば、その クラスのインスタンスの中でのみprivateな変数などが 有効である。と考えてしまいます。ですから、実行中 のインスタンスの中で、クラスは同じでも異なるインスタンスにアクセスすることは、privateの範囲を 超えているような気がしてなりません。 どうかご教授をお願いします。

関連するQ&A

  • クラスとインスタンスについて

    はじめまして。Javaをはじめて3か月の超初心者です。 早速ではございますが、質問をさせていただきます。 以下のサンプルで、 class Foo { private int i = 0; Foo(int i) { this.i = i; } void func1() { System.out.println(this.i); } void func2(Foo foo) { System.out.println(foo.i); } } class Main { public static void main(String[] args) { Foo obj1 = new Foo(100); Foo obj2 = new Foo(500); obj1.func1(); obj1.func2(obj2); } } privateフィールドのスコープは同一クラス内からしか アクセスできないと参考書には記述されているの ですが、そのクラス内に上のサンプルのように this.iやfoo.iというように、クラスは同じでも インスタンスが異なるものがiにアクセスするとき、 上のサンプルは、どちらもアクセス制限のエラーが表 示されません。なぜなのでしょうか? this.iというアクセスは、現在実行中のインスタン ス内でのアクセスなので、privateスコープ内での アクセスであるというような感じがするのですが、 foo.iというアクセスの方は、現在実行中のインスタンスとは異なるインスタンス内でのアクセスなので、 privateスコープからはずれているような感じがして なりません。

    • ベストアンサー
    • Java
  • PHPでサブクラスからスーパクラスのprivate

    メンバにアクセスできる件について PHPでスーパークラスで定義したprivateのメンバにサブクラスからアクセスできる件について 質問です。 class TestClass { private $value01 = "スーパークラスの private メンバ"; public function testMethod01 () { print "スーパークラスのパブリックメソッド"; print "<h1>{$this->value01}</h1>"; } protected function testMethod02(){ print "スーパークラスの protected メソッド"; } private function testMethod03(){ print "スーパークラスの private メソッド"; } public function getMethodList(){ print_r(get_class_methods($this)); } } class ExClass extends TestClass{ private $value01 = "サブクラスの private メンバ"; } $obj = new ExClass(); $obj-> testMethod01(); と上記のようにサブクラスのインスタンスから継承したpublicなメソッド testMethod01()を実行すると スーパークラスのprivateなプロパティにアクセスできてしまいます。 これってどういうことでしょうか?privateメンバってそのクラスの中からだけしかアクセスできませんよね? 上記では、サブクラスからアクセスしているような状態にみえますがどういうことでしょうか? ご教授御願い致します。

    • ベストアンサー
    • PHP
  • privateなフィールドは継承されない?

    たとえば、 class A { private int width; public A(){ this.width=3; } public int getWidth(){ return width; } public void setWidth(int width){ this.width=width; } } -------------------------------- class B extends A { String name; public B(){ this.name="あきら"; } } -------------------------------- class TestAB{ public static void main(String[] args){ B b = new B(); B b2= new B(); System.out.println(b.getWidth()); b2.setWidth(5); System.out.println(b2.getWidth()); System.out.println(b.getWidth()); } } というのがあったとして、ある参考書では「privateなフィールドは継承されない」と書いてありました。 でも、これってwidthに直接アクセスして値を変更できないだけであって、 widthは継承されてるのではないですか? B型のb専用、b2専用のwidthがあるのではないですか? ちょっと頭がこんがらがってきました。。

    • ベストアンサー
    • Java
  • privateのメソッドをリフレクションで呼び出す方法

    privateのメソッドをリフレクションで呼び出す方法 private のメソッドをリフレクションで呼び出す方法 privateのメソッドもリフレクションというもので呼び出せると聞きましたが、やり方がよく分かりません。 aaaやbbbクラスのインスタンスを生成したいのですが、privateやpackage privateのため、そのままだとインスタンスが生成できません。 forNameメソッドやnewInstanceメソッドでどうにかできないかと試してみたのですが、イリーガル例外が発生してしまいます。 何かよい方法がないでしょうか? aaa, bbbのクラスを継承してモックを作成する方法もあるのですが、今回はそういった方法ではなく、privateやpackage privateメソッド(特にコンストラクタ)を外部から呼び出す方法がよいです。 public aaa { private aaa() { } private func() { } } public bbb { aaa() { } private func() { } }

    • ベストアンサー
    • Java
  • メンバ変数をpublicにするかset/getメソッドを定義するか

    Smarty入門という本を読んでいると、 class foo {  private $_a;  public function get_a() { return $this->_a;}  public function set_a(a) { $this->_a=a; }  : } というコーディングがありました。 class foo {  public $a;  : } というほうが素直だと思うのですが、上のように書く理由は何かあるのでしょうか? 書籍には、直接アクセスするのは望ましくなく、メソッド経由で行うべきと書いてありましたが、get/setの両方共を定義するならpublicと同じだと思います。 何らかの事情で変数名を変えた場合も、同じ事情でアクセスメソッド名も変えるべきだと思うので、メンテナンス性も同じだと思います。「変数名は絶対変えるべきだがアクセスメソッド名は別に変えなくて良い」というへんてこな事情が発生すれば別ですが。

    • ベストアンサー
    • PHP
  • javaプログラム 合ってるかお願いします

    プログラムは非常に苦手なため合ってないと思いますが、合ってないのは何が正解かを教えてください。 よろしくお願いします 1 ローカル変数を全て答えよ args,num 2 インスタンス変数を全て答えよ num 3 インスタンスメソッド名を答えよ Example2 4インスタンスメソッドを呼び出している行 public class Example2{ int num; public static viod main(String[] args){ Example2 ex2 = new Example2(5); int a = ex2.getNum(); System.out.println(a); } Example2(int num){ this.num=num; } int getNum(){ return this.num; } }

    • ベストアンサー
    • Java
  • JAVAの継承について

    JavaでクラスA,B,Cがあり、A,BはクラスCを継承しています。 この時にAのインスタンスを生成しCにある変数に値を設定します。 この設定した情報をBのインスタンスに一気に設定することは可能でしょうか? やりたいこととしてはAに設定した情報をBにコピーするようなイメージです。 すべてのsetterを呼びだして設定するのが面倒なので。 例)構文的に間違ってるかもしれませんがやりたいことは以下のような感じです。 A a = new A(); a.setStr("aaa"); a.setInt(5); B b = new B(); b.setStr(a.getStr()); b.setInt(a.getInt(); class A extends C{} class B extends C{} class C {  int x = 0;  String str = "";  private String setStr(String str){this.str=str;}  private String setInt(int i){this.x=i;}  private String getInt(){return this.x;}  private String getStr(){return this.str;} }

    • ベストアンサー
    • Java
  • sjcpの試験勉強--インナークラスの疑問

    JAVAのsjcp(310-035)の試験勉強をしています。 インナークラスの問題で、 public class A{ public void MethodA(final int a){ int b = 1; class Inner{ private void innerMethod(int c){ -----ここ------- } } } } という例題があり、質問は -----ここ-------(6行目) で参照できる変数は?というものです。 答えはfinal がついてる変数aと、自身のメソッドの引数cです。 finalがついてないメソッド内の変数bにはアクセスできません。 解説を読んで、 cは分かるんですが、 どうしてfinalがついてないとアクセスできないのでしょうか。 暗記として覚えてもいいのですが、理由が分かられる方、アドバイス宜しくお願いします。

    • ベストアンサー
    • Java
  • private voidなメソッドはstatic コンテキストですか

    コンパイルエラーで、 「static コンテキストから参照することはできません」 と表示されます。 ソースにstaticという文字は有りません。 private voidなメソッドはstatic コンテキストですか? [Foo.java] import com.nttdocomo.ui.*; public class Foo extends IApplication {  public void start() {   Display.setCurrent(new MyPanel());  } } class MyPanel extends Panel {  private void e() {   Bar.DShow(Dialog.DIALOG_ERROR, "", "");  } } [Bar.java] import com.nttdocomo.ui.*; public class Bar {  public void DShow(int type, String title, String body) {   Dialog d = new Dialog(type, title);   d.setText(body);   d.show();  } }

    • ベストアンサー
    • Java
  • クラス継承 メンバ引継ぎとprivateについて

    「クラス継承時のメンバ引継ぎの意味」と、 「privateでオーバーライドさせた際の挙動」ついて教えてください。 class Pa{  private $level="10";  public function getLevel(){   return $this->level;  } } class Ch extends Pa{  protected $level="5"; } $ch = new Ch(); echo $ch->getLevel(); このとき、$ch->getLevel();は、 Paクラスのメソッドをchオブジェクトで見に行ってるのでしょうか? それとも、Chクラスに引き継がれたメソッドを見に行っているのでしょうか? また、このときの「$this」「$this->level」は、それぞれ何を意味しているのでしょうか? また、このときの、Chクラスの「$level」は、どういう状態(扱い)になっているのでしょうか? エラーにならないのですが、再定義扱いされないのでしょうか? 新定義扱いされてるってことでしょうか? 「privateメンバを継承した際」、どういう動きをするのか(ルールになっているのか)教えてください。

    • ベストアンサー
    • PHP

専門家に質問してみよう