javaSE筆記試験問題のまとめ
8118 ワード
目次
基本データタイプとそれに対応するオブジェクト類の比較
FloatとDoubleの微妙な関係
i++と+i
final
continue lableとbreak lableの考察
ブロック、スタティックブロック、スタティック属性の出力順序を構成する方法。
方法スタック
try-finallyの戻り値
Integer a = 25;
Integer b = 25;
System.out.println(a == b); answer:true
System.out.println(a.equals(b)); answer:true
System.out.println(a.equals("25")); answer:false
System.out.println(a.equals(25)); answer:true
Integer a = 135;
Integer b = 135;
System.out.println(a == b); answer:false
System.out.println(a.equals(b)); answer:true
System.out.println(a.equals("135")); answer:false
System.out.println(a.equals(135)); answer:true
Integer a = new Integer(25);
Integer b = new Integer(25);
Long c = new Long(25);
System.out.println(a == b); answer:false
System.out.println(a == 25); answer:true // Integer , int,
System.out.println(c == 25); answer:true //Long ,int long
System.out.println(a.equals(b)); answer:true
System.out.println(a.equals("25")); answer:false
System.out.println(a.equals(25)); answer:true
Short a = 25;
Short b = 25;
System.out.println(a == b); answer:true
System.out.println(a.equals(b)); answer:true
System.out.println(a.equals("25")); answer:false
System.out.println(a.equals(25)); answer:false
P.S以下はInteger類のequalsソースとIntegerの自動箱詰めで呼び出されたValueOfメソッドです。またShotのequalsメソッドも列挙しました。//Integer equal
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
//
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high) //IntegerCache.low = -128
return IntegerCache.cache[i + (-IntegerCache.low)];//IntegerCache.high = 127
return new Integer(i);
}
//Short equals
public boolean equals(Object obj) {
if (obj instanceof Short) {
return value == ((Short)obj).shortValue();
}
return false;
}
(1)Integer類equalsソース:ObjではなくStringタイプであれば、直接falseに戻ります。Shottと同じです。(2)JVMは8種類の基本タイプの常量池を自動的に維持し、int定数池では-128~127の範囲を初期化しますので、Integer i=127の場合、自動箱詰め中は定数池の値を取っていますが、Integer i=128の場合は定数池の範囲内にないので、自動箱詰め中はnew 128が必要です。
float i = 25; //
Float i = 25; //
Float i = 25f;//
float i = 25.5;//
float i = 25.5f;//
float i = 42E3;//
double i = 42E3;//
float i = 25.5D//
double i = 25.5D//
double i = 25.5//
----------------------------------------------------------------------
float i = 25;
System.out.print(i == 25);//true
public class Test{
public static void main(String [] args){
int i = 1;
int s = ++i;
int x= i++;
System.out.printLn(i);//3
System.out.printLn(s);//2
System.out.printLn(x);//2
}
}
PS:+iは変更しても変数を変更します。i++は辺iだけ変更して、変数を変更しません。class finalTest{
final int i;
public void doSomeThing(){
System.out.println("i="+i);
}
}
P.S:このプログラムはエラーが発生します。finalで修飾されたメンバー変数は手動で値を割り当てなければなりません。メンバー変数のfinalを削除するとエラーが発生しません。プログラムはiにデフォルト値0を設定します。final修飾基本データタイプは変更できません。オブジェクト参照は変更できませんが、オブジェクトの内容は変更できます。label1: // 1
while (true) {
//
for (int i = 0; i <= 8; i++) {
System.out.println("i=" + i);
if (i == 5) {
break label1;
}
}
System.out.println("WAIT UP");
}
PS:break label labelのラベルで定義されたコードブロックから飛び出すことができます。ケーブル1は位置1に置いて、0、1、2、3、4を出力します。
ケーブル1は位置2に置いて、出力0,1,2,3,4 WAIT UP...サイクル
2.continue--label
for (int i = 0; i < 10; i++) {
System.out.println("i = " + i);
label1: for (int x = 0; x < 10; x++) {
System.out.println("x = " + x);
continue label1;
}
}
:
for (int i = 0; i < 10; i++) {
System.out.println("i = " + i);
for (int x = 0; x < 10; x++) {
System.out.println("x = " + x);
}
}
---------------------------------------------------------------------------------------
label1: for (int i = 0; i < 10; i++) {
System.out.println("i = " + i);
for (int x = 0; x < 10; x++) {
System.out.println("x = " + x);
continue label1;
}
}
, lable1 , :0,0,1,0,2,0...
:label1:
for (int i = 1; i < 10; i++) {
lable2:
System.out.println("i="+i);
for (int j = 0; j < 10; j++) {
if(j == 9) continue label1;
}
}
continue , , continue label1 lable2
public class App extends HelloA{
public App(){
System.out.println(9);
}
{
System.out.println(6);
}
static {
System.out.println(4);
}
private static int b = getStaticB();
public static int getStaticB(){
b = 10;
System.out.println(b);
return b;
}
public static void main(String[] args) {
System.out.println(1); //3,4,1,2,8,6,9,2,8,9,6,5
new App();
new App();
System.out.println("5");
}
}
class HelloA{
{
System.out.println(2);
}
public HelloA(){
System.out.println(8);
}
static {
System.out.println(3);
}
private static int a = getStaticA();
public static int getStaticA(){
a = 11;
System.out.println(a);
return a;
}
}
出力:3 11 4 10 1 2 8 9 2 8 6 6 9 5結論:1.例示的な化学種の場合、このクラスがロードされていない場合は、最初に親のクラスのオブジェクトをロードし、その後にサブクラスのオブジェクトをロードし、次に親クラスを実例化し、最後のインスタンスの化学子類は、このクラスがロードされている場合は、もはや親クラスとサブクラスのクラスのオブジェクトをロードしない。2.クラスオブジェクトをロードする場合、まず静的ブロックを実行し、その後静的属性を初期化する。オブジェクトを実例化する場合は、まずブロックを構成し、構造方法を実行します。(構造ブロックは必ず構造方法の前で実行されます)。
public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
Sytem.out.print(ex.ch);
}
public void change(String x,char y[]){
x="test ok";
y[0]='g';
}
}
good and gbc
実際には、方法スタックは方法の消失とともに、方法スタックの変数も消失する。 public static void main(String[] args) {
int i = tryFinallyReturn();
System.out.println(i);
}
public static int tryFinallyReturn(){
int i = 0;
try{
return ++i;// 1
}
finally {
i++;// 2
}
}
// 1, 1 i++ 0
P.S:finally総会が実行します。この行は位置1(ここでは一時変数がキャッシュされます。)で、位置2です。ここでiの値は2で、位置1に再実行されると、一時変数が返されます。したがって、位置2は、どんな操作をしてもリターン値には影響がありません。 public static void main(String[] args) {
int i = tryFinallyReturn();
System.out.println(i);
}
public static int tryFinallyReturn(){
int i = 0;
try{
return ++i;// 1
}
finally {
return ++i;// 2
}
}
// 2
P.Sのこのときの実行順序は、実行位置1であり、このときiは1を加算し、位置2に実行すると、プログラムはそのままリセットされます。