• ベストアンサー

メソッドについて教えてください。

java 初心者2日程です(objective-c経験者) 教えていただきたいのですが、以下のように オブジェクト.メソッド というピリオドが一つの書式と クラス?.?(何を指しているのでしょうか?).メソッド? というピリオドが二つの書式が見受けられますが どういう違いで使い分けるのでしょうか? 申し訳ありません。教えていただけますか? //インスタンス化 MyObject object = new MyObject(); //メソッドの利用 object.methodA(); System.out.print(xxxxx);

  • Java
  • 回答数4
  • ありがとう数6

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

  • ベストアンサー
  • bnosuke-x
  • ベストアンサー率39% (43/110)
回答No.4

object.methodA();は インスタンス変数.メソッド の形式。 System.out.print(xxxxx);は、 クラス名.staticなインスタンス変数.メソッド の形式です。 Javaにおいて「.」は、パッケージ名、クラス名、メンバ名(変数、メソッド)をくっつけるものです。 文法上は、1つ2つどころか、その気になればいくらでも付けることができます。 けど、普通は2つまでくらいしか見かけないですね。 パッケージ名の区切りに使うピリオドは置いておいて、それ以外のピリオドの登場場面を簡単に説明します。 1)インスタンス変数.メソッド、またはインスタンス変数.変数 これがいちばんよく見るものですね。 2)クラス名.メソッド、またはクラス名.変数 これはいわゆる static 宣言されたメソッドや変数を示します。 クラス内に書かれたstatic変数やメソッドは、クラスに一つだけで、個々のインスタンスには属さないものになります。 ですから、インスタンス変数名ではなくクラス名で指定します。 System.out.print() は上の2つを組み合わせたものです。

psychesine
質問者

お礼

ありがとうございます

その他の回答 (3)

  • asock
  • ベストアンサー率70% (7/10)
回答No.3

#2です。ご質問を読み直したらわたしの解答がずれている気がしたので、訂正と少々補足を・・・ > 基本的にオブジェクト.メソッド() という書式です。 は間違いで、 メソッドの呼出は、オブジェクト.メソッド() もしくは クラス.スタティックメソッド() の2つです。 System.out の部分ですが、 Systemクラスのスタティックフィールド(静的変数) out という意味です。 静的メソッドと静的変数についてはこちらをご覧になるとよいと思います。 http://www.nextindex.net/java/static.html http://takeoba.cool.ne.jp/java/staticMember.htm

psychesine
質問者

お礼

ありがとうございます

  • asock
  • ベストアンサー率70% (7/10)
回答No.2

メソッドは基本的に、オブジェクト.メソッド() という書式です。 Systemクラスのフィールド out はスタティックフィールドで、既に開かれている標準出力ストリームインスタンスを指します。 よって、System.out はPrintStreamオブジェクトそのものです。オブジェクトですので、.print()と続けてメソッドを書くことができます。 System.out.print("test")は以下のように考えるとよいと思います。 (System.out).print("test"); また、以下の記述を便宜的に省略していると考えることもできます。 PrintStream pstream = System.out; pstream.print("test"); 補足ですが、メソッドがなんらかのオブジェクトを返す場合は以下のような使いかたも出来ます。 // 子供クラス class Child {  public String hoge() {return "子供だよ";} } // 父親クラス class Father {  public void afo() {} } // 人間クラス public class Human {  private Father father;  public Child[] children = new Child[10];  // コンストラクタ  Human() {   father = new Father();   for (int i=0; i<children.length; i++)    children[i] = new Child();  }  // Fatherオブジェクトを取得  public Father getFather() {   return father;  }  // Child配列を取得  public Child[] getChildren() {   return children;  }  public static void main(String[] argv) {    Human man = new Human();   // メソッド呼出その1   man.getFather().afo(); // (man.getFather()).hoge(); に同じ   // メソッド呼出その2   man.getChildren()[0].hoge().length(); // (((man.getChildren())[0]).hoge()).length(); に同じ  } } このように「.」 でつないでメソッドを呼び出していくことは記述上便利なのですがメソッドがnullを返しうる場合は例外が生じるので(null.メソッド()という呼出は出来ませんよね)、きちんと例外処理を行うか無闇やたらにつなげない方がよいと思います。

参考URL:
http://www.nextindex.net/java/app/System.html
psychesine
質問者

お礼

ありがとうございます

回答No.1

System.out.print System:java.lang.Systemクラス out:上記Systemクラスのフィールド、java.io.PrintStreamクラスのインスタンス print(xxxx):printメソッド(今回の場合はjava.io.PrintStreamクラスのprintメソッド) つまり 「SystemクラスのoutというPrintStreamクラスのインスタンスのprintメソッドに引数xxxxを指定して実行する。」 です。 java.io.PrintStreamクラスには引数の型違いのprintメソッドが多数あります。 xxxxの型によって適切なprintメソッドが実行されます。

psychesine
質問者

お礼

ありがとうございます

関連するQ&A

  • クラス、インスタンスメソッドについて

    JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • (クラス名.this.メソッド)って・・・?

    次のようなクラスで public class ClassA {   public static void main(String[]args)   {     new ClassA(); /* 構築A */   }   public ClassA()   {     new ClassI();   }   public class ClassI()   {     ClassA.this.MethodA(); /* 命令A */   }   public void MethodA()   {     System.out.println("HELLO");   } } この命令Aの部分の (クラス名.this.メソッド)というアクセス方法がよくわかりません とりあえす(ClassA.this)が構築Aの部分で生成された インスタンスではないかとおもうのですがそれで正しいのでしょうか? また インナークラスはインナークラスの定義されているクラス以外から インスタンスを生成できないのでしょうか? つまり次のクラスを追加して public class ClassB {   public ClassB()   {     new ClassA.ClassI(); /* 構築B */   } } ここの構築Bのように(この場合はダメの様ですが)他のクラスから 構築することです もし仮にできるとしたら そのときの命令Aの(ClassA.this)は一体なんの インスタンスを指すのでしょうか 急ぎのプログラムを作っているので たいへん不躾ですが、なるべく早くお答えをお願いします

    • ベストアンサー
    • Java
  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • インスタンスNameを文字列で表現するには?

    Object State; public static final Object PLAY=new Object(); public static final Object STOP=new Object(); Sateを操作するメソッド(); : : System.out.println(Object.Stateの文字列表現); としたいのですが、ObjectインスタンスであるPLAYやSTOPをprintlnメソッドで文字列として表現させるにはどうすればいいのでしょうか?コンソールにPLAY,STOPと表示させたいのですが、そのままprintln(State)とすると訳の分からない文字(→java.lang.Object@239137)が出てきます。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 条件によって別のクラスのインスタンスを作成する場合

    大きな条件分岐があって、その条件によって別のクラスを同じ名前でインスタンス化し、以降で使いたいのですが、うまくコンパイルが通りません。考えてみればifブロックの中だけで有効なインスタンスになってしまうので、当たり前かも知れません。どのようにすれば、使えるようになるのでしょうか。 以下にコードを載せます。正しい書き方を教えて下さい。 よろしくお願いします。 if(条件A){ classA object; // objectという名前でclassAをインスタンス化 }else{ classB object; // objectという名前でclassAとは別のclassBをインスタンス化 } object.methodA(); // objectのmethodA関数を使用したい

  • スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラム

    スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラムでつまずいています。 Aを継承したB、Cクラスのインスタンスを作成し、スーパークラスであるA型の配列asにまとめます。 それからループでas[i]にはいっている各インスタンスのメソッドを使いたいのですが、 スーパークラスAにmethod()がないためコンパイルできません、Aにmethod()を作るとA.method()が実行されます。 BとCを同じ配列に保存し、かつそれぞれのmethod()を実行したい場合どのようにしたら良いのでしょうか。 ご教授ください、どうぞよろしくお願いします。 class Main{ private B b; private C c; private A[] as = new A[2]; void mainMethod(){ as[0] = b = new B(); as[1] = c = new C(); for(int i=0; i<3; i++){ as[i].method(); } } } class A{} class B extends A{ void method(){ System.out.print("It is B"); } } class C extends A{ void method(){ System.out.print("It is C"); } }

  • System.out.printlnの仕組み

    javaのSystem.out.println();について質問です。 System.out.println()の仕組みのサンプルコードを、以前書籍かサイトで見かけました。 それを見る限り この out は、Systemクラスのフィールド、定数out(静的)でPrintStream型のようでした。 そして、このPrintStream型の定数にPrintStreamのインスタンスを代入していました。 定数outはstaticだったのでSystem.out とSystemクラスはnewせずに直接呼べて、 定数自体にはPrintStreamインスタンスの参照が格納されているので printlnメソッドは、PrintStreamクラスのものかなと思いました。 疑問なのは、Systemクラスの定数に わざわざPrintStreamインスタンスを代入して PrintStreamクラスのメソッドを呼んでいるのかということです。 なぜPrintStreamクラスのprintlnメソッドを使うために PrintStreamクラスとSystemクラスの両方を使用するかが見えてきません。 詳しい方おられましたら教えてもらえないでしょうか?

  • 二つの変数の値を入れ替えるメソッドを作成できますか?

    メソッドに二つの同じ型の変数を渡し、その値を入れ替えるメソッドを作りたいのですが、Java では、関数の参照渡しができないためにできません。 できるだけシンプルな記述にしたいのですが、何か方法のわかる方、降りましたら書き込みお願いします。 ちなみにクラスをひとつ作ればできることはわかっています。 <例> public class MainProc { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ObjectPair objPair = new ObjectPair(); objPair.setObjValue1(new Integer(1)); objPair.setObjValue2(new Integer(2)); objPair.ReplaceValue(); System.out.println("intValue1:"+objPair.getObjValue1()); System.out.println("intValue2:"+objPair.getObjValue2()); } } public class ObjectPair { private Object objValue1 = null; private Object objValue2 = null; public void ReplaceValue(){ Object objWork = objValue1; objValue1 = objValue2; objValue2 = objWork; } public Object getObjValue1() { return objValue1; } public void setObjValue1(Object objValue1) { this.objValue1 = objValue1; } public Object getObjValue2() { return objValue2; } public void setObjValue2(Object objValue2) { this.objValue2 = objValue2; } } よろしくお願いします。

    • ベストアンサー
    • Java
  • equals()メソッドの継承について

    ある本に ーーーーーーーーーーーーーーーーーーーーー class Car { protected int num; protected double gas; public Car() { num = 0; gas = 0.0; System.out.println("車を作成しました。"); } } class Sample8 { public static void main(String[] args) { Car car1 = new Car(); Car car2 = new Car(); Car car3; car3 = car1; boolean bl1 = car1.equals(car2); boolean bl2 = car1.equals(car3); System.out.println("car1とcar2が同じか調べたところ" + bl1 + "でした。"); System.out.println("car1とcar3が同じか調べたところ" + bl2 + "でした。"); } } JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来るわけです。 ----------------------------------------- JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来る    についてですが、 逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があるという意味なんでしょうか?

    • ベストアンサー
    • Java

専門家に質問してみよう