静的メソッドは、この方法ではありません。あなたは、順番に、可能であり、静的メソッド内で非静的メソッドを呼び出すことはできません。そして、あなたは唯一のクラス自体によって静的メソッドを呼び出すには、前提が存在しない場合に任意のオブジェクトを作成することができます。これは実際には、静的メソッドの主な目的です。静的メソッドは、クラスのメンバを変更するために使用することができ、クラスのメンバ変数、静的ブロックは、さらに性能を最適化するプログラムを書くことができます。しかし、Javaで覚えておいてください:静的は、ローカル変数を変更することはできません。
静的メソッド
静的メソッドは、任意のオブジェクトに依存しないので、静的メソッドは、一般的にそれはないだろう、それは任意のオブジェクトに添付されていないため、オブジェクトがなかったので、静的メソッドのために、それは、これではないので、アクセスすることができ、静的メソッドとして知られていますこのアップ。非静的メンバメソッド/変数を呼び出すことができるようにする必要があり、特定のオブジェクトに依存しているのでこの機能により、非静的メンバ変数やメソッドは、静的メソッドで非静的メンバクラスにアクセスすることはできません。
public class Test {
private static void staticMethod() {
System.out.println("静态方法调用了!");
}
public static void main(String[] args) {
Test.staticMethod();
Test t = new Test();
t.staticMethod();
}
}
結果:
!静的メソッド呼び出し
の静的メソッド呼び出し!
静的変数
また、静的変数静的変数として知られ、静的および非静的変数の違いは、変数は次のとおりです。静的変数はすべてのオブジェクトによって共有され、メモリ内のコピーは1つだけ、それは初期の負荷クラスが初期化されている場合のみとする場合です。オブジェクトが作成されたときに、静的変数はオブジェクトが初期化されているのではなく、各オブジェクトの複数のコピーが存在し、互いのコピーを持っています。
初期化シーケンスの静的メンバ変数が定義されたシーケンスを初期化されます。
public class Test {
private static String name = "feigege";
private static void staticMethod() {
System.out.println("静态方法调用了!"+name);
}
public static void main(String[] args) {
Test.staticMethod();
Test t = new Test();
}
}
結果:
静的メソッド呼び出しfeigege!
静的ブロック
そこstaticキーワードは、アプリケーションのパフォーマンスを最適化するために、コードの静的ブロックを形成するための、より重要な役割です。静的ブロックは、クラスは、静的な複数のブロックを有していてもよく、クラス内の任意の場所に配置することができます。クラスが最初にロードされるとき、静的ブロックの各々は一度だけ静的ブロックの順序で行われてもよいです。次のコード・ブロック・ロード・シーケンスstatci問い合わせ。
public class Father {
public Father() {
System.out.println("父类构造函数调用了!");
}
static {
System.out.println("父类static代码块调用了!");
}
}
public class Child extends Father{
public Child() {
super();
System.out.println("子类构造函数执行了!");
}
static {
System.out.println("子类static代码块执行了!");
}
}
public class Test {
public static void main(String[] args) {
Child c = new Child();
}
}
結果:
親クラスの静的コードブロックの呼び出し!
コードの静的ブロックをサブクラス化!
親クラスのコンストラクタを呼び出します!
サブクラスのコンストラクタが実行さ!
分析:
これは結果である理由として、我々は議論されない、メインの入り口がプログラムにあるので、最初のメインの方法を見つける、のが実装の冒頭で、このコードの特定の実施プロセスについて考えてみましょうが、mainメソッドを実行する前に、静的なブロックを発見し、彼らは静的なブロックを実行し、子クラスをロードした父などをロードするときに、テストクラスは子クラスをロードするときに父クラスから継承し、そのファーストクラスのロード父に変わります発見されなければなりません。父クラスローディングが完了した後、子クラスをロードし続け、その後、テスト・クラスは、静的ブロックが実行される静的なブロックを有しているが見つかりました。必要な負荷クラスの完了後、mainメソッドを実行し始めました。ときに、新しい子()を実行mainメソッドでは最初に親クラスのコンストラクタを呼び出し、その後、彼らのコンストラクタを呼び出します。したがって、出力結果の上が登場。
クラシック顔の質問
public class Test {
Person person = new Person("Test");
static{
System.out.println("Test static");
}
public Test() {
System.out.println("Test constructor");
}
// 执行入口
public static void main(String[] args) {
new MyClass();
}
}
class Person{
static{
System.out.println("person static");
}
public Person(String str) {
System.out.println("person "+str);
}
}
class MyClass extends Test {
Person person = new Person("MyClass");
static{
System.out.println("myclass static");
}
public MyClass() {
System.out.println("myclass constructor");
}
}
結果:
テスト静的
MyClassの静的
人静的
パーソンテスト
テストコンストラクタ
人のMyClass
MyClassのコンストラクタ
分析:
最初のテストクラスがロードされ、それは、Testクラスの静的ブロックで実行されます。その後、新しい新しいMyClassの()を実行し、MyClassのクラスがロードされていない、MyClassクラスをロードする必要があります。あなたはMyClassのクラスをロードするとき、我々はMyClassのクラスはテストクラスから継承したが、原因Testクラスには、既にロードされているので、唯一のMyClassクラスをロードする必要があり、それは静的なブロックのMyClassクラスを実行します。ローディングが完了した後、オブジェクトはコンストラクタによって生成することができます。オブジェクトを生成するときに、あなたが最初に親クラスのメンバ変数を初期化する必要があり、それゆえ=新しい人()、およびPersonクラスでの人の人物テストの実装では、以前にロードされていないので、最初のPersonクラスをロードすると、Personクラスを実装します静的ブロックは、親クラスのコンストラクタを実行し、初期化は、それ自体を初期化するために、次に、親クラスを完了し、したがってその後人の人のMyClass =新しい人()、最後に実行MyClassのコンストラクタで行われます。
概要
クラスがロードされると、静的ブロックを実行します。
オブジェクトが初期化されるとき、メンバ変数を初期化して、コンストラクタを実行します。