このコードの教育的な目的はわかりませんが、抽象クラスの考え方を整理しておきます。
抽象クラス
- クラスをabstractと宣言すれば抽象クラスである。抽象クラスは抽象メソッドを持つ必要はない。
- 抽象メソッドを定義するなら、クラスは抽象クラスとして宣言しなければならない。
** サブクラス**
- サブクラスは抽象メソッドを具象メソッドとしてオーバーライドするか、
- オーバーライドしないなら自分自身を抽象クラスとして宣言する。
コンパイラのチェック
- 抽象クラスのすべてのコンストラクターをprivateにすることはできない。
なぜなら抽象クラスを継承するサブクラスをインスタンス化できなくなるから。
抽象フィールド
- Javaには abstract 修飾子をつける抽象フィールドはない。つまり言語仕様はありません。Scalaには抽象フィールドがあり、テクニックとして抽象フィールドの値取得をメソッド化する方法等があります。
抽象メソッドを持たない抽象クラス
実例として、Java EE のHttpServletクラスがあるそうです。メソッドを抽象化しないのは、具象メソッドでデフォルト実装するからというのが理由のようです。
- HttpServletは、service()メソッドの中でHTTPヘダーを判断、doGet(),doPost(),doHead()などを呼び分ける。
- doGet(),doPost(),doHead()などは具象メソッドでありデフォルト実装が記述されている。
サブクラスは必要なメソッドだけをオーバーライドすればよい。
パターンに詳しいなら、Template Method パターンを適用し、doGet(),doPost(),doHead()などを抽象化するという選択肢もあるでしょうが、利便性を考えてあえてそうしない。JavaのAPIにはデフォルト実装がよく見られます。Swingのリスナー系クラスはデフォルト実装を持つものが多くあります。もっとも抽象メソッドも持っているかもしれませんが。
補足
フレームワークの都合で、サブクラスをスーパークラスの型(抽象クラス)で処理したいことはありますが、インターフェイスでも制約はありながら同じ機能を果たせます。インスタンス変数に依存しないならデフォルトメソッドも使えます。
追記
誤解を避けるために追記します。
抽象クラスのすべてのコンストラクターをprivateにすることはできない。
抽象クラスをインスタンス化できないのは当然ですが、抽象クラスのコンストラクターは、サブクラスのコンストラクターからsuper()の連鎖で呼べなければならない。質問の例はデフォルトコンストラクターが生成されて、呼べます。
質問の意図が「サブクラスのない抽象クラスが単独で存在する理由があるか」なら、あってもよい。
- Singleton型。インスタンスの生成をstaticメソッドで行う。ただしprivateなサブブラスは必要。
- staticな定数とメソッドだけを持つユーティリティ。
かならずしも抽象クラスにする必要はありません。
質問の意図が「抽象メソッドを持たない抽象クラスが存在する理由があるか」なら、振る舞いのデフォルト実装の例を紹介しました。swordoneさんの「有形資産」は属性のデフォルト実装と解釈できます。