03-類與對象——課后動手動腦

1.早期我們經常這樣定義變量

? ? ? ? ? ? ?int value=100;

? ? ?前面的示例中這樣定義變量

? ? ? ? ? ? ?MyClass obj = new MyClass();

這兩種方式定義的變量是一樣的嗎?

?

這兩種方式定義的變量是一樣的,因為它們都是類的實例化,只是第一種是一個簡便的寫法,第二種是正常的對類進行實例化。

?

2.對象變量也可以使用“==”判斷兩變量值是否相等嗎?

當“==”施加于引用類型變量時,是比較這兩個變量是否引用同一對象,換句話說,“==”實際上相當于比較兩個引用類型變量中保存的對象地址是否相同。

在Java中要比對兩個對象的字段值,可以重寫基類的equals()方法。將其改成自己類的一個方法用來調用。

?

3.請輸入并運行以下代碼,得到什么結果?

public class Test {public static void main(String[] args) {Foo obj1=new Foo();Foo obj2=new Foo();System.out.println(obj1==obj2);}}
class Foo{int value=100;
}

運行結果:

原因:按照第2條,我們可知,“==”實際上相當于比較兩個引用類型變量中保存的對象地址是否相同。obj1和obj2雖然都是Foo類型的變量,但其指向的空間或者地址不同,所以輸出的是false。

?

4.

請總結一下,這個方法有哪些“與眾不同之處”,你能列出幾條?

?1.方法名與類名完全相同。

2.無返回值,也沒有void關鍵字。

?

5.以下代碼為何無法通過編譯?哪兒出錯了?

?

原因:在類中如果提供了一個構造函數,那么在進行類的實例化時,調用的就是這個構造函數。此例中,Foo類本身提供了一個有參構造函數,這就導致系統不會提供默認的構造函數,那么定義obj1時就無法調用無參構造函數,所以整個程序當中會出現錯誤。

?

?6.如果一個類中既有初始化塊,又有構造方法,同時還設定了字段的初始值,誰說了算?

例:

 1 public class InitializeBlockClass {
 2 
 3     {
 4         
 5         field = 200;
 6         
 7     }
 8     
 9     public int field = 100;
10     
11     public InitializeBlockClass(int value){
12         
13         this.field = value;
14         
15     }
16     
17     public InitializeBlockClass(){
18         
19     }
20     
21     public static void main(String[] args) {
22         // TODO Auto-generated method stub
23         InitializeBlockClass obj = new InitializeBlockClass();
24         
25         System.out.println(obj.field);
26         
27         
28         obj = new InitializeBlockClass(300);
29         
30         System.out.println(obj.field);
31         
32     }
33 
34 }

運行結果:

Java字段初始化的規律:

如果有多個不同地方對字段進行初始化,那么該字段的最終取值取決于最后一次初始化。

?

7.請運行TestStaticInitializeBlock.java示例,觀察輸出結果,總結出“靜態初始化塊的執行順序”。

TestStaticInitializeBlock.java

 1 class Root
 2 {
 3     static{
 4         System.out.println("Root的靜態初始化塊");
 5     }
 6     {
 7         System.out.println("Root的普通初始化塊");
 8     }
 9     public Root()
10     {
11         System.out.println("Root的無參數的構造器");
12     }
13 }
14 class Mid extends Root
15 {
16     static{
17         System.out.println("Mid的靜態初始化塊");
18     }
19     {
20         System.out.println("Mid的普通初始化塊");
21     }
22     public Mid()
23     {
24         System.out.println("Mid的無參數的構造器");
25     }
26     public Mid(String msg)
27     {
28         //通過this調用同一類中重載的構造器
29         this();
30         System.out.println("Mid的帶參數構造器,其參數值:" + msg);
31     }
32 }
33 class Leaf extends Mid
34 {
35     static{
36         System.out.println("Leaf的靜態初始化塊");
37     }
38     {
39         System.out.println("Leaf的普通初始化塊");
40     }    
41     public Leaf()
42     {
43         //通過super調用父類中有一個字符串參數的構造器
44         super("Java初始化順序演示");
45         System.out.println("執行Leaf的構造器");
46     }
47 
48 }
49 
50 public class TestStaticInitializeBlock
51 {
52     public static void main(String[] args) 
53     {
54         new Leaf();
55         
56 
57     }
58 }

執行結果:

“靜態初始化塊的執行順序”:

1.靜態初始化塊只執行一次。

2.創建子類型的對象時,也會導致父類型的靜態初始化塊的執行。

?

8.靜態方法中只允許訪問靜態數據,那么,如何在靜態方法中訪問類的實例成員(即沒有附加static關鍵字的字段或方法)?

在靜態方法中使用new進行實例化,然后再調用非靜態成員。

例:

 1 public class Task {
 2     
 3     public int a = 2;
 4     
 5     static int b = 3;
 6     
 7     static void display()
 8     
 9     {
10         
11         Task t1 = new Task();
12         
13         System.out.println("a="+t1.a);
14         
15     }
16     public static void main(String[] args) {
17         // TODO Auto-generated method stub
18         Task t2 = new Task();
19         
20         t2.display();
21         
22     }
23 
24 }

執行結果:

?

9.請看以下的神奇代碼:

public class StrangeIntegerBehavior { 
public static void main(String[] args){Integer i1=100;Integer j1=100;System.out.println(i1==j1);Integer i2=129;Integer j2=129;System.out.println(i2==j2);}}

執行結果:

兩對整數明明完全一樣,為何一個輸出true,一個輸出false?

?首先,利用javap對該程序進行反匯編。結果如圖:

可以看到其調用了Integer中的valueOf方法,valueOf方法的源代碼為:

可以看到,valueOf(int i)調用了IntegerCache.cache,通過網上查找,我得到了它的源代碼如下:

 1 private static class IntegerCache {
 2         static final int low = -128;
 3         static final int high;
 4         static final Integer cache[];
 5 
 6         static {
 7             // high value may be configured by property
 8             int h = 127;
 9             String integerCacheHighPropValue =
10                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
11             if (integerCacheHighPropValue != null) {
12                 try {
13                     int i = parseInt(integerCacheHighPropValue);
14                     i = Math.max(i, 127);
15                     // Maximum array size is Integer.MAX_VALUE
16                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
17                 } catch( NumberFormatException nfe) {
18                     // If the property cannot be parsed into an int, ignore it.
19                 }
20             }
21             high = h;
22 
23             cache = new Integer[(high - low) + 1];
24             int j = low;
25             for(int k = 0; k < cache.length; k++)
26                 cache[k] = new Integer(j++);
27 
28             // range [-128, 127] must be interned (JLS7 5.1.7)
29             assert IntegerCache.high >= 127;
30         }
31 
32         private IntegerCache() {}
33     }

通過這兩段代碼,我們可知,在[-128,127]這個區間中“”==”比較的是這兩個數的數值,但當超出這個范圍時,其就會創建一個新的對象,對于對象來說,我們是無法通過“==”進行比較的,因為“==”比較的是這兩個對象所指向的空間是否相同,所以第二個會輸出false。

轉載于:https://www.cnblogs.com/guo-xu/p/7688886.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253100.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IPython 使用記錄

記錄使用的一些技巧處理 1 自動重載修改的文件 局部的會話中使用 如果想在當前 ipython 會話中使用&#xff0c;則運行 ipython 后&#xff0c;依次鍵入下面語句即可 %load_ext autoreload %autoreload 2 全局使用如果想為了懶省事&#xff0c;我希望 IPython 一直會自動重載&a…

有道智能學習燈 初體驗

有道詞典筆在業內樹立了一個標桿&#xff0c;自認為有道出品必須精品&#xff01; 但是今天剛初步體驗了一下有道智能學習燈&#xff0c;硬件方面說實話有點意外&#xff0c;猜測這應該不是有道詞典 筆團隊打造的硬件產品吧。 現在將個人體驗感受表格化陳述如下&#xff1a;…

視頻處理器

http://baike.baidu.com/link?url9Ql-myLXWgFtt8ItgnYe1suvbqU57tivB8WwTVHqNqGWKNQqgvkQ7uqYrw22I44LO-LCmjQuKAk-SGGWV8di4_

centos忘記root用戶的密碼

方法&#xff1a; 1.在開機啟動的時候快速按鍵盤上的“E”鍵 或者“ESC”鍵&#xff08;如果做不到精準快速可以在啟動前一直按著或者不停的按&#xff09;&#xff0c;會進入如下界面。如果你的有多個操作系統就會出現多個內核&#xff0c;就會出現多個選項 2. 選擇你忘記密碼…

MySql(18)——Linux MySQL主從配置

MySQL 主從配置 Author:xushuyi 參照技術&#xff1a;http://www.cnblogs.com/kevingrace/p/6256603.html 1. 主從數據庫 1、主庫&#xff1a;192.168.56.100 2、從庫&#xff1a;192.168.56.102 3、創建主從數據庫一定要保證主從數據庫字符集編碼的一致性&#xff0c;否則主從…

linux之PHY

一.結構體 1.PHY設備 [cpp]view plaincopy struct phy_device { struct phy_driver *drv; //PHY設備驅動 struct mii_bus *bus; //對應的MII總線 struct device dev; //設備文件 u32 phy_id; //PHY ID enum phy_state state; //PHY狀態 …

元器件 失效分析 過程介紹

硬件產品在使用過程中&#xff0c;常常會出現功能失效的情況。排除裝配異常的話&#xff0c;功能失效一般是電路可能出現故障&#xff0c;具體可能是某個元器件損壞了。需要研發及時分析定位故障原因及時改善排除故障&#xff0c;尤其是在試產階段&#xff0c;顯得十分重要&…

OWI

2019獨角獸企業重金招聘Python工程師標準>>> V$EVENT_NAME V$EVENT_NAME displays information about wait events. ColumnDatatypeDescriptionEVENT#NUMBERNumber of the wait eventEVENT_IDNUMBERIdentifier of the wait eventNAMEVARCHAR2(64)Name of the wait e…

201521123110《Java程序設計》第5周學習總結

1. 本周學習總結 1.1 嘗試使用思維導圖總結有關多態與接口的知識點。 2. 書面作業 1.代碼閱讀&#xff1a;Child壓縮包內源代碼 1.1 com.parent包中Child.java文件能否編譯通過?哪句會出現錯誤&#xff1f;試改正該錯誤。并分析輸出結果。不能編譯通過,因為System.out.println…

Python中正則表達式講解

正則表達式是匹配字符串的強大武器&#xff0c;它的核心思想是給字符串定義規則&#xff0c;凡是符合規則的字符串就是匹配了&#xff0c;否則就是不合法的。在介紹Python的用法之前&#xff0c;我們先講解一下正則表達式的規則&#xff0c;然后再介紹在Python中如何運用。 如果…

電源適配器上各符號的意義都清楚嗎?

現在家里的電子產品是越來越多了&#xff0c;比如&#xff1a;手機、平板、筆記本、智能電視、智能音箱、路由器、剃須刀等&#xff1b;機身或者充電器上都有很多符號標志。 有沒有好奇過或者被小孩詢問過&#xff0c;這些符號標志都是什么意思呢&#xff1f;只有讀懂這些符號…

蘇寧海量服務器自動化配置運維實踐

運維的演進 人力運維階段 在IT產業的早期&#xff0c;服務器運維是通過各種Ad Hoc命令或者Shell腳本來完成基礎設施的自動化工作&#xff0c;這種方式對于簡單&#xff0c;一次性的工作很方便&#xff0c;但是對于復雜和長期的項目&#xff0c;后期的腳本維護非常麻煩。自動化工…

JS小技巧

JS操作偽元素 CSS代碼&#xff1a; #myId:before {content: "hello world!";display: block;width: 100px;height: 100px;background: red; } JS 代碼&#xff1a; var myIdElement document.getElementById("myId"); var beforeStyle window.getCompute…

流媒體服務器

1 引言   隨著互聯網的飛速發展,流媒體技術的應用越來越廣泛,從網上廣播、電影播放到遠程教學以及在線的新聞網站等都用到了流媒體技術。但現有公開文獻所報道 的大多是利用現有的流媒體服務器來搭建一個流媒體服務系統&#xff0c;或者是針對流媒體數據的編碼方式所進行的…

試產機器發現元器件損毀 風險排查過程

產品在試產階段或者公測階段&#xff0c;發現有個別機器功能異常&#xff0c;研發定位為個別元器件損壞&#xff1b; 定位過程大致有如下步驟&#xff1a; A-故障現象復現 B-輸入輸出檢查 C-電源及管腳狀態測量 D-交叉驗證 E-基本外觀觀察和特性測量 然后將器件郵寄給原…

騰訊面試經驗2

時間&#xff1a;2017年10月16日11:30面試。 地點&#xff1a;重慶萬達艾美酒店。 信息&#xff1a;女&#xff0c;本科應屆生&#xff0c;面試后臺開發崗位。 在深圳的面試已經全部結束了&#xff0c;偶然間聽朋友說重慶、長沙等場地的面試還在進行中&#xff0c;只要修改面試…

簡易有效Api接口防攻擊策略

API&#xff08;Application Programming Interface&#xff0c;應用程序編程接口&#xff09;是一些預先定義的函數&#xff0c;目的是提供應用程序與開發人員基于某軟件或硬件得以訪問一組例程的能力&#xff0c;而又無需訪問源碼&#xff0c;或理解內部工作機制的細節。 簡單…

CSS 如何設置垂直居中

1、水平居中我們都知道&#xff0c;可以直接用&#xff1a; margin:0 auto; 2、垂直居中&#xff0c;需要做一點小小的計算&#xff0c;關鍵代碼如下&#xff1a; height: 600px; position: absolute; top: 50%; margin-top:-300px; 如需水平且垂直居中&#xff1a; height: 60…

被稱為海淀媽媽四大神器之一的傾聽者K3 硬件拆解

暑假期間發現很多博主都在推薦傾聽者K3&#xff0c;被海淀媽媽們稱為四大神器之一&#xff0c; 雖然暫沒聽說其他三大神器是什么&#xff0c;作為教育硬件愛好者還是決定先整個回來拆拆看。 在京東上搜到傾聽者K3版本一共有三種顏色&#xff0c;分別是藍色&#xff08;悟空藍&…

有名信號量sem_open和內存信號量sem_init創建信號量的區別

有名信號量sem_open和內存信號量sem_init創建信號量的區別 分類&#xff1a; C/C sem_t *sem sem_open(const char *name, int oflag, .../*mode_t mode,unsinged int value) ;int sem_init(sem_t *sem,int shared, unsigned int value);區別&#xff1a;1.創建有名信號量必須…