亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

一道面試題引發(fā)的思考:(1)

tommego / 2429人閱讀

這是網(wǎng)易2015校招Java面試題,直接上題目。

題目
package com.mousycoder.staticTest;

public class HelloB extends HelloA {
    public HelloB() {
        System.out.println("HelloB");
    }

    {
        System.out.println("I’m B class");
    }
    static {
        
        System.out.println("static B");
    }

    public static void main(String[] args) {
        new HelloB();
    }
}

class HelloA {
    public HelloA() {
        System.out.println("HelloA");
    }

    {
        System.out.println("I’m A class");
    }
    static {
        System.out.println("static A");
    }
}
答案
static A
static B
I’m A class
HelloA
I’m B class
HelloB()
考察點(diǎn)

static 相關(guān)知識(shí)

非靜態(tài)代碼塊相關(guān)知識(shí)

類加載順序

解析

存在父子關(guān)系,又有靜態(tài)代碼塊,先執(zhí)行父類靜態(tài)代碼塊,再執(zhí)行子類靜態(tài)代碼塊,故打印static A static B

存在父子關(guān)系,又有非靜態(tài)代碼塊,先執(zhí)行父類非靜態(tài)代碼塊,父類構(gòu)造器,再執(zhí)行子類非靜態(tài)代碼塊,子類構(gòu)造器故打印I"m A class HelloA I"m B class HelloB

結(jié)論

靜態(tài)代碼塊=>非靜態(tài)代碼塊=>構(gòu)造方法

父子關(guān)系:父類靜態(tài)代碼塊=>子類靜態(tài)代碼塊=>父類非靜態(tài)代碼塊=>父類構(gòu)造函數(shù)=>子類非靜態(tài)代碼塊=>子類構(gòu)造函數(shù)

擴(kuò)展知識(shí) 非靜態(tài)代碼塊
{ 
   System.out.println("I"m B class");
}

這個(gè)叫做非靜態(tài)代碼塊,也叫普通代碼塊,在每個(gè)類創(chuàng)建前(構(gòu)造函數(shù)之前)調(diào)用 ,不創(chuàng)建對(duì)象的時(shí)候,不被調(diào)用,代碼塊中定義的變量都是局部變量,如果有父子關(guān)系的話,先執(zhí)行父類的,再執(zhí)行子類的。非靜態(tài)代碼塊屬于對(duì)象,靜態(tài)代碼塊屬于類。

package com.mousycoder.staticTest;

public class Child extends Father{
    
    static {
        System.out.println("child-->static");
    }
    
    private int n = 20;
    
    {
        System.out.println("Child Non-Static");
        n = 30;
    }
    
    public int x = 200;
    
    public Child() {
        this("The other constructor");
        System.out.println("child constructor body: " + n);
    }
    
    public Child(String s) {
        System.out.println(s);
    }
    
    public void age() {
        System.out.println("age=" + n);
    }
    
    public void printX() {
        System.out.println("x=" + x);
    }
    
    public static void main(String[] args) {
        new Child().printX();
    }
}

class Father {
    
    static {
        //System.out.println("n+"+n);
            //當(dāng)n定義在下面時(shí),會(huì)提示Cannot reference a field before it is defined,
            //所以必須把n定義移到上面才可以輸出
        System.out.println("super-->static");
    }
    
    public static int n = 10;
    public int x = 100;
    
    public Father() {
        System.out.println("super"s x=" + x);
        age();
    }
    
    {
        System.out.println("Father Non-Static");
    }
    
    public void age(){
        System.out.println("nothing");
    }
}

結(jié)果:

super-->static
child-->static
Father Non-Static
super"s x=100
age=0
Child Non-Static
The other constructor
child constructor body: 30
x=200

解析:

先執(zhí)行靜態(tài)代碼塊,有父子關(guān)系,先執(zhí)行父類靜態(tài)代碼塊,打印super-->static

執(zhí)行子類靜態(tài)代碼塊,打印child-->static

實(shí)例化子類的時(shí)候,先實(shí)例化父類,在調(diào)用父類構(gòu)造方法之前,先調(diào)用父類非靜態(tài)代碼塊,打印Father Non-Static

實(shí)例化父類,調(diào)用父類構(gòu)造方法,執(zhí)行第一句 System.out.println("super"s x=" + x); 在調(diào)用構(gòu)造方法之前,成員變量x 已經(jīng)被賦值為100,打印super"s x=100

執(zhí)行age()方法,因?yàn)閙ain方法中真正實(shí)例化的是子類,子類又重寫了父類的age方法,所以執(zhí)行子類的age方法,此時(shí)子類還沒(méi)初始化,默認(rèn)n=0 ,打印age=0

實(shí)例化子類,調(diào)用子類構(gòu)方法之前,調(diào)用子類非靜態(tài)代碼塊,打印Child Non-Static

調(diào)用子類構(gòu)造方法,執(zhí)行this("The other constructor"),調(diào)用子類的Child(String s),打印The other constructor

執(zhí)行System.out.println("child constructor body: " + n); 初始化之前 成員變量初始值為20,執(zhí)行完非靜態(tài)代碼塊后 n被修改成30 ,所以這里n =30 打印child constructor body: 30

執(zhí)行printX()方法,打印x = 200

注意點(diǎn):

子類重寫父類的方法

雖然非靜態(tài)代碼塊里是局部變量,但是可以改變類的成員變量的值

靜態(tài)代碼塊
static {
  System.out.println("static B");
}

屬于靜態(tài)代碼塊,使用場(chǎng)景:1.想用一個(gè)存儲(chǔ)區(qū)域來(lái)保存一個(gè)特定的數(shù)據(jù),不想創(chuàng)建對(duì)象 2.創(chuàng)建一個(gè)特殊的方法,與這個(gè)類的對(duì)象沒(méi)有關(guān)聯(lián),即使沒(méi)創(chuàng)建對(duì)象,也可以調(diào)用

靜態(tài)變量

靜態(tài)變量也叫做static變量,靜態(tài)變量和非靜態(tài)變量的區(qū)別在于靜態(tài)變量被所有的對(duì)象所共享,在內(nèi)存中只有一個(gè)副本,它當(dāng)且僅當(dāng)類初次加載時(shí)會(huì)被初始化,而非靜態(tài)變量是對(duì)象所擁有的,在創(chuàng)建對(duì)象的時(shí)候被初始化,存在多個(gè)副本,各個(gè)對(duì)象擁有的副本互不影響 好處:1.可以用類名直接訪問(wèn)(方便),也可以用對(duì)象訪問(wèn)(不推薦) 2.只分配一次內(nèi)存,節(jié)省空間

靜態(tài)方法

靜態(tài)方法就是不會(huì)被this和super的方法。特點(diǎn):1.在static方法內(nèi)部不能調(diào)用所屬類的實(shí)例變量和實(shí)例方法(非靜態(tài)方法),但是可以在沒(méi)有創(chuàng)建任何對(duì)象的前提下,僅僅通過(guò)類本身(類名)來(lái)調(diào)用static方法 2.main方法就是static 方法,因?yàn)閳?zhí)行main方法的時(shí)候,沒(méi)有創(chuàng)建任何對(duì)象,只能通過(guò)類名去訪問(wèn) 3.沒(méi)有顯示聲明,類的構(gòu)造器也是靜態(tài)方法,參考:實(shí)例構(gòu)造器是不是靜態(tài)方法?
常見(jiàn)的錯(cuò)誤Cannot make a static reference to the non-static field 就是靜態(tài)方法中引用了非靜態(tài)的的變量,靜態(tài)變量是不依賴對(duì)象而存在的,非靜態(tài)變量是依賴對(duì)象而存在的

示例:非靜態(tài)方法可以訪問(wèn)靜態(tài)變量、方法,靜態(tài)方法是不可以訪問(wèn)非靜態(tài)變量,方法

package com.mousycoder.staticTest;

public class Test {
    
    private static String str1 = "111";
    
    private String str2 = "ffffd";
    
    
    public Test() {
    }
    
    public  void print1() {
        System.out.println(str1);
        System.out.println(str2);
        print1();
    }
    
    
    public static void print2(){
        System.out.println(str1);
        System.out.println(str2);  //報(bào)錯(cuò)  Cannot make a static reference to the non-static field
        print1(); //報(bào)錯(cuò)
    }

}
靜態(tài)代碼塊

由static 關(guān)鍵字修飾的代碼塊叫做靜態(tài)代碼塊,特點(diǎn):用于提高程序性能,類在初始化的時(shí)候,JVM會(huì)按照他們?cè)陬愔谐霈F(xiàn)的順序加載static 代碼塊,并且只會(huì)執(zhí)行一遍

示例:只生成一個(gè)String s 對(duì)象和一個(gè)String m 對(duì)象

package com.mousycoder.staticTest;

import java.util.Date;
public class HelloStatic {
    
    public static String s ;
    
    public static String m ;
    
    static {
        s = new String("hell");
        m = new String("0");
    }
        String hello() {
            String s = "hell";
            String m = "o";
            return s + m;
        }
        
        public static void main(String[] args) {
            Date start = new Date();
            for (int i = 0; i < 1000000000 ; i++) {
                HelloStatic h = new HelloStatic();
                h.hello();
            }
            Date end = new Date();
            System.out.println(end.getTime() - start.getTime());
        }

}

耗時(shí):12ms

示例: 生成N個(gè)String s和String m對(duì)象

package com.mousycoder.staticTest;

import java.util.Date;

public class Hello {
        
        String hello() {
            String s = new String("hell");
            String m = new String("o");
            return s + m;
        }
        
        public static void main(String[] args) {
            Date start = new Date();
            for (int i = 0; i < 1000000000; i++) {
                Hello h = new Hello();
                h.hello();
            }
        
            Date end = new Date();
            System.out.println(end.getTime() - start.getTime());
        }
        
}

所用時(shí)間 9645ms

公共的變量應(yīng)該放到static里初始化,有利于提高效率

靜態(tài)變量訪問(wèn)權(quán)

static 變量是被所有對(duì)象共享的,只要該對(duì)象有權(quán)限,就可以訪問(wèn)該變量

package com.mousycoder.staticTest;

public class Main {

    static int value = 33;
 
    public static void main(String[] args) throws Exception{
        new Main().printValue();
    }
 
    private void printValue(){
        int value = 3;
        System.out.println(this.value);
    }
}

該輸出為:33 ,new Main()創(chuàng)建了一個(gè)對(duì)象,通過(guò)this.value是訪問(wèn)的該對(duì)象的value 而int value = 3 是局部變量,并不是和該對(duì)象相關(guān)聯(lián)的,因?yàn)閟tatic變量是共享的,所以該對(duì)象可以訪問(wèn)到value 值為 33 ,把this 去掉 則結(jié)果為 3

靜態(tài)變量相關(guān)面試題
package com.mousycoder.staticTest;

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");
    }
}

順序是:

test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor

執(zhí)行順序

test static =>new MyClass() => myclass static => new MyClass() => person static => Person person = new Person("Test") => person Test => Person person = new Person("Test") => test constructro => Person person = new Person("Myclass") => person MyClass => Person person = new Person("MyClass") => myclass contructor

說(shuō)明:

執(zhí)行main方法,實(shí)例化MyClass

發(fā)現(xiàn)MyClass 有父類Test,首先實(shí)例化Test

加載Test類,這個(gè)時(shí)候會(huì)執(zhí)行static方法,打印 test static ,

然后要實(shí)例化MyClass 類,加載MyClass類,執(zhí)行static方法,打印myclass static

在所有類按照順序都加載完畢后,開始一個(gè)一個(gè)實(shí)例化類,先實(shí)例化父對(duì)象 Test類

在實(shí)例化之前,要先初始化成員變量,這個(gè)時(shí)候會(huì)執(zhí)行Person p = new Person("Test"),這個(gè)時(shí)候發(fā)現(xiàn)Person類還沒(méi)有被加載過(guò),因此先加載Person類

執(zhí)行Person類的static方法,打印person static 接著實(shí)例化Person p = new Person("Test") 調(diào)用Person的構(gòu)造方法,打印person Test

然后開始調(diào)用Test的構(gòu)造方法,打印test constructor,Test類初始化完畢

開始實(shí)例化Myclass類,首先還是初始化MyClass的成員變量 ,因?yàn)镻erson已經(jīng)加載過(guò)了,所以只執(zhí)行一遍,只需根據(jù)類的模板執(zhí)行其構(gòu)造方法,來(lái)復(fù)制成另外一個(gè)副本,此時(shí)打印person MyClass

最后執(zhí)行Myclass的構(gòu)造方法,打印myclass constructor

總結(jié):

非靜態(tài)代碼塊=>初始化成員變量=>非靜態(tài)代碼塊=>構(gòu)造器方法

感謝您的耐心閱讀,如果您發(fā)現(xiàn)文章中有一些沒(méi)表述清楚的,或者是不對(duì)的地方,請(qǐng)給我留言,你的鼓勵(lì)是作者寫作最大的動(dòng)力,
如果您認(rèn)為本文質(zhì)量不錯(cuò),讀后覺(jué)得收獲很大,不妨小額贊助我一下,讓我更有動(dòng)力繼續(xù)寫出高質(zhì)量的文章。

支付寶

微信

作 者 : @mousycoder

原文出處 : http://mousycoder.com/2015/10/12/thinking-of-interview-question-1/

創(chuàng)作時(shí)間:2015-7-1

更新時(shí)間:2015-10-14

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64566.html

相關(guān)文章

  • 一道面試引發(fā)思考 --- Event Loop

    摘要:想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出個(gè),可是你真的懂為什么嗎為什么是輸出為什么是輸出個(gè)這兩個(gè)問(wèn)題在我腦邊縈繞。同步任務(wù)都好理解,一個(gè)執(zhí)行完執(zhí)行下一個(gè)。本文只是我對(duì)這道面試題的一點(diǎn)思考,有誤的地方望批評(píng)指正。 想必面試題刷的多的同學(xué)對(duì)下面這道題目不陌生,能夠立即回答出輸出10個(gè)10,可是你真的懂為什么嗎?為什么是輸出10?為什么是輸出10個(gè)10?這兩個(gè)問(wèn)題在我腦...

    betacat 評(píng)論0 收藏0
  • 一道前端面試引發(fā)思考

    摘要:直接開始題目是厲害了說(shuō)句實(shí)話開發(fā)中誰(shuí)寫成這樣保證會(huì)被打死。不過(guò)面試就是面試,有面試官的考量點(diǎn)。官方是這么說(shuō)的。結(jié)果完美,不過(guò)小姐姐的意思是數(shù)組的方法會(huì)自動(dòng)觸發(fā)數(shù)組的。 直接開始題目是 if(a==1 && a==2 && a==3){ alert(厲害了) } 說(shuō)句實(shí)話開發(fā)中誰(shuí)寫成這樣保證會(huì)被打死。 不過(guò)面試就是面試,有面試官的考量點(diǎn)。 我理解的點(diǎn)有兩個(gè) 1、隱式類型轉(zhuǎn)換 先說(shuō)...

    gaomysion 評(píng)論0 收藏0
  • 一道簡(jiǎn)單面試引發(fā)思考

    摘要:另一個(gè)問(wèn)題,就是我下面要提及的作用域問(wèn)題,我當(dāng)時(shí)思考的時(shí)間太久了這是回憶中的面試題實(shí)際略有差異,不糾結(jié)了說(shuō)一下腳本的運(yùn)行結(jié)果引用錯(cuò)誤中給出的錯(cuò)誤提示。 版權(quán)聲明:此文首發(fā)于我的簡(jiǎn)書賬號(hào)人生還有多少個(gè)二十年,轉(zhuǎn)載請(qǐng)注明出處。 此處有幾百字嘮叨:   當(dāng)天,我早早起床,跨越上百公里,高德導(dǎo)航,路人指點(diǎn),跌跌撞撞到達(dá)招聘會(huì)現(xiàn)場(chǎng),當(dāng)時(shí)已是中午十二點(diǎn)半,吃了午餐(半瓶白開水),開始準(zhǔn)備投遞...

    wpw 評(píng)論0 收藏0
  • 一道面試引發(fā)思考 --- 理解 new 運(yùn)算符

    摘要:首先,我先去上搜索了的定義運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象的實(shí)例。 今天看到一道面試題,如下,問(wèn): 實(shí)例化 Person 過(guò)程中,Person返回什么(或者 p 等于什么)? function Person(name) { this.name = name return name; } let p = new Person(Tom); 說(shuō)實(shí)...

    shengguo 評(píng)論0 收藏0
  • 一道面試引發(fā)思考:(2)

    摘要:由虛擬機(jī)生成并拋出,,屬于系統(tǒng)內(nèi)部錯(cuò)誤或者資源耗盡等嚴(yán)重情況,屬于需要擔(dān)負(fù)的責(zé)任,這一類異常事件是無(wú)法恢復(fù)或者不可能捕獲的,將導(dǎo)致應(yīng)用程序中斷,但是自定義是可以捕獲的。 題目 showImg(http://img-storage.qiniudn.com/15-9-22/50608386.jpg); 答案:D 分析 Java 異常的結(jié)構(gòu)體系 showImg(http://img-stor...

    stefan 評(píng)論0 收藏0
  • 一道面試引發(fā)思考

    摘要:下面我們來(lái)使用面向?qū)ο箢悎D這里就不再畫了首先面試題中所提到的我們都可以看成類,比如停車場(chǎng)是一個(gè)類吧,它里面的車位是一個(gè)類吧,攝像頭,屏幕。。。 以下是某場(chǎng)的一道面試題(大概): 1、一個(gè)停車場(chǎng),車輛入場(chǎng)時(shí),攝像頭記錄下車輛信息2、屏幕上顯示所接收的車輛的信息情況(車牌號(hào))以及各層車位的車位余量3、停車場(chǎng)一共四層車位,其中的三層都為普通車位,還有一層為特殊車位(體現(xiàn)在停車計(jì)費(fèi)價(jià)格上面的不...

    Apollo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

tommego

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<