Javaの面接中に発生する問題


1、abstractのmethodは同時にstaticであってもよいか、nativeであってもよいか、synchronizedであってもよいか.
abstractのmethodはstaticではいけません.抽象的な方法は布団類で実現されるので、staticは子類とは関係ありません.abstractのmethodはnativeであってはならない.native法は、この方法が別のプラットフォームに依存するプログラミング言語で実現されることを示しており、布団類の実現の問題は存在しないため、抽象的ではなく、abstractと混用することはできない.たとえば、FileOutputSteamクラスはハードウェアで扱われ、最下位の実装はオペレーティングシステム関連のapi実装、例えばwindowsではc言語で実装されるので、jdkのソースコードを見ると、FileOutputStreamのopenメソッドの定義は以下の通りであることがわかります.            private native void open(String name) throws FileNotFoundException; もし私たちがjavaで他の人が書いたc言語関数を呼び出すならば、私たちは直接呼び出すことができません.私たちはjavaの要求に従ってc言語の関数を書く必要があります.また、私たちのこのc言語関数は他の人のc言語関数を呼び出す必要があります.私たちのc言語関数はjavaの要求によって書かれているので、私たちのこのc言語関数はjavaとドッキングすることができます.javaの向こうのドッキング方式は私たちのこのc関数に対応する方法を定義することです.javaの中で対応する方法は具体的なコードを書く必要はありませんが、前にnativeを宣言する必要があります.abstractのmethodはsynchronizedではありません.私の数年の学習と開発では、このような状況を見たことがありません.そして、synchronizedは具体的な方法に作用してこそ意味があると思います.また,メソッド上のsynchronized同期で使用される同期ロックオブジェクトはthisであり,抽象メソッドではthisが何であるかは特定できない.
 
2、super.getClass()メソッド呼び出し次のプログラムの出力結果はいくらですか?
import java.util.Date;
public  class Test extends Date{
    public static void main(String[] args) {
        new Test().test();
    }
   
    public void test(){
        System.out.println(super.getClass().getName());
    }
}

testメソッドでは、getClass().getName()メソッドを直接呼び出し、Testクラス名を返します.getClass()はObjectクラスでfinalと定義されているため、サブクラスはこのメソッドを上書きできないため、testメソッドではgetClass().getName()メソッドを呼び出します.実は親クラスから継承されたgetClass()メソッドを呼び出し、super.getClass()メソッドを呼び出すのと同じです.super.getClass().getName()メソッドが返すのもTestのはずです.親の名前を取得するには、getClass().getSuperClass().getName();
 
3、try{}にreturn文がありますが、このtryに続くfinally{}のcodeは実行されますか?いつ実行されますか?returnの前ですか?それとも後ですか?あなたの答えはreturnの前かもしれませんが、もっと詳しく言えば、私の答えはreturnの間で実行されます.次のプログラムコードの実行結果を見てください.
public  class Test {
public static void main(String[] args) {
      System.out.println(new Test().test());;
}

static int test()
{
        int x = 1;
    try{
        return x;
    }
    finally{
        ++x;
    }
}   
}

運行結果は1ですが、なぜですか?プライマリ関数がサブ関数を呼び出して結果を得るプロセス.たとえば、プライマリ関数が空き缶を用意し、サブ関数が結果を返す場合は、まず結果を缶に入れてから、プログラムロジックをプライマリ関数に返します.戻るということは、サブ関数ということです.私は実行しません.あなたのメイン関数は実行を続けましょう.これは何の結果もありません.結果はこの話をする前に缶に入れました.
 
4、errorとexceptionの違いは何ですか.      Errorは、リカバリが不可能ではないが困難な場合の深刻な問題を示している.たとえばメモリオーバーフローです.プログラムがこのような状況を処理できるとは期待できない.すぐ  errorが発生すると、実行プログラムが終了し、仮想マシンが終了すると言います.プログラムを正常な軌道に戻す方法はありません.たとえば、次のコードがあります.
public class Outer{
	public static void main(String[] args){
		try{
			int[] i=new int[1000000000];
		}catch(Exception e){
			System.out.println("aaa");
		}
	}
}  

 実行結果:
Exception in thread "main"java.lang.OutOfMemoryError : Java heap space     at hr.test.Outer.main(Outer.java:7)
       Exceptionは、設計または実装の問題を表します.つまり、プログラムが正常に動作している場合、発生しないことを示します.ただし、ArrayIndexOutOfBoundsExceptionなどの実行時異常なのか、FileNoFindExceptionなどの異常をチェックする必要があるのかは、try-catchでプログラムを実行し続けることができます.
      実行時の例外とチェックする必要がある例外の唯一の違いは、前者はメソッド署名を必要とせずに例外タイプを宣言し、後者は宣言しなければならないことです.errorもexceptionもThrowableを継承しているので、どちらも投げ出すことができます.
      異常とはjavaプログラムの実行時(非コンパイル)に発生した非正常な状況やエラーであり、現実生活のイベントとよく似ており、現実生活のイベントにはイベント発生の時間、場所、人物、ストーリーなどの情報が含まれ、1つのオブジェクトで表すことができ、Javaはオブジェクト向けの方法で異常を処理し、プログラムで発生した各例外も、例外の情報を含むオブジェクトにカプセル化されて表示されます.       Javaは異常を分類し、異なるタイプの異常はそれぞれ異なるJavaクラスで表され、すべての異常のルートクラスはjava.lang.Throwableであり、Throwableの下にはErrorとExceptionの2つのサブクラスが派生している.Errorはアプリケーション自体が克服し回復できない深刻な問題を示している.プログラムは死んだ分しかない.例えば、メモリオーバーフローやスレッドデッドロックなどのシステムの問題を話します.Exceptionでは、プログラムが克服・復元できる問題を示していますが、システム異常と通常異常に分けられます.システム異常はソフトウェア自体の欠陥による問題です.つまり、ソフトウェア開発者が考えていないことによる問題で、ソフトウェア使用者は克服・復元できないという問題ですが、このような問題の下でソフトウェアシステムを稼働させたり、ソフトウェアを死なせたりすることもできます.例えば、配列スクリプトオーバヘッド(ArrayIndexOutOfBoundsException)、空ポインタ異常(Null PointerException)、クラス変換異常(ClassCastException)通常の異常は運転環境の変化や異常による問題であり、ユーザが克服できる問題であり、例えば、ネットワークが断線し、ハードディスクの空間が足りないなどの異常が発生した後、プログラムは死ぬべきではない.       JAvaはシステム異常と通常異常に異なる解決策を提供し、コンパイラが通常異常を強制するにはtry.catch処理またはthrows宣言で上層呼び出しメソッド処理を継続しなければならないため、通常異常はchecked異常とも呼ばれ、システム異常は処理しても処理しなくてもよいため、コンパイラはtry.catch処理またはthrowsで宣言しない.したがって、システム異常はunchecked異常とも呼ばれる.