kayano_devのブログ

技術関連の勉強記録用ブログ

【Java】変数の基本型と参照型

はじめに

Javaの勉強中に値渡しと参照渡しがごちゃごちゃになってしまったので色々調べていたところ、まずデータの型から整理して考えてみた方が良さそうだったのでまとめてみた。

基本型(primitive types)

まず、基本型(プリミティブ型)に分類されるデータ型としては以下の8つがある。

  • boolean
  • byte
  • char
  • short
  • int
  • float
  • long
  • double

データ型によって入れることの出来るデータの種類と大きさがそれぞれ異なってくる。
ちなみに、これを調べているときに「え?Stringって無いの??」と思って調べたところ、Stringはデータ型の一種ではなくStringクラスのインスタンスであることが分かった。

参照型(reference type)

一方、参照型は基本型とは異なり、値そのものではなく値がある場所が代入されている。
この参照型に分類されるのは配列変数。基本型に分類される変数とは違い、配列変数は宣言された段階ではどのくらいの容量が必要か分からないため、その値が置いてある場所を示すという仕様になっている。

おわりに

基本型と参照型について整理してみたところで、次回は値渡しと参照渡しについてまとめてみる。

参考にしたもの

docs.oracle.com

qiita.com

nobuo-create.net

【Java】superとsuper()

はじめに

Javaのクラス継承について学習する中で出てきた「super」と「super()」。
この二つが結構ごちゃごちゃになってしまう。
あと、「超」とか「すごい」ってイメージしてしまう英単語で名づけられてるので混乱する。
スーパークラスって単語見るたび「すごいクラス」とか何…?ってなる。
ということで理解を深めるために色々まとめてみる。

英単語としてのsuper

本題へ入る前に、モヤモヤを解消するためとりあえずまずは英単語としての意味をググってみた。
その結果、「超」とか「すごい」を意味するのは形容詞としての「super」であり、「スーパークラス」で使われている「super」はどうやら以下のことを意味していることが分かった。

接頭辞「上」,「超越」,「過度」などの意を表す1

スーパークラス」、「上のクラス」って意味なら結構しっくりくる。
ちなみにこの場合の「super」の対義語は「sub」で、「サブクラス」も「副次的なクラス」って意味ではなく「下のクラス」って意味合いになるっぽい。なるほど。

superとは

ここでようやく本題へ。
『スッキリわかるJava入門 第3版』387ページによると、

superとは、「今より1つ内側のインスタンス部分」を表す予約語です。

ということらしい。
インスタンスのフィールドを使う時は「super.フィールド名」、メソッドを使う時は「super.メソッド名(引数)」のように記述する。
オーバーライドしたメソッドと、オーバーライドする前のメソッドをどちらも使いたい時とかに書けそう。
これ単体であればわりと理解しやすい概念な気がする。

super()とは

一方こちらは親クラスのコンストラクタを呼び出す際に使用するもの。
引数を渡す場合は「super(引数)」のように記述する。
この「super()」、「super.メンバ」みたいに親クラスの物と子クラスでオーバーライドした物とどちらも使いたいときに書くものかと思っていたら、違った。
Javaにおいて全てのコンストラクタは先頭で必ず親クラスのコンストラクタを呼び出さなければならず、もしコンストラクタの1行目に「super()」が記述されていない場合、コンパイラによって「super()」が自動的に挿入されるとのこと。
つまり、親クラスに引数ありのコンストラクタがある場合、子クラスを作るときに必ず「super(引数)」を記述してやらないとエラーになってしまう。

おわりに

superとsuper()では使う時の感覚が結構異なることが分かった。
まだJavaでオリジナルの何かを作るって段階ではないんだけれども、先々このあたりでつまづきそうな気がしたので、今のうちに少しでもモヤモヤ感を解消できたので良かった。

参考にしたもの

ejje.weblio.jp book.impress.co.jp


  1. 引用:Weblio (情報提供元 Eゲイト英和辞典)