68634


以下のコードで、入れ子クラスCircleクラスのインスタンスメソッド で気になる点があります。

[code]

    public boolean hit(int x, int y) {
        return (xpos-x)*(xpos-x) + (ypos-y)*(ypos-y) <= rad*rad;
    }
    
[/code]

boolean型の使い方は、boolean型変数を宣言して、箱の中にはtrue,faleseの二つが入る、と認識していますが、このようにインスタンスメソッド「hit」の前に使う場合、どうやって処理されているのかがわかりません。

と言いますのも、インスタンスメソッドは一般的に 「public void メソッド名（引数）{処理する内容}」だからです。

一方、この場合は、voidではなく、booleanと書いてあり、メソッドの中身の、不等式の前にreturnと書かれています。  
boolean型変数をここで使うことの効果、returnとの関係を教えていただければ幸いです。また、ここでbooleanを使う場合は、returnは必ず必要でしょうか？

**追加で質問です**

インスタンスメソッド

[code]

    public void moveTo(int x, int y) {
        xpos = x; ypos = y;
    }
    
[/code]

は、返り値の型がvoidになっています。本には、returnを使う場合、返り値にvoidは使えない、とかいています。では、このインスタンスメソッドの場合は、returnがないため、引数であるx,yを`xpos
= x; ypos = y;`で返しているとは言えないのでしょうか？

以下がプログラムです。

[code]

    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Sample91ex3 extends JPanel {
        Circle[] circles = new Circle[20];
        //Circle sel = null;
    
        public Sample91ex3() {
            setOpaque(false);
            int x = 30;
    
            for (int i = 0; i<20 ; ++ i) {
                circles[i] = new Circle(Color.black, x, 100, 15);
                x = x + 40;  
            }
    
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent evt) {
    
                    for (int i = 0; i<20 ; ++ i) {
                        if(circles[i].hit(evt.getX(), evt.getY())) {
                        // sel = circles[i];
                            circles[i].changeColor();
                            circles[i].moveBy(10, 10);
                            repaint();
                        }
                    }
                }
            });
        }
    
        public void paintComponent(Graphics g) {
            for (int i = 0; i < 20; ++i) {circles[i].draw(g); }
        }
    
        public static void main(String[] args) {
            JFrame app = new JFrame();
            app.add(new Sample91ex3());
            app.setSize(800, 300);
            app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            app.setVisible(true);
        }
    
        static class Circle {
            int xpos, ypos, rad;
            Color col;
            public Circle(Color c, int x, int y, int r) {
                col = c ; xpos = x; ypos = y; rad = r;
            }
            public void draw(Graphics g) {
                g.setColor(col);
                g.fillOval(xpos-rad, ypos-rad, rad*2, rad*2);
            }
            public void moveBy(int x, int y) {
                xpos = xpos + x ; ypos = ypos + y;
            }
    
            public void moveTo(int x, int y) {
                xpos = x; ypos = y;
            }
            public boolean hit(int x, int y) {
                return (xpos-x)*(xpos-x) + (ypos-y)*(ypos-y) <= rad*rad;
            }
            public void setColor(Color c) {
                col = c;
            }
            public void changeColor() {
                col = new Color((int)(Math.random()*255),(int)(Math.random()*255),
                                (int)(Math.random()*255));
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-07-16T02:38:16.173
68632
2020-07-16T15:12:43.730
2020-07-16T15:12:43.730
2808
39688
question
java
voidの代わりにメソッド名の前に付与されている型名(boolean)について


> インスタンスメソッドは一般的に 「public void メソッド名（引数）{処理する内容}」だからです。

違います  
「public 返り値の型 メソッド名（引数）{処理する内容}」  
です  
関数に何らかの値を渡し、計算結果を返り値として受け取るという、関数の一般的な使い方です

処理内容の中でreturn文に指定された値が返り値となります  
今回の関数 hitで返される値は  
(xpos-x)(xpos-x) + (ypos-y)(ypos-y) <= rad * rad  
つまり、( (xpos-x)(xpos-x) + (ypos-y)(ypos-y) ) が(rad *
rad)以下ならtrue,それ以外はfalseが返ります

**追加の質問について**  
関数moveToはクラスCircleのメンバxpos,yposを変更する関数であって、返り値の取得を目的とした関数ではありません。  
実際、関数の呼び出し元に「返って」いるわけではなく、別の場所に格納しているだけです。  
そのように見える、利用できるかもしれませんが、moveToという関数名からもわかるように、「特定の地点へ動かすこと」を目的にした関数です。

単にクラスのメンバを返り値の格納のためだけに利用するというのは通常考えられません。  
それ自身のインスタンスが返り値のように振る舞うクラスはありえますが。（行列操作を自身に作用させる関数等）


CC BY-SA 4.0
2020-07-16T03:56:14.420
68634
2020-07-16T10:25:49.260
2020-07-16T10:25:49.260
40962
40962
68632
answer