陳安 農(nóng)麗娟
摘 要 Java程序設(shè)計本質(zhì)上屬于面向?qū)ο笳Z言的教學,是信息與計算科學專業(yè)的專業(yè)核心課程。不同于信科專業(yè)的其他數(shù)學類課程,Java程序設(shè)計本身具有很強的實踐,同時具有理論概念多、各種類名繁雜等特點。本文針對信科專業(yè)的Java程序設(shè)計課程教學進行分析,總結(jié)了教學過程中當前存在的問題,并通過Java程序設(shè)計中的經(jīng)典案例,探討其在教學中的作用,為課程的教學改革提供參考。
關(guān)鍵詞 經(jīng)典案例 Java程序設(shè)計 課程教學 信息與計算科學專業(yè)
中圖分類號:G424? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 文獻標識碼:A ? ?DOI:10.16400/j.cnki.kjdkx.2021.03.056
Discussion on the Teaching of Java Programming Based on Classic Cases
——Take Information and Computing Science as an example
CHEN An, NONG Lijuan
(College of Science, Guilin University of Technology, Guilin, Guangxi 541006)
Abstract Java programming essentially belongs to the teaching of object-oriented languages, and is a specialized core course for information and computing science. Different from other mathematics courses for Information and computing science, Java programming itself has strong practice, and at the same time has the characteristics of many theoretical concepts and various types of complex class names. This article analyzes the teaching of Java programming for information and computing science, summarizes the current problems in the teaching process, and discusses its role in teaching through classic cases in Java programming, so as to provide references for the teaching reform of this course.
Keywords classic case; Java programming; course teaching; information and computing science
0引言
面向?qū)ο蟪绦蛟O(shè)計是信息與計算科學專業(yè)培養(yǎng)方案中的一門專業(yè)核心課程,主要目標是提升學生在軟件開發(fā)領(lǐng)域的計算機使用能力,包括信息處理和軟件應(yīng)用,使之畢業(yè)后能夠在信息產(chǎn)業(yè)、科技創(chuàng)新等領(lǐng)域從事應(yīng)用開發(fā)工作。本文以Java程序設(shè)計為例,探討如何通過具體的案例強化學生的概念理解能力以及編程能力。
隨著5G時代的到來,社會對Java開發(fā)工程師的需求量越來越大。從企業(yè)招聘對職位的要求上看,眾多企業(yè)都需要畢業(yè)生熟悉軟件工程中一些基本的流程,并具有扎實的編程基礎(chǔ)。因此如何在課堂上有效地激發(fā)學生學習的興趣,提高學生對Java程序設(shè)計的學習能力,值得我們深入地探討。目前已有一些相關(guān)的教學研究,比如在文獻 [1] 中,作者結(jié)合課程的授課經(jīng)驗,設(shè)計了Java程序設(shè)計的教學內(nèi)容,并對實踐教學方法進行了探討。此外,文獻 [2] 以面向能力培養(yǎng)為目標,分析了如何利用在線開放課程平臺提高學生的實際編程能力。但是現(xiàn)有的教學研究并沒有說明如何解決Java程序設(shè)計課程中理論概念多的問題。
本文首先分析信息與計算科學專業(yè)在Java程序設(shè)計教學中當前存在的問題,然后嘗試通過一個原型案例,結(jié)合課程教學進度,逐漸將原型案例的代碼擴展,使之能夠形成代碼學習的連貫性,這樣有助于將繁雜的概念化簡,減輕學生學習的負擔,進而提高學生學習的興趣。
1Java程序設(shè)計教學存在的問題
結(jié)合這幾年Java程序設(shè)計課程教學經(jīng)驗,對存在的問題進行總結(jié),主要體現(xiàn)在下面兩方面。
1.1偏重于概念理論的講解
Java 程序設(shè)計是一門集技術(shù)性、理論性和實踐性于一體的課程,主要介紹Java語言的運行環(huán)境、Java基本語法和語句、面向?qū)ο蟪绦蛟O(shè)計、異常處理機制、集合和工具類、文件和流、多線程技術(shù)、Java網(wǎng)絡(luò)編程、使用JDBC連接數(shù)據(jù)庫。而其中的面向?qū)ο蟪绦蛟O(shè)計是課程教學的重中之重。這部分的內(nèi)容涉及基本的類定義、信息封裝、類的繼承、接口的實現(xiàn)以及多態(tài)等重要概念,這將對后續(xù)的類庫學習是至關(guān)重要的。但是一般而言,在這部分內(nèi)容的教學中,教師更多偏重概念性地講解,結(jié)合的代碼學習也沒有一致性,這往往使得編程水平差的學生一頭霧水,不知所蹤。
1.2教材的代碼過于復雜
在使用的Java教程都會提供代碼進行學習,如《Java程序設(shè)計及應(yīng)用開發(fā)》一書中從面向?qū)ο蠓治龀霭l(fā),結(jié)合UML類圖描述類結(jié)構(gòu)以及類之間的關(guān)系,并且提供了豐富的代碼。[3]但是有時候?qū)τ趧側(cè)腴T的學生,繁雜多樣的代碼使得學生更容易迷失。他們常常將課本的例子在計算機上抄一遍。如果代碼過于冗長,那么錄入代碼就占據(jù)上機課的大部分時間,并且他們從中也容易形成挫敗感。因此有必要精簡代碼,但簡化后的代碼又能表達出核心思想。
2 Java程序設(shè)計中經(jīng)典案例教學探討
如何解決解決Java程序設(shè)計課程中理論概念多,案例不連貫的問題呢?下面我們嘗試從一個原型出發(fā),結(jié)合教學進度,逐漸豐富這個簡單原型,從而“一以貫之”,將各個知識點貫穿起來,提高學生學習的信心。為介紹方便,我們這里僅以字節(jié)碼文件以及面向?qū)ο笳Z言的三大特性為例,其他內(nèi)容可類似得到。
2.1 字節(jié)碼文件
一般來說,學習一門基本的程序設(shè)計語言都是從“hello world”開始。為體現(xiàn)整個教學案例的連貫性,我們以下面的圓類(Circle)開始:
public class Circle {
public static void main(String[] args) {
System.out.println("Hello, Circle!");//輸出字符串
}
}
首先通過記事本將上面的代碼敲下來,然后利用已經(jīng)配置好的運行環(huán)境編譯運行。在講解的過程中我們先通過演示結(jié)果,然后再引入Java的類概念,以及Java的運行過程。比如,這個Circle類只包含一個主方法,這個主方法的方法體調(diào)用系統(tǒng)的輸出方法,將字符串“Hello, Circle!”輸出到顯示器的屏幕。而Circle類的定義是具有一定的格式要求,我們需要用關(guān)鍵字“class”對類名Circle進行修飾。在關(guān)鍵字“class”前面的修飾符為權(quán)限訪問控制修飾符“public”。這樣就可以讓學生對Java代碼有一個基本的整體認識。
介紹完Java代碼的結(jié)構(gòu)后,進一步地,向?qū)W生提問:從源代碼到屏幕字符串地顯示經(jīng)過了哪些階段呢?從而自然地引入了字節(jié)碼文件的概念,以及相關(guān)的命令:編譯命令“javac”和執(zhí)行命令“java”。
2.2 封裝
封裝是面向?qū)ο笳Z言的三大特性之一(其他兩個是繼承和多態(tài))。因此“封裝”概念的重要性是不言而喻的。為此,我們接著上面的Circle類進行案例設(shè)計。首先啟發(fā)學生:如果要計算一個給定半徑的圓的面積,我們?nèi)绾瓮ㄟ^Java語言去實現(xiàn)呢?從所表述的要求,我們知道,類中應(yīng)該包含著圓的半徑(屬性),圓的面積計算(服務(wù))。從這里也可以插個題外話,引導學生認識到,軟件的實現(xiàn)是根據(jù)客戶或用戶的需求而設(shè)計的,使學生對軟件工程有一個基本的認識。緊接著,強調(diào)封裝即是將屬性和服務(wù)結(jié)合在一起,形成一個不可分割的單位,從而自然地得到類定義中封裝的概念。封裝案例中的Java代碼如下:
public class Circle {
public double radius;
public Circle(double radius){
this.radius = radius;
}
Public double getArea(){ //計算圓面積
double dArea = PI*radius*radius;
return dArea;
}
}
為提高代碼的可重用性和可維護性,建議學生另外定義一個測試類,專門用于測試驗證所有新定義的類。這時可以向?qū)W生介紹:原代碼中的Circle類的主方法換成一個一般的成員方法,除此之外還擁有一個數(shù)據(jù)成員radius和構(gòu)造方法。由此進一步展開相關(guān)概念的介紹,比如:局部數(shù)據(jù)成員,類成員等。
2.3? 繼承
在介紹繼承概念的時候,我們基于封裝的典型案例進行擴展,得到的代碼如下:
public abstract class Shape {
abstract public double getArea();
}
public class Circle extends Shape{}
public class Rectangle extends Shape{}
在介紹這個案例之前,我們可以采用啟發(fā)式教學。例如,如果還要計算其他圖形,比如矩形的面積呢?我們能否基于原有的類,復用這個類的成員,然后再添加新的成員以滿足新的要求呢?這就涉及代碼的可擴展性和可重用性。由此,自然地引入繼承的概念。繼承體現(xiàn)類之間的”is a”的關(guān)系,將公共屬性放在一個類中,其他類可以使用繼承的方式重用創(chuàng)建的新類,并各自增加新的成員滿足不同的特定的需求?;诖?,可以看到,圓類和矩形類都有一個公共的服務(wù),即是計算面積,這樣便可以將這一服務(wù)封裝在圖形(Shape)類中,然后根據(jù)不同的形狀特點增加新的成員或方法。因此當還需計算矩形面積的時候,可以對上一個案例,即圓類的定義進行修改。這樣我們就得到了兩個由Shape類派生而來的子類:圓類和矩形類。由于只有針對特殊形狀的圖形,其面積的計算才有意義,因此可將Shape類的計算面積的方法設(shè)計為抽象方法,從而得到的Shape類為抽象類。同時,為結(jié)合實際中的軟件開發(fā),我們引入統(tǒng)一建模語言(UML)中的類圖刻畫類之間的關(guān)系。
由于Java程序語言中的類只支持單繼承,因此在引入支持多繼承的接口概念的時候,可將案例中的Java代碼稍微修改下,即是修改成:
public interface Shape {
public double getArea();
}
public class Circle implements Shape{}
public class Rectangle implements Shape{}
此時,Circle類和Rectangle類成為接口Shape的實現(xiàn)類,從而自然地過渡到接口的定義與實現(xiàn)的學習。進一步地,通過抽象類與接口案例的代碼比較,讓學生深刻認識到兩者的異同。
2.4 多態(tài)
對于多態(tài),同樣地,我們?nèi)曰谠械腏ava代碼進行擴展,構(gòu)造相應(yīng)的案例。首先提出問題:當需要同時計算多個圓和矩形的面積的時候,如何才能使得代碼更易于擴展?前面所創(chuàng)建的類對象,都是由引用變量指向相同類型的類對象,那有沒有可能指向該類的任何一個子類的對象呢?于是讓學生帶著問題,通過代碼的運行以及演示,說明這是可以的,由此引入多態(tài)的概念。這里我們僅需在測試類的主方法中增加少量代碼即可驗證,代碼如下所示:
Shape[] vec = {new Circle(2), new Retangle(1,2)};//創(chuàng)建類類型數(shù)組
for(Shape s:vec) {
System.out.println(s.getArea()); //將結(jié)果輸出
}
獲得正確的輸出結(jié)果后,再進一步介紹代碼的結(jié)構(gòu)。由于我們已經(jīng)實現(xiàn)了繼承,并且通過子類對父類的計算面積方法進行了重寫,因此在測試類中增加的父類引用指向子類所創(chuàng)建的對象,則可發(fā)生動態(tài)綁定,進而實現(xiàn)了多態(tài)。當然,我們?nèi)钥山柚@個案例的代碼,結(jié)合當前的知識點進行代碼擴展。比如:
public abstract class Shape {
abstract public double getArea();
public void dispInfo(){ } //顯示信息
}
public class Circle extends Shape{…}
public class Rectangle extends Shape{…}
上面的Java代碼中,我們在抽象類Shape中增加了顯示信息的方法dispInfo(),但是在兩個子類中都沒有進行重寫,因此利用這個例子可說明,如果子類沒有把父類的方法覆蓋,當把子類對象賦給父類引用的時候,通過父類引用調(diào)用的方法仍是父類的方法。
3 總結(jié)
本文通過經(jīng)典案例,嘗試解決在Java程序設(shè)計教學中概念的煩冗復雜和傳統(tǒng)教學中代碼的零散問題。利用一個最初等的原型代碼,結(jié)合教學的進度,逐漸將其豐富化,從而能夠?qū)⒚嫦驅(qū)ο蠓治鲋泻诵睦碚摵喕瘏s又不失一般性,進而減輕學生的學習負擔,提高學生的學習興趣,同時有助于學生對所學知識的理解能力和動手實踐能力。本文對字節(jié)碼文件以及面向?qū)ο蟮娜筇匦赃M行案例的設(shè)計,對于Java程序設(shè)計教學中的其他內(nèi)容可類似得到。
*通訊作者:農(nóng)麗娟
基金項目:桂林理工大學科研啟動基金資助項目“兩類時間非局部方程的高精度算法研究”(編號:GLUTQD2016044)
參考文獻
[1] 張琳,李朝輝,譚孟康.Java程序設(shè)計課程實踐教學探討[J].教育教學論壇,2020(27):214-215.
[2] 胡曉鵬.面向能力培養(yǎng)的“面向?qū)ο蟪绦蛟O(shè)計”課程教學改革[J].科技風,2020(35):62-63.
[3] 宋晏,楊國興.Java程序設(shè)計及應(yīng)用開發(fā)[M].北京:機械工業(yè)出版社,2019.