第一篇:面向對象編程的總結
面向對象編程的總結(理解與看法)面向對象程序設計(Object Oriented Programming,OOP,面向對象程序設計)是一種計算機編程架構。OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。
OOP 達到了軟件工程的三個主要目標:重用性、靈活性和擴展性。為了實現整體運算,每個對象都能夠接收信息、處理數據和向其它對象發送信息。
面向對象有三大特性,分別是:封裝、繼承、多態。封裝是隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別;將抽象得到的數據和行為(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。目的是增強安全性和簡化編程,使用者不必了解具體的實現細節,而只是要通過外部接口,以特定的訪問權限來使用類的成員。任何類都可以從另外一個類繼承,即這個類擁有它所繼承類的所有成員。被繼承的類稱為父類或基類。C# 只支持單繼承,不支持多重繼承,即在C# 中一次只允許繼承一個類,不能同時繼承多個類。在C# 中,接口允許多繼承,可以通過繼承多個接口來實現類似于C++中的多重繼承。
多態是同一個類在不同場合下表現出不同的行為特征。
使用抽象方法與虛方法都可以實現多態性。抽象方法是一個未實現的方法,使用abstract關鍵字修飾,含有抽象方法的類必然是抽象類。抽象方法要在其子方法中通過override關鍵字重寫。
簡單工廠模式用于在調用者不知道對象屬于哪個自雷的情況下,創建不同的對象。
第二篇: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;
}
答:不能通過編譯。
第三篇:使用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,隱藏類的實現細節,讓使用者只能通過程序員規定的方法來訪問數據,可以方便地加入存取控制語句,限制不合理操作。
第四篇:C語言面向對象編程學習筆記
C語言面向對象編程筆記
1、在底層驅動函數前加static標識符的作用:
a:加了static后表示該函數失去了全局可見性,只在該函數所在的文件作用域內可見 b:當函數聲明為static以后,編譯器在該目標編譯單元內只含有該函數的入口地址,沒有函數名,其它編譯單元便不能通過該函數名來調用該函數,這也是對1的解析與說明
2、底層驅動的封裝模板
通常將存儲類,顯示類,AD-DA類的外設驅動函數封裝為以下幾個函數: Void Open(void);
此函數用于開啟外設,通常函數體中包涵IO和外設的初始化 Void Close(void)此函數用于關閉外設,特別是一些在休眠下功耗很大的外設,可用mos管控制其Vcc的通斷,以此達到降低系統功耗的目的
Void Read(unsigned int address,unsigned char *data[],unsigned int count)
此函數用于讀取數據,參數分別為:address,地址,*data[],存放數據的數組,count,要讀取的字節數
Void Write(unsigned int address,unsigned char *data[],unsigned int count)此函數用于寫數據,參數功能與讀函數中相似。
Void control(unsigned char cmd,unsigned char data)此函數用于控制外設的工作狀態,如休眠,低功耗等等
3、命名規則
A、宏定義全部用大寫
如:#define OLED_CS PBout(12)B、驅動函數名稱大小寫,并且動詞放置在末尾如
static long _OLED_Close(void)C、結構體的名稱,結構體名大寫,變量名小寫,“驅動”的首字母大寫
如:struct OLED_DEVICE oledDevice;
4、關于外設的數據手冊
外設的數據手冊應該去芯片的官網下載最新版本,特別注意芯片的是否有功耗控制方面的內容,
第五篇:面向對象知識總結
一、封裝
1.類本身就是一個封裝單元
2.實現:A屬于私有化;B共有的方法提供給外界訪問;C信息隱藏,安全,對外提供清晰的接口
二、繼承
1.代碼共有,方便維護擴展 2.更符合人類遇到的問題及處理的習慣 3.多重繼承關系下構造函數的執行過程
三、多態
1.概念
2.好處
3.應用(生活,程序中的應用)
程序多態的應用
1.方法重載
2.重寫父類的方法
3.重寫父類的抽象方法
4.父類類型作為方法參數,實現
5.以父類的引用,接收不同子類返回的結果
6.用接口實現
四、面向接口編程
1.理解接口
1.1接口體現的是一種能力
體現在接口中的方法
1.2接口的體現是一種約定體現在注釋和接口的名稱 1.3面向接口編程程序設計時:
A關注實現類有那些功能,不需要關注實現細節
B面向接口的約定不考慮接口
具體的實現2.使用接口如何使用接口?A編寫接口<-----根據需求設計接口的方法 B實現接口<-----實現接口里定義的所有方法 C使用接口<-----多態 3.特征1.多實現,彌補單一繼承不足 2.項目初期,搭建系統時不需要考慮具體的實現自然使用接口:設計和顯現分離 3.方便搭建整個應用系統,及系統設計
也方便搭建系統框架 4.多態應用的很好體現更自然的使用多態
重點:
1.掌握抽象類與接口不同之處 難點:
1.方法重載與重寫 2.繼承關系下,構造函數執行流程 知識體系:
數據庫體系 + OO體系