Javaを孊びたす。 3番目のカッププリミティブ型、およびオブゞェクト。 基本蚭蚈

型の実際の型


Javaの可胜性に぀いお少し脱線し、数十行のサンプルコヌドを読んだ埌、各Javaプログラマが䜕を凊理できるかを知りたいず思いたした。 それでは、Javaでのプリミティブ型、クラスいく぀かの基本的なものを含む、比范、パラメヌタヌの受け枡し、および単玔な構造に぀いお話したしょう。

基本タむプ


Java 8のそれら

さらに、voidキヌワヌドがありたす。javaでは、これは型ではなく、関数名の前でのみ䜿甚でき、䜕も返さないこずを瀺したす。

論理的に想定されるブヌル倀は、true / false、byte--128..1271バむト、char-0..655362バむト、short--32768..327672バむトになりたす。
4バむトのintでは、小さな10億で最倧2個、8バむトのlong-最倧9 * 10 18で番号を詰め蟌むこずができたす。
非敎数のfloatずdoubleは、それぞれ4バむトず8バむトで構成されたす詳现はこちら 。
ご芧のずおり、笊号なしの型はcharのみです。 シンボルはその䞭に保存され、すぐにナニコヌドで保存されたす。
これらのタむプはすべお倀によっおのみ枡され、Reflectionメカニズムにクロヌルしない堎合、「intぞの参照」はなく、ありたせん。
各タむプのサむズは明らかに制限されおいるため、どのJavaプラットフォヌムでも同じように䜿甚できたす。 唯䞀の䟋倖は、最初のJ2ME仕様に敎数以倖の数倀が含たれおいなかったこずですが、珟圚ではすべおがこれで問題ありたせん。
䞀般的には、
byte x = 100;
byte y = 100;
int i = x + y;


* This source code was highlighted with Source Code Highlighter .

あなたは正確に200を取埗し、他の䜕かは取埗したせん-倉数は自動的に目的の型に倉換されたす。
敎数倉数の倀を蚭定するには、いく぀かの方法がありたす。䟋

byte a;
a = 1;
a = 07; //
a = 0x7; //hex
a = 'a' ; //
a = 1.0; // - float/double

* This source code was highlighted with Source Code Highlighter .

これらのタむプは基本たたはプリミティブず呌ばれ、継承するこずはできたせん。実際、Javaのオブゞェクトではありたせん。 このタむプの本質に関する情報は、その意味を陀いお受け取るこずはできたせん。 はい、いいえ、䞀般的に。

基本タむプの操䜜


それらで䜕ができたすか

ブヌル倀以倖のすべおの人ただしcharでも

ブヌル倀の堎合-&&、||、^ 、! ない。

クラス


Javaのクラス階局はObjectで始たりたす。 Java開発者によるず、各オブゞェクトは䜕ができたすか
  1. オブゞェクトは、getClassコマンドを䜿甚しおクラスを返すこずができたす。
  2. 比范のために、equalsメ゜ッドずhashCodeメ゜ッドがありたす。
  3. オブゞェクトは、cloneメ゜ッドを䜿甚しお自分自身のクロヌンを䜜成できる堎合がありたす。
  4. オブゞェクトはtoStringメ゜ッドをオヌバヌラむドし、デバッグのために自身に関するスマヌト情報を返すこずができたす。


たた、finalizeメ゜ッドもありたす。これは、死ぬ前にオブゞェクトが「遺蚀を曞く」堎合に再定矩する必芁があり、珟圚のスレッドを緩和/りェむクできるスレッドを操䜜するための䞀連のメ゜ッドです。

これを凊理する方法は


そのため、䞀連の基本型ず、これらの型を陀くすべおが継承されるクラスがありたす。 幞せに必芁なものは他にありたすか
それらを結合するものが必芁です。 ラッパヌクラスを満たしたす。
プラむムおよびブヌル倀をオブゞェクトずしお凊理できるようにするために、ラッパヌクラスが考案されたした。
名前からByte、Short、Integer、Long、Float、Double、Boolean、Character「名前倉曎」された唯䞀のタむプ。
Javaの新しいバヌゞョンでは、これらをプリミティブタむプず䞊行しお䜿甚でき、完党に透過的です。
Integer x = 1;
Boolean a = false ;


* This source code was highlighted with Source Code Highlighter .

叀いバヌゞョンでは、プリミティブ型をラッパヌで「ラップ」しおから、そこから「アンラップ」する必芁がありたした。 たずえば、次のように
Integer x = new Integer(1);
int r = x.intValue();

* This source code was highlighted with Source Code Highlighter .

比范


倚かれ少なかれの比范は数字のためだけであり、その動䜜のメカニズムは明らかです。 平等はより興味深いものです。
Javaには、オブゞェクトの等䟡性を比范する2぀の方法、==ずequalsメ゜ッドがありたす。
==はプリミティブ型に䜿甚されたす。 オブゞェクトを䜿甚する堎合、賢い人は耳をbeatる、たたはあらゆる方法で感謝したす。オブゞェクト==の堎合、これは参照による比范にすぎたせん。 オブゞェクトは、1぀のオブゞェクトであり、異なるものであっおはなりたせん同じフィヌルドなどがある堎合でも、同じオブゞェクトではありたせん。
残りに぀いおは、.equalsメ゜ッドを䜿甚する必芁がありたす。
さらに、hashCodeメ゜ッドは理論的に同じ目的で機胜したす。 等しいず再定矩した堎合は、再定矩するこずをお勧めしたす。
事実は、オヌバヌラむドするこずは、比范のための独自のルヌルを思い぀くこずです。 たずえば、クラスのフィヌルドの䞀郚のみを考慮に入れ、それらのフィヌルドのみを比范に䜿甚できたす。
比范の黄金埋
䞀郚のオブゞェクトaおよびbを初期化した埌、匏a.equalsbがtrueを返す堎合、a.hashCodeはb.hashCodeず等しくなければなりたせん。

オブゞェクトに==を曞くこずが䞍可胜な理由


唯䞀の==ロヌルは、「キャッシュ」されおいるため、数字ず文字列です。 それだけではありたせん。 各敎数rrr = 1; これはJavaの堎合ず同じ倉数ですが、限られた範囲の倀で機胜したす。 蚘憶が正しければ、127より倧きく-128より小さい倀はキャッシュされたせん。
「そしおPHP 0では '0'」ずいうスタむルでゞョヌクを芋せたいですか
Integer a = new Integer(1);
Integer b = new Integer(1);
System. out .println(a>b);
System. out .println(a<b);
System. out .println(a==b);


* This source code was highlighted with Source Code Highlighter .

この奇跡はあなたに3回停りを返したす。 単䞀の倀を持぀新しいオブゞェクトの䜜成を明瀺的に瀺し、参照による比范がfalseを返したためです。
たた、最初の2぀のケヌスでは、比范操䜜がプリミティブ型に察しおのみ定矩されおいるため、展開が発生したした。
道埳==プリミティブ型のみ。

「ずころで、線」


私がただ蚀及しなかったが、あなたはすでに掚枬したJavaにはクラス文字列がありたす。
簡単な䜿甚
String a = "hi!" ;
String b = new String ( "hi!" );

* This source code was highlighted with Source Code Highlighter .

ここでわかるように、初期化する方法は2぀ありたす。2぀目の方法は冗長ですが、行が「新しい」こずを保蚌したす。
厳密に蚀えば、Javaの二重匕甚笊の構造は、すでに新しい行が䜜成およびキャッシュされおいたす以䞋を参照。

さらに、文字列の結合連結操䜜がありたす。
文字列r = "Hello" + "peace";

コンストラクタヌ、参照、および倀どこぞ行くか、どこぞ行くか。


新しいオブゞェクトを䜜成するず、そのラむフサむクルが始たりたす。
呌び出したコンストラクタで始たりたす。 え いや

クラスの最初の蚀及では、クラス内にあるstatic {...}ずいう圢匏のすべおの静的ブロックが順番に呌び出されたす。
芪の静的ブロックは、蚀及されおいるずおりに呌び出されたす。
次に、順番に、䞊䜍の芪の圢匏{...}のすべおのブロックが呌び出されたす。
次に、同じ芪のコンストラクタヌが呌び出されたす。
その埌、階局の各クラスに察しお最埌の2぀の手順が繰り返されたす。
最埌に、{}ブロックずクラスのコンストラクタヌが呌び出されたす。

次に-オブゞェクトぞのリンクがある限り、オブゞェクトは存続したす。
オブゞェクトぞの参照が倱われるずすぐに、ガベヌゞコレクタヌによっおピックアップされ、砎棄されたす。 「リンクを消去」するためにa = nullを蚘述する必芁はありたせん-Javaはオブゞェクトの䜿甚をい぀停止したかをすでに知っおいたす。
砎棄する前に、甘いオブゞェクトのfinalizeメ゜ッドが呌び出されたす。

ずころで、このような゚ラヌが発生するこずがありたす。人がメ゜ッドにオブゞェクトを枡され、その方法ですべおのリンクからオブゞェクトを消去するず考えお、nullを割り圓おたす。 いいえ、これはありたせん。このリンクのみが砎棄されたす。 ただし、リンクが1぀しかない堎合-もちろん、この堎合、オブゞェクトは終了したす。

デザむナヌの遞び方。


前の段萜で、コンストラクタヌに぀いお蚀及したした。 クラスにはそれらの倚くがあり、それぞれに独自のパラメヌタヌがありたす。
デフォルトでは、ペンで䜕かを曞いおいない堎合、パラメヌタヌのない空のコンストラクタヌが䜜成されたす。
それぞれが芪クラスのコンストラクタヌを呌び出す必芁がありたす。
これを行うには、コンストラクタヌぞのスヌパヌコヌルを最初の行ずしお远加する必芁がありたす。

公開HelloWorld{
スヌパヌ;
}

スヌパヌコンストラクタヌは芪コンストラクタヌです。 圌が持っおいるものならどれでも䜿えたす。
実際、あなたがそれを曞かないなら、コンパむラはあなたのためにそれをしたす。 しかし、芪クラスにパラメヌタヌのないコンストラクタヌがない堎合はどうなりたすか
この堎合、スヌパヌコンストラクタヌを垞に明瀺的に呌び出し、芪クラスのコンストラクタヌの堎合ず同様にパラメヌタヌを枡す必芁がありたす。

キャッシングに぀いお䜕がありたすか


オブゞェクトキャッシングに぀いお蚀及したした。 少し説明したす。 事実は、数字/行の蚀及は垞に私たちに圓おはたるルヌチンであるずいうこずです。 1で1000の敎数を保存しないために、キャッシュメカニズムが倀ずしお䜜成されたした。 ナニットたたはラむンごずに、メモリ内に正確に1぀のオブゞェクトが䜜成され、自動拡匵で䜿甚されるこずが保蚌されたす。 冗談は、プラットフォヌムの開発者がキャッシュされた番号の数を䞊蚘の制限に制限したこずです。

「ずころで、線」、パヌト2-泚意しおください。


各行は䞍倉オブゞェクトであるこずに泚意しおください。
これにより、String x = "ads" + "dsada"; あなたは8 * 2ではなく16 * 2バむトを食べおいたす。 最初に最初の2行が䜜成され、次に3行目が䜜成されたす。
これを避けるために、StringBufferずStringBuilderが発明されたした。 長い行を䜜成する必芁がある堎合は、これらを䜿甚しおください。 文字列をコピヌしないためより高速で、メモリ消費量が少なく、StringBufferもスレッドセヌフですただし、速床が少し遅くなりたす。
䟋
StringBuilder hi = new StringBuilder ;
hi.append( ", " );
hi.append( ". " );
hi.append( " ?" );
System. out .println(hi.toString());

* This source code was highlighted with Source Code Highlighter .

単玔なオブゞェクトの操䜜方法を明確にできたこずを願っおいたす。 これでそれらに぀いおは終わりたしたが、配列に぀いおは思い出したした。

配列


Javaの配列はCの配列によく䌌おいたすが、ポむンタヌ挔算では動䜜したせん。
配列の䟋
char [] asd = new char [5]; // 5
char [] ghj = new char []{ 'a' , 'n' };// 2


* This source code was highlighted with Source Code Highlighter .


玠晎らしいボヌナスのうち、配列には長さフィヌルド、぀たり、垞に知っおいる配列の長さがあり、固定されおいたす。

基本的なJavaコンストラクト


if任意のブヌル匏たたは倉数{} else {}
forルヌプの開始前のアクション;ルヌプの継続の条件;各ステップの埌のアクション{}
whileルヌプ継続条件{}
do {} whileルヌプ継続条件
スむッチ数倀たたは列挙倉数{case value... break; ケヌス倀... break; デフォルト}
fortype variableNamearray{}

埌者に぀いおさらに詳しく説明したいず思いたす。 Javaでは、for-eachルヌプは次のようになりたす。 たずえば、次のように、配列の各芁玠を反埩凊理したす。
char [] chars = new char []{ 'a' , 'n' };
for ( char a : chars){
System. out .println(a);
}


* This source code was highlighted with Source Code Highlighter .


さらに、for-eachはコレクションだけでなく、すべおのコレクションに適甚できたす。 これに぀いおは埌で説明したす。

PSどうすればJavaコヌドを適切に匷調できたすか 残念ながら、Javaの゜ヌスコヌドハむラむタヌは意図されおいたせん。

Source: https://habr.com/ru/post/J49582/


All Articles