質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

1842閲覧

引数について

kisaragizinzin7

総合スコア90

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/03/28 08:41

コード public class MainActivity extends Activity{ CanvasView cv; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cv = new CanvasView(this); setContentView(cv); } }
コード public class CanvasView extends View{ Paint paint = new Paint(); int x = 100, y = 100; int r = 50; public CanvasView(Context context) { super(context); } public void onDraw(Canvas canvas){ paint.setColor(Color.BLUE); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); canvas.drawCircle(x, y, r, paint); } }

上のプログラムは円を描くプログラムです。
エラーは出ていません。

引数に関して質問です。
インスタンス化したものとコンストラクタの引数は同じでないといけないので
MainActivityクラスのcv = new CanvasView(this);のthisと
CanvasViewクラスのpublic CanvasView(Context context) {
のcontextは型は同じだと思うのですがthisとcontextはなぜ同じになるのでしょうか?
thisはMainActivity自身なのでMainActivityとthisとcontextは同じものなのでしょうか?

またこのcv = new CanvasView(this);のthisの部分をgetApplication()にしても正常に動いたのですが、getApplication()とcontextはどういう関係なのでしょうか?

質問内容がわかりにくいかもしれませんがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

下記の継承関係を良く見てください。
http://developer.android.com/reference/android/app/Activity.html

下記引用です。MainActivityはActivityクラスを継承していますので、Contextクラスは、MainAcitvityクラスのスーパークラスです。
したがって、MainActivity is a Context(Is a関係)といいます。

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity

同様に、ApplicationクラスもContextクラスを継承していることがわかります。
http://developer.android.com/reference/android/app/Application.html

投稿2016/03/28 09:13

編集2016/03/28 13:23
Odacchi

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2016/03/29 01:03

丁寧な回答ありがとうございます。 継承関係をよく調べようと思いました! ありがとうございました。
guest

0

ベストアンサー

MainActivityクラスのcv = new CanvasView(this);のthisと

この「this」は「onCreate」を実行しているMainActivityクラスのインスタンスです。
そして、Activity | Android Developers によると

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.view.ContextThemeWrapper
↳ android.app.Activity

なので、ActivityクラスはContextクラスの子クラスの子クラスの。。。まあ、ActivityクラスはContextクラスの「一種」という扱いになると思ってください。
同様に、MainActivityクラスもActivityクラスの子クラスになっているため、MainActivityクラスもContextクラスの「一種」という扱いになります。
「AはBの一種」という関係になっているクラス同士だと、「AのインスタンスをBのインスタンスとして扱ってよい」というのがオブジェクト指向の世界での一般的な考え方です。
よって「this」によって示されるMainActivityクラスのインスタンスはContextクラスのインスタンスとして扱ってもよいのです。
また、「Activity#getApplication()」で取得されるものに関しては、

public final Application getApplication ()
Return the application that owns this activity.

なので、MainActivityを保持・実行しているApplicationということになりますね。
で、Application | Android Developers によると

java.lang.Object
↳ android.content.Context
↳ android.content.ContextWrapper
↳ android.app.Application

なのでApplicationクラスもContextクラスの一種であるとわかります。
でも、ApplicationクラスとActivityクラスは途中から親クラスが違っているので「ApplicationクラスがActivityクラスの一種」とかその逆とかは関係が成立しないのです。

投稿2016/03/28 09:15

編集2016/03/29 01:39
tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2016/03/29 01:02

丁寧な回答ありがとうございます。 とてもわかりやすく理解できました! ApplicationクラスはContextクラスの一種なのは理解できましたが cv = new CanvasView(this);でthisがgetApplication()でも正常に動くのはどうしてなのでしょうか? Application()ならわかるのですが.. getApplication()とApplication()は同じものなのでしょうか?
tkturbo

2016/03/29 01:38

getApplication()で返ってくる戻り値がApplicationクラスのインスタンスです。 だからnew CanvasView(this.getApplication())でもエラーにならないのです。 また、このインスタンスがMainActivityのオーナーなので動くのです。 あと、説明文が一部間違っていたので修正しました。
kisaragizinzin7

2016/03/29 02:04

そういうことなんですね! ありがとうございます。 1つ疑問に思ったのですが、 ApplicationクラスがContextクラスの一種という理由でthisをgetApplication()に置き換えてもいいなら java.lang.Object ↳ android.content.Context ↳ android.content.ContextWrapper ↳ android.app.Application なのでthisをgetContextWrapper()と置き換えるのいいのでしょうか?
tkturbo

2016/03/29 02:14

そんなメソッドはないのでコンパイルエラーになりますね => getContextWrapper()
kisaragizinzin7

2016/03/29 02:41

すみません。 ないですね笑 教えていただいたサイトのApplicationクラスでgetApplication()を探しても見つからないのですが、これはどこにあるのですか?
tkturbo

2016/03/29 02:48

回答本文中で「Activity#getApplication()」と記載しているのですが。。。
kisaragizinzin7

2016/03/29 02:53

すみません。 そうですね いろいろ質問に答えてくださってありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問