第一篇:使用java實現面向對象編程總結
第一章:抽象和封裝
1,為什么使用面向對象
1.1:萬事萬物皆對象,面向對象就是采用“現實模擬”的方法設計和開發程序。
2,使用面向對象進行設計
2.1:面向對象設計三部曲
1,發現類。
2,發現類的屬性。
3,發現類的方法。
經驗:在需求中找出名詞的方式確定類和屬性,找出動詞的方式確定方法。
3,創建類的對象
1,通過構造方法來創建對象
2,通過對象名.屬性名的方式調用屬性。
3,通過對象名.方法名的方式調用方法。
4,Static可以用來修飾屬性,方法和代碼塊。Static修飾的變
量屬于這個類所有。即由這個類創建的所有對象共有同一個static變量。類屬性,類方法可以通過類名和對象名訪問,勢力屬性,實例方法只能通過對象名訪問。
5,在方法里不可以定義static變量,類變量不能是局部變量。6,構造函數的重載
1,構造方法的名字和類名相同,沒有返回值類型。構造
方法的作用主要就是在創建對象是執行一些初始化操作,賦值。
2,在沒有給類提供任何構造方法時,系統會提供一個無
參的方法體為空的默認構造方法。一旦提供了自定義構造方法,系統將不會提供這個默認構造方法,如果要使用她,必須手動添加。
3,如果同一個類中包含了兩個或兩個以上方法,它們的方法名相同,方法參數個數或參數類型不同,則稱該方法被重載。成員方法和構造方法都可以重載。
4,構造方法沒有返回值類型。如果有,就不是構造方法,而是構造方法同名的成員方法。
5,封裝
1,封裝是類的三大特性之一,就是將類的狀態信息隱
藏在內部。
2,封裝的具體步驟:為每個屬性創建一對一賦值,在賦值方法中,加入對屬性的存取控制語句。
3,隱藏類的實現細節,讓使用者只能通過程序員規定的方法來訪問數據,可以方便地加入存取控制語句,限制不合理操作。
第二篇:Java面向對象編程習題總結
第一章
面向對象開發方法概述
1.面向對象的軟件開發有哪些優點?
1)
把軟件系統看成是各種對象的集合,這更接近人類的自然思維方式。
2)
軟件需求的變動性往往是功能的變動,而功能的執行者——對象,一般不會有多大的變化,比結構化更穩定。
3)
對象包括屬性和行為,對象把數據及方法的具體實現方式一起封裝起來,使得方法與之相關的數據不再分析,提高了每個子系統的相對對立性,從而提高軟件的可維護性。
4)
支持封裝,抽象,繼承和多態。提高了軟件的可重用性,可維護性和可擴展性。
2.在軟件系統中,為什么說一個孤立的不對外提供任何服務的對象是沒有意義的?
1)
每個對象都具有特定的功能,相對于其他對象而言,它的功能就是為其他對象提供的服務。
2)
從使用者角度出發,整個軟件系統就是一個服務的提供者。
3)
在系統內部,每個子系統也都是服務的提供者,它們其他子系統提供服務。
4)
因此說一個孤立的部隊為提供任何服務的系統是美歐任何意義的。
3.列舉一些現實生活中的例子,來說明什么是依賴關系、什么是聚集關系,以及什么是關聯關系。
1)
關聯關系:關聯是指類之間的特定對應關系,可以分為單向關聯和雙向關聯,也可以分為一對一關聯、一對多關聯以及多對多關聯。A關聯B,是指Class A與Class B之間存在特定的對應關系。舉例如學生和老師,訂單和客戶。
2)
依賴關系:類之間的調用關系。A依賴B,Class A訪問Class B提供的服務。如Panel與Shape的關系。
3)
聚集關系:是整體與部分之間的關系
4.列舉一些顯示生活中的例子,來說明什么是封裝,什么是接口。
1)
接口:對象中所有向使用者公開的方法的聲明構成了對象的接口。
2)
封裝:隱藏對象的屬性和實現細節,僅僅對外公開接口。
3)
接口的優點:a.提高系統之間松散耦合b.提高了系統的可擴展性。
4)
封裝的有點:
a.便于使用者正確、方便地理解和使用系統,防止使用者錯誤修改系統的屬性。
b.有助于建立各個系統之間的松耦合關系,提高系統的獨立性。
c.提高軟件的可重用性,沒個系統都是一個相對獨立的整體,可以在多種環境中得到重用。
d.降低構建大型系統的風險,即使整個系統不成功,個別的獨立子系統有可能依然有價值。
5.抽象的最主要特征是什么?
抽象是指從特定角度出發,從已經存在的一些事物中抽取我們所關注的特性,形成一個新的事物的思維過程。
6.在建立對象模型時,要經歷哪些抽象思維過程?
1)
從問題領域的事物到軟件模型中對象的抽象。
2)
從對象到類的抽象。
3)
從子類到父類的抽象
7.類就是程序員自定義的類型。這種說法是否正確?
不正確,類是一組具有相同屬性和行為的對象的抽象。類及類的關系構成了對象模型的主要內容。開發人員需要根據先識別對象,然后再進行分類(創建任意的數據模型)的思路來建立對象模型。
8.小王本來體重70kg,經過減肥,體重降到45kg,試從這個問題領域中識別對象、類、屬性、狀態和狀態的變化。
1)
類:人。
2)
對象:小王。
3)
屬性:體重。
4)
狀態:70kg。
5)
狀態的變化:小王的減肥行為導致體重下降。
9.在UML圖中哪些框圖描述了系統的動態結構,哪些框圖描述了系統的靜態結構?
1)
用例圖、類框圖、組件圖、部署圖構成了系統的靜態模型。
2)
狀態轉換圖、時序圖、協作圖則構成了系統的動態模型。
第二章
第一個Java應用
1.把一個類放在包里有什么用?
答:把類分包的作用:
(1)
能夠區分名字相同的類
(2)
有助于實施訪問權限控制
(3)
有助于劃分和組織Java應用中的各個類
2.JavaDoc文檔是不是為軟件的終端用戶提供的使用指南?
答:不是的,JavaDoc文檔是供Java開發人員閱讀的,他們通過JavaDoc文檔來了解其他開發人員開發的類的用法。Java開發人員應該養成經常閱讀JavaDoc文檔的良好習慣。
3.對于com.abc.dollapp.AppMain類,使用以下命令進行編譯,編譯出來的.class文件位于什么目錄下?
java –d C:classes –sourcepath C:src C:srccomabcdollappAppMain.java
答:將會存放在C:classescomabcdollapp下。
4.對于以上編譯出來的AppMain類,以下哪個java命令能正確運行它?
(a)
java C:classescomabcdollappAppMain.class
(b)
java –classpath C:classes AppMain
(c)
java –classpath C:classescomabcdollapp AppMain
(d)
java –classpath C:classes com.abc.dollapp.AppMain
答:(b)
5.以下哪些main()方法的聲明能夠作為程序的入口方法?
(a)
public static void main()
(b)
public static void main(String[] string)
(c)
public static void main(String args)
(d)
static public int main(String[] args)
(e)
static void main(String[] args)
答:(b),主函數必須以public static void形式存在,參數必須為String數組形式。
6.假定以下程序代碼都分別放在MyClass.java文件中,哪些程序代碼能夠編譯通過?
(a)
import java.awt.*;package Mypackage;
class MyClass{};
(b)
package MyPackage;
import java.awt.*;
class MyClass{};
(c)
/*This is comment*/
package MyPackage;
import java.awt.*;
public class MyClass{};
答:(c),程序順序必須按照import, package, class走,源文件必須以public類型的類命名。
7.對于以下Myprog類,運行命令”java Myprog good morning”,將會得到打印結果?
public class Myprog {
public static void main(String argv[])
{
System.out.println(argv[2]);
} }
答:打印結果為空。argv[0] = “good”, argv[1] = “morning”。
8.下面哪些是Java的關鍵字?
(a)
default
(b)
NULL
(c)
String
(d)
throws
(e)
long
(f)
true
答:(a),(d),(e),(f),java中所有的關鍵字都是小寫。
9.當AppMain類的main()方法創建了5個Doll對象時,運行時數據區的數據如何分布的?參考2.4節的圖2-13,畫出此時運行時數據區的狀態圖。
運行時數據區(內存)
Java棧區
執行main()方法的主線程的方法調用棧
局部變量beibei
局部變量jingjing
局部變量huanhuan
局部變量yingying
局部變量nini
堆區
Doll實例
name:貝貝
Doll實例
name:晶晶
Doll實例
name:歡歡
Doll實例
name:迎迎
Doll實例
name:妮妮
方法區
Doll類型信息
AppMain類型信息
(包含main()方法信息)
10.下面哪些是合法的Java標識符?
(a)
#_pound
(b)
_underscore
(c)
5Interstate
(d)
Interstate5
(e)
_5_
(f)
class
答:(b),(d),(e)標識符命名規則如下:
(1)
標識符首字母必須為字母、下劃線“_”、美元“$”、人民幣“¥”(2)
標識符由數字、大寫字母、小寫字母、下劃線以及美元等組成
(3)
不能把關鍵字和保留字作為標識符
(4)
標識符沒有長度的限制
(5)
標識符是大小寫敏感的第三章
數據類型和變量
1.對于以下程序,運行“java Abs”,將得到什么打印結果?
public class Abs
{
static int a = 0x11;
//十六進制
static int b = 0011;
//八進制
static int c = 'u0011';
//十六進制數據的Unicode字符編碼
static int d = 011;
//八進制
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println(“a=”+a);
System.out.println(“b=”+b);
System.out.println(“c=”+c);
System.out.println(“d=”+d);
} }
答:輸出如下
a=17 b=9 c=17 d=9
2.以下哪段代碼能正確編譯通過?
(a)
char a = ?a?;
char b = 1;
char c = 08;
(b)
int a = ?a?;
(c)
long a =?u00FF?;
(d)
char a = ?u0FF?;
(e)
char d = “d”;
答:(b)、(c)能通過編譯。(a)中“char c=08”將int賦值給char需要部分強制轉換,“char c=8”就正確;(d)中unicode編碼錯誤,java采用的是UCS-2編碼,共16位;(e)字符賦值是使用單引號,字符串String賦值時才使用雙引號。
3.下面哪些代碼能編譯通過?
(a)
short myshort=99S;
(b)
String name = ?Excellent tutorial Mr Green?;(c)
char c = 17c;
(d)
int z = 015;
答:(d)可以編譯通過。(a)中char賦值給short需要強制轉換;(b)中String類型賦值用雙引號;(c)中int賦值給char需要部分強制轉換。
4.字符“A”的Unicode字符編碼為65.下面哪些代碼正確定義了一個代表字符“A”的變量?
(a)
Char ch=65;
(b)
Char ch=?65?;
(c)
Char ch =?u0041?;
(d)
Char ch=?A?;
(e)
Char ch =”A”
答:(c)、(d)可以得到”A”。(b)的輸出為5,其他無法編譯通過。
5.以下代碼共創建了幾個對象?
String s1=new String(“hello”);
String s2=new String(“hello”);
String s3=s1;
String s4=s2;
答:共創建了2個對象。棧區4個局部變量分別引用了堆區的2個實例,而2個實例又引用了工作區的同一個類。
6.以下代碼能否編譯通過?假如能編譯通過,運行時將得到什么打印結果?
class Test {
static int myArg = 1;
public static void main(String[] args)
{
Int myArg;
System.out.println(myArg);
} }
答:無法編譯通過,因為局部變量myArg聲明之后Java虛擬機就不會自動給它初始化為默認值,若在使用前未被初始化,編譯會報錯。
7.對于以下程序,運行“java Mystery Mighty Mouse”,將得到什么打印結果?
public class Mystery
{
public static void main(String[] args)
{
Changer c = new Changer();
c.method(args);
System.out.println(args[0]+“ ”+args[1]);
}
static class Changer
{
void method(String[] s)
{
String temp = s[0];
s[0] = s[1];
s[1] = temp;
}
} }
答:打印結果為“Mighty Mystery”
8.對于以下程序,運行“java Pass”,將得到什么打印結果?
public class Pass
{
static int j = 20;
public static void main(String[] args)
{
int i=10;
Pass p = new Pass();
p.amethod(i);
System.out.println(“i=”+i);
System.out.println(“j=”+j);
}
public void amethod(int x)
{
x*=2;
j*=2;
} }
答:打印結果是
i=10 j=40
其中“int x”是傳參,作用域僅在amethod之中。
第四章 操作符
1.以下哪些程序代碼能夠編譯通過?
(a)
int i=0;if(i){
System.out.println(“hello”);}
(b)
boolean b1=true;
boolean b2=true;
if(b1==b2){
System.out.println(“So true”);}
(c)
int i=1;
int j=2;
if(i==1||j==i){
System.out.println(“ok”);}
(d)
int i=1;
int j=2;
if(i==1&|j==i){
System.out.println(“ok”);}
答:(b)、(c)能編譯通過。(a)中int不能作為boolean出現,(d)中不能出現&|該操作符。
2.運行以下程序,將得到什么打印結果?
System.out.println(-1>>>1);
System.out.println(-1>>1);
System.out.println(2>>1);
System.out.println(1<<<1);
答:>>>是邏輯右移位操作符,也稱不帶符號右移位操作符,在移位的過程中二進制數開頭填0;>>是右移位操作符,也稱帶符號右移位操作符,舍棄末尾,在開頭填符號位;<<<操作符不存在;
11111111 11111111 11111111 11111111
-1>>>1
01111111 11111111 11111111 11111111
11111111 11111111 11111111 11111111
-1>>1
11111111 11111111 11111111 11111111
00000000 00000000 00000000 00000010
2>>1
00000000 00000000 00000000 00000001
2147483647-1 1
3.以下temp變量最終取值是什么?
long temp =(int)3.9;
temp %= 2;
答:取值為1。
4.以下代碼能否編譯通過?假如能編譯通過,運行時將得到什么打印結果?
if(5 & 7 > 0 && 5 | 2)System.out.println(“true”);
答:int型不能作為boolean型出現。
5.以下代碼能否編譯通過?假如編譯通過,運行時將得到什么打印結果?
int output=10;
boolean b1 = false;
if((b1==true)&&((output+=10)==20)){
System.out.println(“We are equal”+output);} else {
System.out.println(“Not equal!”+output);}
答:Not equal!10
6.以下代碼能否編譯通過?假如能編譯通過,運行時將得到什么打印結果?
int output=10;
boolean b1 = false;
if((b1==true)&((output+=10)==20)){
System.out.println(“We are equal”+output);} else {
System.out.println(“Not equal!”+output);}
答:Not equal!20
7.對于以下聲明:
String s1=new String(“Hello”);
String s2=new String(“there”);
String s3=new String();
下面哪些是合法的操作?
(a)
s3=s1+s2;
(b)
s3=s1-s2;
(c)
s3=s1&s2;
(d)
s3=s1&&s2;
答:(a)是合法操作。除了“+”能用于字符串的連接以外,其他操作符(如“-”、“&”、“&&”等)都不支持String類型的操作元。
第五章
流程控制
1.運行以下代碼,將得到什么打印結果?
int i = 3;
int j = 0;
double k = 3.2;
if(i < k)
if(i == j)
System.out.println(i);
else
System.out.println(j);
else
System.out.println(k);
答:0
2.以下代碼能否編譯通過?假如能編譯通過,運行時將得到什么打印結果?
int i = 4;
switch(i){
default:
System.out.println(“default”);
case 0:
System.out.println(“zero”);
break;
case 1:
System.out.println(“one”);
case 2:
System.out.println(“two”);}
答:可以編譯通過,打印結果是:
default
zero
分析:default可以放在任何位置上,一旦符合一個case即從頭執行到尾,不再判斷case。
3.以下哪些是合法的
(a)
int i;for(i=5, int j=10;i<10;j--){}
(b)
int i,j;for(i=0, j=10;i<10, j>0;i++, j--){}
(c)
int i,k;for(i=0, k=9;(i<10 && k>0);i++, k--){}
(d)
int i,j;for(i=0;j=10;i<10;i++,j--){} 答:(a)for語句中int定義要放在開頭。編譯不通過。
(b)循環判斷語句不可以用逗號連接。編譯不通過。
(c)合法。
(d)分號只能有2個。
4.運行以下代碼,將得到什么打印結果?
int i = 1;
switch(i){
default:
System.out.println(“default”);
case 0:
System.out.println(“zero”);
break;
case 1:
System.out.println(“one”);
case 2:
System.out.println(“two”);}
答:分析同1,運行結果如下:
one
two
5.以下哪些代碼合法?
(a)
float x=1;
switch(x){
case 1;
System.out.println(“Got a 1”);
}
(b)
long x=1;
switch(x){
case 1;
System.out.println(“Got a 1”);
}
(c)
byte x=1;
switch(x){
case 1/1;
System.out.println(“Got a 1”);
}
(d)
int x=1;
int c=1;
switch(c){
case x;
System.out.println(“Got a 1”);}
(e)
short x=1;
switch(x){
case 3.2/2;
System.out.println(“Got a 1”);
}
(f)
short x=1;
switch(x){
case 1,2,3;
System.out.println(“Got a 1”);
}
答:只有(c)是合法的。
6.以下代碼能否編譯通過?假如能編譯通過,運行時將得到什么打印結果?
for(int a=0, b=0;a<2;b=++a, System.out.println(“b=”+b)){
System.out.println(“a=”+a);}
答:可以通過編譯,打印結果:
a=0 b=1 a=1 b=2
7.以下代碼能否編譯通過?假如能編譯通過,運行時將得到什么打印結果?
int x=0;one:
while(x<10)
{
two:
System.out.println(++x);
if(x>3)
break two;
}
答:不能通過編譯。
第三篇:面向對象編程的總結
面向對象編程的總結(理解與看法)面向對象程序設計(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。
OOP 達到了軟件工程的三個主要目標:重用性、靈活性和擴展性。為了實現整體運算,每個對象都能夠接收信息、處理數據和向其它對象發送信息。
面向對象有三大特性,分別是:封裝、繼承、多態。封裝是隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別;將抽象得到的數據和行為(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。目的是增強安全性和簡化編程,使用者不必了解具體的實現細節,而只是要通過外部接口,以特定的訪問權限來使用類的成員。任何類都可以從另外一個類繼承,即這個類擁有它所繼承類的所有成員。被繼承的類稱為父類或基類。C# 只支持單繼承,不支持多重繼承,即在C# 中一次只允許繼承一個類,不能同時繼承多個類。在C# 中,接口允許多繼承,可以通過繼承多個接口來實現類似于C++中的多重繼承。
多態是同一個類在不同場合下表現出不同的行為特征。
使用抽象方法與虛方法都可以實現多態性。抽象方法是一個未實現的方法,使用abstract關鍵字修飾,含有抽象方法的類必然是抽象類。抽象方法要在其子方法中通過override關鍵字重寫。
簡單工廠模式用于在調用者不知道對象屬于哪個自雷的情況下,創建不同的對象。
第四篇:java面向對象的學習心得
Java面向對象的學習心得
大三的時候學校組織我們去蘇州NIIT參加四個月的java實訓,我開始系統的學習期java,之前大學的時候學的比較寬泛,沒有專門的正對java的學習。
首先我是從學習Java編程開始接觸OOP(面向對象編程),剛開始使用Java編寫程序的時候感覺很別扭,因為我早以習慣用C來編寫程序,很欣賞C的簡潔性和高效性,喜歡C簡練而表達能力豐富的風格,特別忍受不了Java運行起來慢吞吞的速度,相對冗長的代碼,而且一個很簡單的事情,要寫好多類,一個類調用一個類,心里的抵觸情緒很強。
我對Java的面向對象的特性琢磨良久,自認為有所領悟,也開始有意識的運用OOP風格來寫程序,然而還是經常會覺得不知道應該怎樣提煉類,面對一個具體的問題的時候,會覺得腦子里千頭萬緒的,不知道怎么下手,一不小心,又會回到原來的思路上去。
舉個例子,要發廣告郵件,廣告郵件列表存在數據庫里面。倘若用C來寫的話,一般會這樣思考,先把郵件內容讀入,然后連接數據庫,循環取郵件地址,調用本機的qmail的sendmail命令發送。
然后考慮用Java來實現,既然是OOP,就不能什么代碼都塞到main過程里面,于是就設計了三個類:
一個類是負責讀取數據庫,取郵件地址,調用qmail的sendmail命令發送; 一個類是讀郵件內容,MIME編碼成HTML格式的,再加上郵件頭;
一個主類負責從命令讀參數,處理命令行參數,調用發email的類。
把一件工作按照功能劃分為3個模塊分別處理,每個類完成一件模塊任務。
仔細的分析一下,就會發現這樣的設計完全是從程序員實現程序功能的角度來設計的,或者說,設計類的時候,是自低向上的,從機器的角度到現實世界的角度來分析問題的。因此在設計的時候,就已經把程序編程實現的細節都考慮進去了,企圖從底層實現程序這樣的出發點來達到滿足現實世界的軟件需求的目標。
這樣的分析方法其實是不適用于Java這樣面向對象的編程語言,因為,如果改用C語言,封裝兩個C函數,都會比Java實現起來輕松的多,邏輯上也清楚的多。
我覺得面向對象的精髓在于考慮問題的思路是從現實世界的人類思維習慣出發的,只要領會了這一點,就領會了面向對象的思維方法。
舉一個非常簡單的例子:假使現在需要寫一個網頁計數器,客戶訪問一次頁面,網頁計數器加1,計數器是這樣來訪問的后臺有一個數據庫表,保存每個id(一個id對應一個被統計訪問次數的頁面)的計數器當前值,請求頁面一次,對應id的計數器的字段加1(這里我們忽略并發更新數據庫
表,出現的表鎖定的問題)。
如果按照一般從程序實現的角度來分析,我們會這樣考慮:首先是從HTTP GET請求取到id,然后按照id查數據庫表,獲得某id對應的訪問計數值,然后加1,更新數據庫,最后向頁面顯示訪問計數。
現在假設一個沒有程序設計經驗的人,他會怎樣來思考這個問題的呢?他會提出什么樣的需求呢?他很可能會這樣想:
我需要有一個計數器,這個計數器應該有這樣的功能,刷新一次頁面,訪問量就會加1,另外最好還有一個計數器清0的功能,當然計數器如果有一個可以設為任意值的功能的話,我就可以作弊了。
做為一個沒有程序設計經驗的人來說,他完全不會想到對數據庫應該如何操作,對于HTTP變量該如何傳遞,他考慮問題的角度就是我有什么需求,我的業務邏輯是什么,軟件應該有什么功能。
按照這樣的思路(請注意,他的思路其實就是我們平時在生活中習慣的思維方式),我們知道需要有一個計數器類 Counter,有一個必須的和兩個可選的方法:
getCount()// 取計數器值方法
resetCounter()// 計數器清0方法
setCount()// 設計數器為相應的值方法
把Counter類完整的定義如下:
public class Counter {
public int getCount(int id){}
public void resetCounter(int id){}
public void setCount(int id, int currentCount){}
}
解決問題的框架已經有了,來看一下如何使用Counter。在count.cgi里面調用Counter來計數,程序片斷如下:
// 這里從HTTP環境里面取id值
...Counter myCounter = new Counter();// 獲得計數器
int currentCount = myCounter.getCount(id);// 從計數器中取計數
// 這里向客戶瀏覽器輸出
...程序的框架全都寫好了,剩下的就是實現Counter類方法里面具體的代碼了,此時才去考慮具體的程序語言實現的細節,比如,在getCount()方法里面訪問數據庫,更新計數
值。
從上面的例子中看到,面向對象的思維方法其實就是我們在現實生活中習慣的思維方式,是從人類考慮問題的角度出發,把人類解決問題的思維方式逐步翻譯成程序能夠理解的思維方式的過程,在這個翻譯的過程中,軟件也就逐步被設計好了。
在運用面向對象的思維方法進行軟件設計的過程中,最容易犯的錯誤就是開始分析的時候,就想到了程序代碼實現的細節,因此封裝的類完全是基于程序實現邏輯,而不是基于解決問題的業務邏輯。
學習JDBC編程的經典錯誤問法是:“我怎樣封裝對數據庫的select操作?”
面向對象的設計是基于解決業務問題的設計,而不是基于具體編程技術的設計。我不會去封裝select語句的,我只封裝解決問題的業務邏輯,對數據庫的讀取是在業務邏輯的編碼實現階段才去考慮的問題。
回過頭看上面那個發廣告郵件的例子,應該如何應用面向對象的思維方法呢?
對于一個郵件來說,有郵件頭,郵件體,和郵件地址這三個屬性,發送郵件,需要一個發送的方法,另外還需要一個能把所有郵件地址列出來的方法。所以應該如下設計:
類JunkMail
屬性:
head
body
address
方法:
sendMail()// 發送郵件
listAllMail()// 列郵件地址
用Java來表示:
public class JunkMail {
private String head;
private String body;
private String address;
public JunkMain(){ // 默認的類構造器
// 從外部配置文件讀郵件頭和郵件體
this.head=...;
this.body=...;
}
public static boolean sendMail(String address){
// 調用qmail,發送email
}
public static Collection listAllMail(){
// 訪問數據庫,返回一個郵件地址集合}
}
當把JunkMail設計好了以后,再調用JunkMail類完成郵件的發送,將是非常輕松的事情。
如果說傳統的面向過程的編程是符合機器運行指令的流程的話,那么面向對象的思維方法就是符合現實生活中人類解決問題的思維過程。
在面向對象的軟件分析和設計的時候,要提醒自己,不要一上來就去想程序代碼的實現,應該拋開具體編程語言的束縛,集中精力分析我們要實現的軟件的業務邏輯,分析軟件的業務流程,思考應該如何去描述和實現軟件的業務。畢竟軟件只是一個載體,業務才是我們真正要實現的目標。
但是在設計過程中,心里卻往往在擔心,如果我完全不去考慮程序代碼的實現的話,那么我怎么知道我的設計一定合理呢?我怎么知道我設計的類、接口一定可以實現呢?所以經常可以看到的現象就是:
在設計過程中,雖然知道不能過早考慮代碼實現,但是每設計一個類,一個接口,心里都要不知不覺的用自己熟悉的編程語言大概的評估一下,看看能否編出來,因此,一不小心,就會又回到按照程序功能實現的思路進行設計的老路上去了。
舉個例子來說明,在做Web程序設計的時候,經常要遇到分頁顯示數據的情況。比如說需要把系統中所有的用戶都列出來這樣的功能。假設使用User類來表示用戶,增加用戶addUser(),刪除用戶deleteUser(),查詢所有用戶listUsers()方法。而數據庫中有一個user表,一條記錄是一個用戶的信息。下面考慮一下User類的方法的實現:
addUser()和deleteUser()方法都好實現,就是對數據庫增加記錄和刪除記錄。對于listUsers()方法,其實就是對user表的select,取出一個記錄集。但是該怎么從listUsers()方法中得到所有用戶的列表呢?
一個方法調用的返回值只有一個,沒有多個,所以很多情況下采用的辦法就是返回值定義為集合類型,比如Vector。這樣就可以在listUsers()方法的具體代碼實現的時候,從數據庫依次取出一個個記錄,插入到Vector里面來。在主程序里面,調用listUsers()方法可以返回一個Vector,然后再對Vector遍歷操作,就可以得到用戶列表了。
public class User {
public static void addUser(...){
// 數據庫insert一條記錄
}
public static void deleteUser(...){
// 數據庫delete一條記錄
}
public Vector listUsers(...){
// 數據庫select結果放到一個集合里面
}
}
這樣的設計基本合理,但是仍然有點小問題。因為在設計的時候,就考慮到了用Java的集合類Vector來實現對不定長數據集的存放,因而違反了面向對象設計的一個原則:在設計的時候不應過早的考慮具體程序語言的實現。所以必須用抽象的方法,和具體實現無關的方法來表達業務邏輯。
我們知道,通常對具有集合特征的數據結構進行遍歷通常可以使用next和hasNext方法,next實現取下一個用戶,hasNext判斷是否還有元素。因此我們定義一個接口Iterator,這個接口中定義兩個方法next和hasNext:
public interface Iterator {
public boolean hasNext(){}
public Object next(){}
}
而User類的listUses方法返回值改為Iterator接口的實現類:
public class User {
...public Iterator listUsers(){
}
...}
這樣就把User類的設計和具體的實現方法分離開了,因為此時任何實現了next()和hasNext()方法的類都可以做為listUsers的返回值,都可以被用來表達“用戶列表”,而不僅僅可以使用Vector而已。比如,我可以用ArrayList來表達用戶列表,因為ArrayList也實現了Iterator,當然我也可以自己專門寫一個類來存放用戶列表,只要實現next()和hasNext()方法就行了。
這樣在具體的編寫代碼的時候,程序員具有了最大的靈活性,可以根據具體的情況,采用不同的編程方法來存放用戶列表。特別是降低了程序的耦合度,提高了程序的可移植性。對于上面那個JunkMail的listAllMail()方法也同樣應該改為接口類型。
然后,在主程序里面就這樣來使用User類的listUsers方法:
User myUser = new User();
Iterator iterator = myUser.listUsers();
while(iterator.hasNext()){
iterator.next();
}
這樣就可以完全不用考慮程序代碼實現了,從高層次上把功能抽象出來,定義成為接口,同時又可以把系統設計的很合理,完全根據業務的需求來進行設計。
結語
通過上面的幾個例子的設計說明,使用面向對象的思維方法,其實是一個把業務邏輯從具體的編程技術當中抽象出來的過程,而這個抽象的過程是自上而下的,非常符合人類的思維習慣,也就是先不考慮問題解決的細節,把問題的最主要的方面抽象成為一個簡單的框架,集中精力思考如何解決主要矛盾,然后在解決問題的過程中,再把問題的細節分割成一個一個小問題,再專門去解決細節問題。
因而一旦牢牢的抓住了這一點,你就會發現在軟件設計和開發過程中,你自己總是會不知不覺的運用面向對象的思維方法來設計和編寫程序,并且程序的設計和開發也變得不再那么枯燥,而一個合理運用面向對象技術進行設計和架構的軟件,更是具備了思維的藝術美感。
最后,愿面向對象的思維方法也能給您的程序設計之路帶來創作的樂趣。
第五篇:java面向對象程序設計教案
武漢大學珞珈學院 系/教研室 Java 面 向 對 象 程 序 設 計 課 教 案
主講教師:熊春秀 編寫時間:2011-4-30
第一章:概述
第 1、2 節:面向對象的基本概念、面向對象程序設計概述 授課時間:2011-2-
22、23
計劃學時數:1 教學任務與目的:讓學生理解面向對象的基本概念 教學重點:掌握面向對象的基本概念 教學難點:理解面向對象程序設計的方法 教學方法:多媒體+板書 參考書目:《面向對象程序設計導論》,[美]C.Thomas wu著,電子工業出版社 專業詞匯:Java虛擬機、Applet程序 備注
第二章:Java特點及運行環境
第 1、2、3 節:Java語言特點、Java應用程序及運行環境、Java Applet程序及運行環境 授課時間:2011-2-
22、23
計劃學時數:3 教學任務與目的:讓學生學會JDK的下載、安裝與環境配置。教學重點:掌握編譯和執行Java程序的基本步驟
教學難點:理解Java程序的入口并能夠通過命令行傳遞參數 教學方法:多媒體+板書 參考書目:《面向對象程序設計導論》,[美]C.Thomas wu著,電子工業出版社 專業詞匯:JDK、lib、bin 備注 第三章:Java語言基礎
第 1、2 節:Java程序的構成、數據類型、表達式以及流程控制語句 授課時間:2011-3-
1、2
計劃學時數:3 教學任務與目的:讓學生學會Java基本的數據類型和表示方法、數值類型的運算、邏輯運算和比較、條件執行語句(包括三種條件語句和switch語句)、循環控制語句(包括for、while、do while循環及相應的輔助語句)、字符串類String和BufferString以及數組的聲明及使用。
教學重點:掌握Java基本的數據類型和表示方法
教學難點:理解Java程序的循環控制語句(包括for、while、do while循環及相應的輔助語句)
教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社 專業詞匯:變量、數據類型、循環控制語句 備注 第三章:Java語言基礎 第 3 節:Java與C比較
授課時間:2011-3-
8、9
計劃學時數:3 教學任務與目的:讓學生在C語言的基本上進一步學習Java語言。教學重點:掌握Java語言與C語言的區別與聯系。教學難點:理解Java語言在C語言上的改進。教學方法:多媒體+板書 參考書目:《Java2參考大全(第四版)》,[美]Herbert Schildt著,張玉清、吳浦峰、尚勇等譯,清華大學出版社。專業詞匯:Java、C 備注 第四章:抽象、封裝與類
第 1 節:抽象、封裝與Java類的概念
授課時間:2011-3-
15、16
計劃學時數:3 教學任務與目的:讓學生學會面向對象的基本特征、掌握如何定義一個類以及如何生成對象、深入掌握方法的定義及技巧、深入掌握類的訪問權限與封裝機制、深入掌握包的定義與包的使用方法。
教學重點:掌握類的定義與對象的生成。教學難點:理解類的抽象與封裝機制。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:抽象、封裝、類 備注 第四章:抽象、封裝與類 第 2 節:系統定義的類
授課時間:2011-3-
22、23
計劃學時數:3 教學任務與目的:讓學生學會使用系統定義的類,并掌握與用戶自定義類的區別。教學重點:掌握如何定義所需要的類。
教學難點:熟悉Java平臺定義了哪些經常要用到、而且滿足我們需要的類。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:系統定義的類、用戶自定義類 備注 第四章:抽象、封裝與類
第 3 節:類、域和方法的修飾符
授課時間:2011-3-
29、30
計劃學時數:3 教學任務與目的:讓學生學會類的聲明。
教學重點:掌握如何定義類的修飾和方法的修飾符。教學難點:熟悉類的變量的定義與使用方法。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:成員變量、類變量、成員方法、類方法 備注 第五章:繼承與多態
第 1、2 節:Java的繼承與派生、域的繼承與隱藏 授課時間:2011-4-
5、6
計劃學時數:3 教學任務與目的:讓學生全面掌握面向對象的基本特征、掌握如何使用繼承性來到達軟件的重用、深入掌握繼承過程中域的隱藏和方法的覆蓋技巧。教學重點:掌握如何使用繼承性來到達軟件的重用。教學難點:熟悉繼承過程中域的隱藏和方法的覆蓋技巧。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:繼承派生、域、隱藏 備注 第五章:繼承與多態
第 3、4 節:方法的繼承、重載與覆蓋、this與super、構造函數的繼承與重載 授課時間:2011-4-
12、13
計劃學時數:3 教學任務與目的:讓學生通過繼承可以更有效地組織程序結構,明確類之間的關系,并充分利用已有的類來創建新類,通過繼承可以實現代碼的重用,以完成更復雜的設計、開發。教學重點:掌握類的重載與覆蓋的區別與聯系。教學難點:熟悉類的重載與覆蓋使用方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:繼承、重載、覆蓋、this、super 備注 第五章:繼承與多態
第 5、6 節:多態性的實現、接口聲明與實現 授課時間:2011-4-
19、20
計劃學時數:3 教學任務與目的:讓學生深入掌握抽象類和抽象方法的定義,掌握多態通過統一多個相關類的對外接口,在運行時根據不同的情況執行不同的操作,提高類的抽象度和靈活性,深入掌握接口的定義和使用技巧。
教學重點:熟悉多態性實現的兩種方式以及接口的實現。教學難點:熟悉多態性與接口的實現方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:多態性、接口 備注 第六章:工具類與算法
第 1、2 節:語言基礎類庫、Applet類與小程序的基本原理 授課時間:2011-4-
26、27
計劃學時數:3 教學任務與目的:深入了解Applet生命周期的主要方法和特點、熟練掌握Applet程序的編寫方法、深入了解Applet的安全機制及其合理運用。教學重點:熟練掌握Applet程序的編寫方法。
教學難點:深入了解Applet的安全機制及其合理運用。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:Applet、生命周期 備注 第六章:工具類與算法
第 3、4 節:數組、字符串、常用算法
授課時間:2011-5-
3、4
計劃學時數:3 教學任務與目的:讓學生學會字符串類String和BufferString、數組的聲明及使用。教學重點:熟練掌握字符串與數組的使用方法。教學難點:深入了解數組的使用方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:數組、字符串 備注 第七章:用戶圖形界面的設計
第 1、2 節:用戶自定義成分、事件驅動設計 授課時間:2011-5-
10、11
計劃學時數:3 教學任務與目的:讓學生學會使用面向對象的程序設計方法構建圖形用戶界面、深入了解抽象窗口工具包(AWT)、掌握事件處理基本原理和方法。教學重點:熟練掌握圖形用戶界面的開發方法。教學難點:深入了解圖形界面的各種事件。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:AWT、GUI 備注 第七章:用戶圖形界面的設計
第 3、4 節:GUI對象,包括:按鈕、文本框、鼠標、鍵盤等事件的處理、布局設計 授課時間:2011-5-
17、18
計劃學時數:3 教學任務與目的:讓學生深入了解GUI構件及掌握布局控制方法、熟練掌握菜單和對話框、掌握簡單繪圖方法。
教學重點:熟練使用Java語言提供的布局管理器來管理組件在容器中的布局。教學難點:深入了解組件在程序中安排中位置和大小使用方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:布局管理器、容器 備注 第八章:Java高級編程
第 1、2、3節:異常處理、多線程機制、Java程序對網上資源的訪問 授課時間:2011-5-
24、25
計劃學時數:3 教學任務與目的:讓學生深入理解多線程的基本概念、熟練掌握創建線程的兩種基本方法、熟練處理線程的同步問題和死鎖問題、深入理解異常的基本概念、熟悉和掌握Java平臺定義異常類、熟練掌握創建自定義異常類的方法。教學重點:熟練掌握創建線程的兩種基本方法。教學難點:深入了解線程的同步問題和死鎖問題。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:同步、死鎖、多線程、異常