java - 请问下,这里为何会引发空指针异常?
黄舟
黄舟 2017-04-18 10:50:14
0
3
517

有人跟我讲,将name进行静态赋值即可,但实例变量不也是属于成员变量吗,也是在整个类实例化的时候产生的啊,跟静态赋值有何区别吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全員に返信(3)
伊谢尔伦

親クラスの構築メソッドは、サブクラスの構築メソッドより前に実行されます。Base()->test()-->name.length()null と同等です。 .length()。
もちろん、静的メンバーはインスタンス メンバーが初期化される前に初期化されるため、name を static として記述しても問題ありません。 Base()->test()-->name.length()相当于null.length()
name写成静态的话,当然可以了,因为静态成员的初始化先于实例成员的初始化。

顺序大概是这样的:

  • 父类static{...}

  • 父类静态成员

  • 父类构造方法

  • 子类static{...}

    順番は大まかに以下の通りです
    • 親クラスstatic{...}

    • 親クラスの静的メンバー

    🎜親クラス構築メソッド🎜🎜 🎜🎜サブクラスstatic{...}🎜🎜 🎜🎜サブクラスの静的メンバー🎜🎜 🎜🎜サブクラス構築方法🎜🎜 🎜
いいねを押す +0
巴扎黑

まず、オブジェクトの初期化プロセスという概念を捨てます:
静的初期化ブロック>インスタンス変数>静态变量 > 静态初始化块 > 实例变量 > 构造器
而存在父子类关系的对象,又存在一个嵌套的初始化流程
父类初始化流程 > 子类初始化流程

所以在你实例化的过程中,调用父类构造器并调用test()方法时,子类的name还没有赋值,仍然是null親子クラス関係を持つオブジェクトには、ネストされた初期化プロセスもあります

親クラスの初期化処理>サブクラスの初期化処理🎜 🎜したがって、インスタンス化プロセス中に、親クラスのコンストラクターを呼び出して test() メソッドを呼び出すとき、サブクラスの name にはまだ値が割り当てられておらず、 null の場合、当然、null ポインタが報告されます。 🎜
いいねを押す +0
小葫芦

あなたはname放在父类Base中定义就不会报错。 因为你实例化Sub时,会调用默认的构造函数,默认的构造函数会调用父类的构造函数,在父类的构造函数中,你使用了test()方法,而你在子类中重写了该方法,子类的test方法内使用了name,但是这时候name还没有完成初始化。所以会报NullPointerExceptionを受け取ります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!