20172327 2017-2018-2 《程序設計與數據結構》第七週學習總結

學號 2017-2018-2 《程序設計與數據結構》第七週學習總結

教材學習內容總結

- 建立子類:


1.編寫類是定義一組相似的對象;類創建了對象的特徵和行爲,但並無爲聲明的變量預留內存空間(除非所聲明的變量是靜態的);類是一種設計,而對象是該設計的具體實現。

2.繼承就是從現有類派生出新類的過程,目的是複用現有軟件,在「子類」和「父類」之間創建一種「是」關係。

3.子類的實例化並不依賴於父類的實例化。繼承具備單項性,父類不能引用子類內部聲明的變量和方法。

4.父類的公共方法或變量能夠在子類經過名稱訪問,或者經過子類對象訪問;而父親的私有方法或變量不能在子類中訪問,或經過子類對象訪問。

5.當一個變量或方法聲明爲protected可見性時,子類就能夠引用它,而且使父類保持了必定的封裝性。

6.可見性:protected > public
封裝性:protected < private

7.構造方法不能被繼承!

8.super引用的用處之一是調用父類方法。通常狀況下,構造方法的第一行應該用super引用調用父類構造方法。若是不存在這樣的調用,則Java會自動在構造方法的開始處產生一行super()調用。這種作法能夠確保在子類構造方法執行以前,父類構造方法會先初始化本身的變量。用super引用調用父類構造方法的操做只能在子類中執行,而且必須是第一行執行。html


9.Java的繼承方法稱爲單繼承,即子類只能有惟一的父類。一些面嚮對象語言容許子類有多個父類,這種方法稱爲多繼承,對於須要兩種類描述的對象時是有用的。在Java中依賴接口提供多繼承的最好特性而不會增長歧義性。java

- 重寫方法:


1.當子類和父類有相同的方法和簽名時,子類方法將重寫父類方法,子類方法優先。重寫的需求經常發生繼承的狀況中。

2.可用final修飾符定義一個方法,子類將不能重寫final方法。

3.子類能夠定義與父類同名的變量,應該注意從新聲明一個變量和給一個繼承變量賦值的區別。若是在一個子類中聲明一個同名變量,則該變量稱爲影子變量
git

- 類層次結構:

1.從一個父類派生出的子類,還能夠是它本身子類的父類,而且多個子類能夠從一個父類派生。所以,繼承關係常發展成爲一個類層次結構。

2.同一個父類的兩個子類,成爲同胞。儘管同胞類共享它們共同的父類傳下來的特徵,可是兩者沒有繼承關係,由於不會用其中一個類派生另外一個類。

3.應當合理地將類的公共特徵保持在儘量高的類層級上。

4.在Java中,全部的類歸根到底都是由Object類派生。若是一個類的定義中沒有用extends子句顯式地從另外一個類中派生本身,則將做爲默認處理,自動從Object類派生。

5.Object類定義在Java標準類庫的java.lang包中。

6.抽象類一般含有一個或多個還沒有定義(沒有實現代碼)的抽象方法,不能被實例化。包含一個或多個抽象方法的類必須被聲明爲抽象的。抽象類在類層次結構中充當佔位符。

7.由抽象類派生出來的子類必須重寫全部父類的抽象方法,不然該子類仍然是抽象類。

8.繼承的概念能夠應用到接口,以便由一個接口派生另外一個接口。類的繼承與接口的繼承不能重疊,即接口不能用於派生新類,類不能用於派生接口。僅當一個類設計爲實現一個接口時,這個實現類和接口之間纔有交互。。
- 可見性:

1.父類的私有成員也被子類繼承,雖不能以成員名直接地訪問這些私有成員,但能夠間接地訪問。
- 類間繼承關係地設計:

1.軟件設計中必須特別精心地研究和設計類間繼承關係地參差結構。

2.final方法經常使用於保證該方法能在全部的子類中獲得使用。final修飾符也能夠做用於整個類。final類不能再用於派生新類。

教材學習中的問題和解決過程

  • 問題1:權限修飾符有哪些,分別有什麼做用?
  • 問題1解決方案:


1: 什麼是權限修飾符,他有什麼做用,爲何須要他;

一個Java應用有不少類,可是有些類,並不但願被其餘類使用。每一個類中都有數據成員和方法成員,可是並非每一個數據和方法,都容許在其餘類中調用。如何能作到訪問控制呢?就須要使用訪問權限修飾符。
數組

1.權限修飾符就是用於控制被修飾變量、方法、類的可見範圍.也就是其做用範圍;


2:java中權限修飾符包括4種:
安全

1.公共類型 public ;
2.public能夠修飾類,成員變量,構造方法,方法成員。
3.被public修飾的成員,能夠在任何一個類中被調用,無論同包或不一樣包,
4.是權限最大的一個修飾符

1.私有類型 private;
2.能夠修飾成員變量,構造方法,成員方法,不能修飾類(此處指外部類,不考慮內部類)。
3.被private修飾的成員,只能在定義它們的類中使用,在其餘類中不能調用。
1.默認類型 default;
2.可用於修飾類,成員變量,構造方法,方法,都可以使用默認權限,即不寫任何關鍵字。
3.默認權限即同包權限,同包權限的元素只能在定義它們的類中,以及同包的類中被調用。
1.保護類型 protect;
2.能夠修飾數據成員,構造方法,方法成員,不能修飾類(此處指外部類,不考慮內部類)。
3.被protected修飾的成員,能在定義它們的類中,同包的類中被調用。
4.若是有不一樣包的類想調用它們,那麼這個類必須是定義它們的類的子類。


3: 關於權限修飾符還要注意幾個問題;
數據結構

1.並非每一個修飾符均可以修飾類(指外部類),只有public和default能夠。

2.全部修飾符均可以修飾數據成員,方法成員,構造方法。

3.爲了代碼安全起見,修飾符不要儘可能使用權限大的,而是適用便可。好比,數據成員,若是沒有特殊須要,儘量用private。增強封裝性;

4.修飾符修飾的是「被訪問」的權限。

  • 問題2:this和super引用有啥不一樣:
  • 問題2解決方案:
this

this是自身的一個對象,表明對象自己,能夠理解爲:指向對象自己的一個指針。 this的用法在java中大致能夠分爲3種:
1.普通的直接引用
這種就不用講了,this至關因而指向當前對象自己。
2.形參與成員名字重名,用this來區分.
3.引用構造函數this(參數):
調用本類中另外一種形式的構造函數(應該爲構造函數中的第一條語句)。
super

super能夠理解爲是指向本身超(父)類對象的一個指針,而這個超類指的是離本身最近的一個父類。 super也有三種用法:
1.普通的直接引用
與this相似,super至關因而指向當前對象的父類,這樣就能夠用super.xxx來引用父類的成員。
2.子類中的成員變量或方法與父類中的成員變量或方法同名
3.引用構造函數
super(參數):調用父類中的某一個構造函數(應該爲構造函數中的第一條語句)。
super和this的異同:

super(參數):調用基類中的某一個構造函數(應該爲構造函數中的第一條語句)
this(參數):調用本類中另外一種造成的構造函數(應該爲構造函數中的第一條語句)
super: 它引用當前對象的直接父類中的成員(用來訪問直接父類中被隱藏的父類中成員數據或函數,基類與派生類中有相同成員定義時如:super.變量名 super.成員函數據名(實參)
this:它表明當前對象名(在程序中易產生二義性之處,應使用this來指明當前對象;若是函數的形參與類中的成員數據同名,這時需用this來指明成員變量名)
調用super()必須寫在子類構造方法的第一行,不然編譯不經過。每一個子類構造方法的第一條語句,都是隱含地調用super(),若是父類沒有這種形式的構造函數,那麼在編譯的時候就會報錯。
super()和this()相似,區別是,super()從子類中調用父類的構造方法,this()在同一類內調用其它方法。
super()和this()均需放在構造方法內第一行。
儘管能夠用this調用一個構造器,但卻不能調用兩個。
this和super不能同時出如今一個構造函數裏面,由於this必然會調用其它的構造函數,其它的構造函數必然也會有super語句的存在,因此在同一個構造函數裏面有相同的語句,就失去了語句的意義,編譯器也不會經過。
this()和super()都指的是對象,因此,均不能夠在static環境中使用。包括:static變量,static方法,static語句塊。
從本質上講,this是一個指向本對象的指針, 然而super是一個Java關鍵字。
  • 問題3:Java語言的設計者爲啥明確決定不支持多繼承?
  • 問題3解決方案:


James Gosling在1995年2月發表了一篇名爲」Java概覽」的Java白皮書,文章解釋了Java不支持多重繼承的緣由。
多線程

Java去除了一些C++中不多用、並且被常常誤解而錯用的功能,如操做符的重載(operator overloading)(儘管Java仍舊保留方法的重載),多重繼承(multiple inheritance),以及普遍的自動強迫同型(extensive automatic coercions)。

我想在這裏分享一下James Gosling對於Java的定義。
Java: 一種簡單的,面向對象的,分佈式的,解釋型的(譯者注:Java既不是純解釋型也不是純編譯型的語言),健壯的,安全的,架構中立的,可移植的,高性能的,支持多線程的,動態語言。


看看定義的美妙之處吧。現代程序語言應該有這樣的特性。咱們看到,定義第一個特性是什麼?是簡單。


爲了強化簡單這個特色,這就是咱們去除多重繼承的緣由。下面來看個例子,多重繼承的菱形繼承問題。架構


有兩個類B和C繼承自A。假設B和C都繼承了A的方法而且進行了覆蓋,編寫了本身的實現。假設D經過多重繼承繼承了B和C,那麼D應該繼承B和C的重載方法,那麼它應該繼承哪一個的呢?是B的仍是C的呢?分佈式


C++中常常會掉入這個陷阱,雖然它也提出了替代的方法來解決這個問題。咱們在Java中就不會出現這個問題。就算兩個接口擁有一樣的方法,實現的類只會有一個方法,這個方法由實現的類編寫。動態的加載類會讓多重繼承的實現變得困難。ide

代碼調試中的問題和解決過程

  • 問題1:在作pp9.1時,遇到到了下面這個問題

  • 問題1解決方案:這是我對Coin類徹底沒改形成的,在Coin類中,咱們應該將face的修飾符改成protected。
  • 問題2:在作pp9.1時,我在測試類中選擇建立一個大小爲5的數組,但我定義時,只定義了三個,因此最後運行時,沒法將sum值算出來。

  • 問題2解決方案:前面一個問題改一下順序就能夠,後面一個問題我又設了一個變量b,把計算過程分開才能夠。

上週考試錯題總結

  • 第一題:In Java, arrays are
    A .primitive data types
    B .objects
    C .interfaces
    D .primitive data types if the type stored in the array is a primitive data type and objects if the type stored in the array is an object
    E .Strings

  • 分析:在書的第245頁,有說在Java中,數組是必須實例化的對象。
  • 第二題:The "off-by-one" error associated with arrays arises because
    A .the first array index is 0 and programmers may start at index 1, or may use a loop that goes one index too far
    B .the last array index is at length + 1 and loops may only iterate to length, missing one
    C .the last array element ends at length - 1 and loops may go one too far
    D .programmers write a loop that goes from 0 to length - 1 whereas the array actually goes from 1 to length
    E .none of the above, the "off-by-one" error has nothing to do with arrays
  • 分析:索引值必須大於等於0而且小於數組的元素個數。若是數組中有X個元素,則索引值是0~X-1.

  • 第三題:If an int array is passed as a parameter to a method, which of the following would adequately define the parameter list for the method header?
    A .(int[ ])
    B .(int a[ ])
    C .(int[ ] a)
    D .(int a)
    E .(a[ ])
  • 分析:參數被定義爲變量最初被聲明爲類型參數名稱。這裏,類型爲int[],參數爲a。

  • 第四題:Assume that BankAccount is a predefined class and that the declaration BankAccount[ ] firstEmpireBank; has already been performed. Then the following instruction reserves memory space for
    firstEmpireBank = new BankAccount[1000];
    A .a reference variable to the memory that stores all 1000 BankAccount entries
    B .1000 reference variables, each of which point to a single BankAccount entry
    C .a single BankAccount entry
    D .1000 BankAccount entries
    E .1000 reference variables and 1000 BankAccount entries
  • 分析:第一次銀行賬戶;爲firstentity銀行保留內存空間,它自己是指向BankAccount[]對象的引用變量。第一次銀行帳戶=新銀行帳戶[1000];實例化BankAccount[]對象爲1000個BankAccount對象。

  • 第五題:Given the following declarations, which of the following variables are arrays?
    int[ ] a, b;
    int c, d[ ];
    A .a
    B .a and b
    C .a and d
    uD .a, b and d
    E .a, b, c and d
  • 分析:第一個聲明聲明a和b都是int數組。第二個聲明聲明c和d是ints,但對於d,一個int數組。a b和d都是int數組。

  • 第六題If a and b are both int arrays, then a = b; will
    A .create an alias
    B .copy all elements of b into a
    C .copy the 0th element of b into the 0th element of a
    D .return true if each corresponding element of b is equal to each corresponding element of a (that is, a[0] is equal to b[0], a[1] is equal to b[1] and so forth) and return false otherwise
    E .return true if a and b are aliases and return false otherwise
  • 分析:這樣使得兩個數組是相同的,因此a和b所引用的數組是同一個,因此一個稱爲另外一個的別名。

  • 第七題:A Java main method uses the parameter (String[ ] variable) so that a user can run the program and supply "command-line" parameters. Since the parameter is a String array, however, the user does not have to supply any parameters.
    A .true
    B .false
  • 分析:在java命令以後,在命令行輸入的任何內容都將被接受爲命令行參數。若是是由空格分隔的幾個單詞,那麼每一個單詞都做爲一個單獨的字符串數組元素存儲。

  • 第八題:An array index cannot be a float, double, boolean or String.
    A .true
    B .false
  • 分析:數組索引必須是int類型,或者能夠擴展爲int類型的值(所以,char、byte和short也是容許的)。

  • 第九題:An array, when instantiated, is fixed in size, but an ArrayList can dynamically change in size when new elements are added to it.
    A .true
    B .false
  • 分析:數組的一個缺點是它的固定大小。一旦實例化,它的大小是固定的。ArrayList是一個使用數組的類,它會自動建立一個更大的數組,將舊數組複製到新數組中,這樣ArrayList就能夠根據須要更大。雖然這能夠解決拋出異常的問題,但它確實會致使性能較差,由於每次增長ArrayList大小時,必須從一個數組複製到另外一個數組。

  • 第十題:Just as arrays can only have a fixed number of elements, set at the time the array is declared, a parameter list also can only have a fixed number of elements, set at the time the method is declared.
    A .true
    B .false
  • 分析:Java爲可變長度參數列表提供了特殊的表示法。省略號(…)用於指定可變長度參數列表。

  • 第十一題:So long as one is only accessing the elements of an ArrayList, its efficiency is about the same as that of an array. It's only when one begins to insert or remove elements towards the front portion of an ArrayList that its efficiency deteriorates.
    A .true
    B .false
  • 分析:對ArrayList的前部分進行插入或刪除時,就會發生大量的元素複製,從而下降其效率。

代碼託管


結對及互評

Because his blog is writed by english, so my comment is also write by english.

  • The learning or problem of blogging:
    1. The blog is very long, the variety is very complete, the language is refined, the English level is very high, so that I need a dictionary in some places.
    2. Hope later blog layout style can read better, try to focus on use different color, give you recommend a site:
    • Based on the scoring criteria, I gave this blog a score of 14.The score is as follows:
    1. Use Markdown grammar correctly (add 1 point) :
    2. Complete elements in the template (add 1 point)
    3. Problems and solutions in teaching materials, plus 4 points.
    4. Add 4 points to problems and solutions in code debugging.
    5. This week, the effective code is over 300 branches, plus 2 points.
    6. Additional points plus 2 points:
    7. Pure English blog, let your bother me look very confused, add 1 point.
    8. beautifully arranged with one point.
    9. add 1 point to the learning time and improvement in the progress bar.
  • Worthy learning or problem in code:
  1. Some of the ideas are different from me, and some of the questions I ask are not the ones I have encountered, which are very enlightening.

  • 博客中值得學習的或問題:
    仍是很全的,背景很好看

    • 基於評分標準,我給本博客打分:11。得分狀況以下:
    1. 正確使用Markdown語法(加1分):
    2. 教材學習中的問題和解決過程, 加4分
    3. 代碼調試中的問題和解決過程, 加4分
    4. 本週有效代碼超過300分行,加2分
  • 代碼中值得學習的或問題:
    問題解釋仍需全面

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20172317
    • [20172320]()
    • 結對學習內容
      • 討論問題
      • 互評博客
  • 上週博客互評狀況

其餘(感悟、思考等,可選)

概念不少,嘚仔細看,有不少細節,和前面的章節聯繫緊密。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 95/95 1/1 18/18
第二週 515/620 1/2 22/40
第三週 290/910 1/3 20/60
第四周 1741/2651 1/4 30/84
第五週 579/3230 1/5 20/104
第六週 599/3829 1/6 18/122
第七週 732/4561 1/6 24/146

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法

  • 計劃學習時間:22小時

  • 實際學習時間:24小時

  • 改進狀況:稍有點

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料

相關文章
相關標籤/搜索