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

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

ただいまの
回答率

89.19%

staticかつabstractなクラスとは何でしょうか

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,113
退会済みユーザー

退会済みユーザー

AndroidとJavaの初心者です。
Androidでのdb周りとの連携について勉強しているのですが、そこでContractクラスを定義する際に、
  public static abstract class Users implements BaseColumns
というふうに、staticかつabstaractなクラスの定義をしているのを見つけました。
私の理解では
staticクラス:アウタークラスのインスタンスが生成しなくても内部のメソッドが実行可能
abstractクラス:抽象クラスでそれ自体のインスタンスを生成できず、継承にしか使えない。

だと思うのですが、2つが合わさるとどのようなクラスになるのでしょうか。

ざっくりとしたイメージとして、staticはインスタンスが生成しなくても大丈夫ーというのに対して、
abstractはインスタンスの生成を禁止!という意図で両者は結構相反する概念なのかなと考え、混乱しています。

ご回答よろしくお願いいたします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

そのstaticでabstractなクラスは何かのクラスの内部クラスではないでしょうか?
だとすると,その解釈は,
  • static: 外部クラスのインスタンスが無くてもアクセスできる内部クラス
  • abstract: この内部クラス自体のインスタンスは生成できず,継承して使うべきクラス
ということになります.
例えば次のようなクラス構成になっていた場合,
public class A{
    public static abstract class B{
    }
}
Aのインスタンスを生成せずともBにアクセスできるが,これを継承しないと使えないので,
public class C extends A.B{
}
こういう使い方になるのではないでしょうか.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/23 12:33

    早速のご回答誠にありがとうございます。
    丁寧な回答のために、かなり理解が進みました。

    ただ一点伺ってもよろしいでしょうか。

    static: 外部クラスのインスタンスが無くてもアクセスできる内部クラス
    とのことですが、つまりstaticがついていない場合
    public class C extends A.B{
    }
    というふうに継承できないと考えてよろしいでしょうか。

    またstaticがついていない場合、内部クラスを継承する方法について教えてもらえるとありがたいです。

    よろしくお願いいたします。

    キャンセル

  • 2015/08/23 14:35 編集

    http://www.wisdomsoft.jp/131.html
    staticのない内部クラスの使い方についてはここを御覧ください.
    継承についてですが,staticが付いていない内部クラスについては外部クラスと関連した状態なので,外部クラスの外部から使うのは適切ではないと思われます.
    上記例でいけばAクラス,またはそのサブクラスの中でBを継承してクラスを継承して使うことになるのではないでしょうか.

    キャンセル

  • 2015/08/24 12:44

    ありがとうございました!
    よくわかりました!

    キャンセル

0

純粋なオブジェクト指向で見ると確かに違和感がありますが、Java言語のstatic classとabstract classの性質を活かしたテクニックじゃないでしょうか。ゆえに、オブジェクト指向の良し悪しから離れた方がいいと思います。

  • Usersを包含するクラスの生成毎にUsersをインスタンス化して欲しくないので、static classとして静的メンバにした。
  • Usersクラスは独立してインスタンス化するものではない(設計)だから、インタンスを生成されては困るので、abstractを付けてインスタンス化されないようにした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる