JAva基础解疑!!!
7414 ワード
疑問1:0.01+0.09の結果?
public class MathTest{
public static void main(String[]args){
double a = 0.01, b = 0.09;
System.out.print(a+b);
}
}
印刷の結果、なぜ0.1ではなく0.099999999999999で精度損失が発生したのか、doubleでもfloatでもこの問題に遭遇し、floatを持って話すと、floatの0.1バイナリ形式は001110111001110011001100110011001101であり、シンボルビット換算による10進数表現の値は正確にこのように110011001100110011001101に2を乗じた負27乗であるべきである.実際の値は0.10000001490116119384765625であり、実際の誤差が発生します.
例
public float getLeftMoney() throws Exception {
// TODO Auto-generated method stub
float m = new MoneyDaoImpl().CountAllMoney();
float c = new DetailsDaoImpl().countDetailsMoney();
flaot less = m-c;
System.out.println(m);
System.out.println(c);
System.out.println(less);
return less;
}
解決策:
public float getLeftMoney() throws Exception {
// TODO Auto-generated method stub
float m = new MoneyDaoImpl().CountAllMoney();
float c = new DetailsDaoImpl().countDetailsMoney();
BigDecimal b1 = new BigDecimal(Float.toString(m));
BigDecimal b2 = new BigDecimal(Float.toString(c));
System.out.println(m);
System.out.println(c);
Float less = b1.subtract(b2).floatValue();
System.out.println(less);
return less;
}
質問2:Nullはどんなタイプですか。
解:
疑問3:スタックメモリとスタックメモリの違い?
解:
1 heep(スタック)は、動的に申請できるメモリ領域であり、一般的に作成されたすべてのオブジェクトがここに配置されます.stack(スタック)は、メソッド(関数)のパラメータ、ローカル変数を保存するために一般的に使用される先進的なデータ構造です.stack(スタック)の空間は小さいが、速度は比較的速く、オブジェクトの参照を格納し、スタック内のアドレスインデックスによってスタック内のオブジェクトを見つけることができる.②スタック(java stacks)もスレッドプライベートであり、そのライフサイクルはスレッドと同じである.仮想マシンスタックはjavaメソッドが実行するメモリモデルを記述します.各メソッドが実行されると、ローカル変数テーブル、オペレーションスタック、ダイナミックリンク、メソッド出口などの情報を格納するスタックが同時に作成されます.各メソッドは、実行が完了するまで呼び出され、スタックフレームが仮想マシンスタック内でスタックからスタックを出るプロセスに対応する.スタック(java Heap)はjava仮想マシンが管理するメモリの中で最大のブロックです.Javaスタックは、すべてのスレッドで共有されるメモリ領域であり、仮想マシンの起動時に作成されます.このメモリ領域の唯一の目的は、オブジェクトインスタンスを格納することです.ほとんどのオブジェクトインスタンスがここでメモリを割り当てます.
疑問4:インスタンス変数とは何ですか。クラス変数とは
解:
1クラス変数は静的変数とも呼ばれ、すなわち変数の前にstaticの変数を加え、クラス変数はオブジェクトを作成する前にメモリに存在し、クラスの作成に伴って作成される.インスタンス変数は、staticを付けていない変数であるオブジェクト変数とも呼ばれます.2クラス変数はすべてのオブジェクトが共有され、そのうちの1つのオブジェクトがその値を変更し、他のオブジェクトが変更した結果を得る.インスタンス変数はオブジェクトプライベートであり、あるオブジェクトはその値を変更し、他のオブジェクトに影響を与えません.③すべてのインスタンスオブジェクトは1つのクラス変数を共有し、メモリにはこのクラス変数値を格納するスペースが1つしかありません.したがって,あるオブジェクトがクラス変数値を変更した場合,別のオブジェクトがクラス変数値を取得するのは変更後である.インスタンス・オブジェクトを作成すると、メモリには、2つの異なるインスタンス・オブジェクトが同じclassクラスに属していても、同じ名前の非静的メンバー変数がメモリに占有する領域が異なる場合でも、オブジェクトのすべての非静的メンバー変数値を格納するメモリ領域が開きます.
public class A{
static int a = 0; //
private int b = 0; //
}
Public class B{
public void main (String[] args){
A a1 = new A();
A a2 = new A();
a1.a = 3; // A.a = 3;
a1.b = 4 ;
System.out.println(a2.a); // 3
// , a1 a, a2 a
System.out.println(a2.b); // 0
// , a1 b , a2 b
}
}
疑問5:リロードと書き換えの違い?
解:
①オーバーロードOverloadは、同じクラスに同じ名前のメソッドが複数存在してもよいことを示しますが、これらのメソッドのパラメータリストはそれぞれ異なります(すなわち、パラメータの個数やタイプが異なります).
条件:A)メソッド名は同一でなければならない(大文字と小文字が一致しなければ同一ではない)B)パラメータリストは異なり、パラメータリストは異なり、パラメータリストの個数が異なる;パラメータリストの配列順序が異なる.パラメータリストのデータ型が異なります.条件AとBを同時に満たさなければメソッドの重荷とはならない.
注意:
②Overrideの書き換えは、子クラスのメソッドが親クラスのメソッドの名前やパラメータと全く同じであることを示し、子クラスによって作成されたインスタンスオブジェクトによってこのメソッドが呼び出されると、子クラスの定義メソッドが呼び出されます.これは、親クラスで定義されているものと全く同じメソッドを上書きすることに相当します.これもオブジェクト向けプログラミングの多様性の表れです.子が親を上書きする方法は、親よりも少ない例外を放出するか、親が放出する異常の子例外を放出するしかありません.子は親のいくつかの問題を解決することができ、親より多くの問題を解決することはできません.サブクラスメソッドのアクセス権は、親よりも大きく、小さくすることはできません.親クラスのメソッドがprivateタイプの場合、子クラスには上書きの制限はなく、子クラスに新しいメソッドが追加されたことに相当します.
上書きするには、以下の点に注意してください.A)上書きする方法のフラグは、上書きする方法のフラグと完全に一致しなければ、上書きの効果を達成できません.B)上書きされたメソッドの戻り値は、上書きされたメソッドの戻り値と一致しなければならない.C)オーバーライドの方法によって投げ出された異常は、オーバーライドの方法によって投げ出された異常と一致しなければならない.D)上書きされたメソッドはprivateではありません.そうしないと、そのサブクラスでは新しいメソッドが定義されただけで、上書きされていません.