私はこのような単純なクラスを持っています。
class ClassWithDefaultConstructor{}
私は、このJDKで働いています。
C:\JavaSE14Folder>java -version
java version "14" 2020-03-17
Java(TM) SE Runtime Environment (build 14+36-1461)
Java HotSpot(TM) 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)
あなたが見ることができるように私は、JDKの最新バージョンを使用しています。
私はこのようなこの.classファイルを作成します。
C:\JavaSE14Folder>javac -d . ClassWithDefaultConstructor.java
私は、このコマンドを実行してください上の.classは後に作成されます。
C:\JavaSE14Folder>javap ClassWithDefaultConstructor.class
そして私は、以下を参照してください
Compiled from "ClassWithDefaultConstructor.java"
class ClassWithDefaultConstructor {
ClassWithDefaultConstructor();
}
ここでは、2つのものが最初にデフォルトコンストラクタが作成された私を幸せにmadesと私は、コンストラクタの視認性は素晴らしいことだが、3つの事は悲しい感じさせるクラスの同じであることがわかり:(
私の質問があります。
1). Why the constructor has no body and terminates with ;
2). Why the constructor hasn't a call to the java.lang.Object constructor?;
3). Why this class is not extending java.lang.Object
私はこのような何かを期待していませんでした。
class ClassWithDefaultConstructor extends java.lang.Object {
ClassWithDefaultConstructor(){
super();
}
}
私はこのポストのようなバイトコードに何かを期待しました。
おそらく、私は親切にしてください何かを逃しました。
ベネズエラから:)よろしく。
私はこのようなコマンドを入れた場合。
C:\JavaSE14Folder>javap -c ClassWithDefaultConstructor.class
Compiled from "ClassWithDefaultConstructor.java"
class ClassWithDefaultConstructor {
ClassWithDefaultConstructor();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."
<init>":
()V
4: return
}
違うのですが、それでも私は、オブジェクトを拡張し、そのように私のものを参照してくださいいけません。
私は、少なくともポストのように、このようなものを見たいと思っています。
Compiled from "test.java"
public class test extends java.lang.Object{
履歴書では私はそれらの暗黙の行を挿入するコンパイラを参照してくださいいけません。
この中にJavaの質問Javaの14で生成された.class程度のJavaの新しいバージョンで同じように起こる状態。
使用して同じ出力
C:\Program Files\Java\jdk1.8.0_121\bin
バイトコード!= Javaソースコード。
何が実際にクラスファイルには、単にランダムなバイトです。あなたが見ていることであるjavap
のは、バイトコードについて多くを知っている、したがって、可能な場合は、Javaに類似した構文を使用していないJavaプログラマに馴染みのあるように設計されたバイトコードのテキスト表現。しかし、それはないですし、実際のJavaのソースコードであることを意味していません。
次のようなさまざまな逆アセンブラを使用した場合クラカタウが、出力は非常に異なって見えるだろうが、それはまだ同じバイナリクラスファイルの表現になります。