天天看點

面向對象先修:Java入門

學習總結

在C語言和資料結構的基礎上,在上暑期的面向對象Java先修課程時,熟悉語言的速度明顯加快了很多。Java和C在很多基礎文法上非常相似,比如基本的資料類型,循環以及條件分支語句,數組的周遊等。但是兩者在思想上是截然不同的,C是面向過程性的:一般操作步驟将問題分解為連續的小問題,然後使用函數逐漸實作,資料在函數之間想換傳遞,壞處是資料很多時候是公有的,很多函數都有改變某個資料的能力,當一旦出現關于資料的bug的時候,難以确定是哪一個部分導緻資料出錯,而面向對象的Java語言的封裝性則能夠應對這種問題,在Java中,資料一般是類的私有類型,一般聲明方式;

private 資料類型 變量名稱
    //example
    private double scale;
           

而如果要通路一個類的資料時,常常是依靠類中的方法

public double getScale()
    {
        return this.scale;
        //this引用類中成員變量scale;
    }
           

要修改成員變量時則建立一個新的方法。

在利用C語言基礎入門以後,開始了解Java語言中新的特性(繼承、對象、類、接口)。個人認為類的概念是廣義的集合,包含一些資料類型的變量以及方法,數學中集合的概念是相同性質的元素在一起的團體,是以可以将類看成具有相同成員變量和方法的對象的集合,由此引出了面向對象程式設計的概念。“類”是整體的抽象,而個體是執行個體,兩者關系如同“人類”和某個具體的人。Java中使用“.”調用對象的方法。Java語言提供了豐富的庫,在使用時可以依據API(應用程式接口)查詢類中的方法,比如在官方關于String的總結中對于各種方法的作用以及傳回值描述非常清楚。在很多過程中直接調用已經寫好的方法而不用自己重寫,如ArrayList類中的sort方法就是優化後的快速排序。

在類中一般會有構造器(constructor),構造器和類同名,構造器沒有傳回值(不同于一般的方法),在使用new調用構造器時會将執行個體域中初始化(需要傳入參數)

第一次作業主要涉及的是使用類和對象,初步使用繼承,熟悉了測試資料的使用

public class NewCharSet extends CharSet{
	private int times=0;
	public NewCharSet(char[] charSet){
		super(charSet);
		times++;
	}
	public int getServiceTimes()
	{
		this.times++;
		return times;
	}
}
           

繼承是Java的三大特性之一,在編寫相同性質的代碼時使用繼承能夠避免重複代碼(重複代碼維護性不高,在修改的時候需要修改很多代碼,容易出錯)。在繼承中子類能夠擁有父類非private的代碼,并且能有自己的屬性和方法(概念類似于生物學中的繼承)。

在第二次課堂上學習了Java的接口(Interface),涉及關鍵詞interface以及implements,接口就是整合不同類型相同功能方法的工具。

public interface Geometry {
	public double getVolume();
	public String toString();
}
           

實作接口類的聲明:

public class Box implements Geometry{...}
           

在第二次作業中将字元串集合和字元集合中相同的方法構造到了一個接口中,實際實踐中發現類的種類少并且概念差别大時使用接口不一定能簡化程式。

在接口使用中注意Interface中方法形式參數的類型

//接口基本功能
	public void myToString(Object s);//列印字元/字元串集合
	public void mySort();//對于字元/字元串進行排序
	public boolean myFind(Object alpha);//判斷一個字元/字元串是否在字元集合/字元串集合中
	public int subSet(Object set);//判斷一個字元集合/字元串集合是否是另外一個幾何的子集
           

如果形參類型不同,則使用類Object(所有類的超類)

第三次以及第四次作業則涉及到檔案操作、正規表達式的使用、HashMap以及hashcode以及Map映射。

文本讀取兩種方法:

  • 使用scanner讀取文本中的内容
//導入對應的包
import java.util.Scanner;
import java.io.File;
//以檔案路徑為參數建立File類對象,在以此為參數建立Scanner的in對象
//Scanner是Java中讀取鍵盤輸入和檔案的流的一個類
Scanner in = new Scanner(new File("in.txt"));
while(true)
{
    //...
    //hasNextLine方法判斷檔案是否讀到末尾,是則傳回false
    if(in.hasNextLine==false)
        break;
}
           
  • 使用BufferedReader
//import java.io.BufferedReader;
    BufferedReader br = new BufferedReader(new File("in.txt"));
    //br.readLine()方法讀取檔案的中的一行
           

在進行單詞分割的時候使用正規表達式

//将數字和字母分割出來:特别注意分割産生的空字元串
    String [] wordArrTemp = readline.split("[^0-9A-Za-z]+");
           

将單詞和頻數分别存儲到兩個數組中是C語言中比較容易實作的算法,但是Java中有一個構造好的Map映射類<Key,Value>,在排序的時候可以根據Key或是Value進行排序

Map常用的方法:

//map.get(Key) = value,取對應Key的Value值,如果不存在則傳回null
    //map.put(Key,Value),将對應的Key和Value值存入映射中
           

在對于映射進行周遊的時候可以使用疊代:

Iterator

1.Iterator(疊代器)可以簡單了解為周遊

2.Iterator 是java中的接口,有三種方法:hasNext()疊代器中是否有下一個元素,next()傳回疊代器中的下一個元素,remove()

Iterator iterator  = list.iterator();
    //iterator是一個對象,list中的iterator是關于list的一個方法
    while(iterator.hasNext())
    {
        //list中存儲的是字元串
        String string  = iterator.next();
        //do something
    }
           

第四次作業:最開始我使用的是String[]類來存儲二進制短語,但是在使用hashmap的時候發現對于兩個數組,即使數組中存儲的内容完全一樣,但是還是作為兩個不同的對象,是以不能判斷内容相同的數組是相同的Key。之後重寫了String數組類,重寫了hashCode和equals方法,了解了Override的使用。

其他細節

入門過程中相關的資料

  1. 程式設計問答網站:StackOverFlow、CSDN
  2. 搜尋引擎:Google
  3. 書籍:《Java核心程式設計卷一》

課程内容

面向對象三門課程介紹,java簡介,Java基礎文法,類和對象,Java特性:繼承和封裝,使用接口,Java程式設計效率(方法調用和類的使用),簡單debug,計算程式運作時間,Map映射等。

教學評價

  1. 面向對象先修課程再課堂上教學的内容比較少,主要知識點是從課堂例題和課後自學得來。而網絡上和各種Java學習書籍資源非常豐富,往往在短時間内無從下手,如果老師或是助教在已經學完了面向對象的基礎上能夠推薦一些優秀的入門書籍或是網絡上的資源則對于入門新手可能會有幫助。另外在學習的過程中發現stackOverFlow是一個非常好的程式設計解疑網站。
  2. 在進行課後練習的時候,助教釋出的GuideBook在某些細節上經常存在二義性,而二義性在程式設計中是應該盡量避免的,是以導緻很多同學剛寫完程式,新釋出的文檔思路又發生了改變,又需要修改或是重寫。個人認為不應該在了解文檔這個方面提高課程難度,課後直接釋出最終版更好。