1)類的靜态成員變量通路問題
c++ 通過類名通路靜态成員,而java也一樣;
靜态變量和靜态方法既可以在類的執行個體方法中使用,也可以在類的靜态方法中使用;但是,執行個體變量和執行個體方法隻能在執行個體方法中使用,不能在靜态方法中使用;
因為靜态變量和靜态方法不屬于某個特定的對象。
#include "stdafx.h"
class A
{
public:
A(){
}
static int getCount(){
return count;
}
protected:
private:
static int count;
};
int A::count=2;
int _tmain(int argc, _TCHAR* argv[])
{
A aa;
printf("count=%d\n",A::getCount());
return 0;
}
2)函數的參數傳遞
函數形參和實參 怎麼傳遞?
java:
當傳遞基本資料類型參數時,傳遞的實參的值,在這種情況下,形參的改變并不會影響實參的值;
傳遞引用類型的參數時,傳遞的是對象的引用,引用上的傳值在語義上最好描述為傳共享(pass-by-sharing);也就是說,在
方法中引用的對象和傳遞的對象是一樣的。 傳引用,比如String;
void convert(String src,String dest)
{
dest="hello";
}
在函數内對dest重新指派,不會改變實參,如果需要改變實參,在傳引用的情況,隻有改變對象指向的内容;
而對于C++ 可以通過應用,從函數中帶出資訊;
比如:
void convert(const std::string src,std::string &dest)
{
//
}
這樣在函數中改變dest,是可以改變實參的值的;事實上,java中隻有值傳遞,沒有引用傳遞,傳遞對象,是對象的拷貝,改變的是對象裡面的内容。是以看起來像C++的引用傳遞。
http://www.codeceo.com/article/top-10-online-compiler.html
3)java中為什麼要把main方法定義為一個static方法?而C++沒有?
(1)在類中,變量的前面有修飾符static稱為靜态變量(類變量),方法的前面有修飾符static稱為靜态方法(類方法)。靜态方法和靜态變量是屬于某一個類,而不屬于類的對象。
(2)靜态方法和靜态變量的引用直接通過類名引用。
例如:類Point中有個 static int x;類變量,我們要引用它:Point.x=89;
(3)在靜态方法中不能調用非靜态方法和引用非靜态的成員變量。反之,則可以。
原因:靜态變量和靜态方法在類被加載的時候就配置設定了記憶體空間,當非靜态的方法調用他們的時候,他們已經有了記憶體空間,當然是可以調用的咯!
(4)可以用類的對象去調用靜态的方法。
我們知道,在C/C++當中,這個main方法并不是屬于某一個類的,它是一個全局的方法,是以當我們執行的時候,c++編譯器很容易的就能找到這個main方法,然而當我們執行一個java程式的時候,因為java都是以類作為程式的組織單元,當我們要執行的時候,我們并不知道這個main方法會放到哪個類當中,也不知道是否是要産生類的一個對象,為了解決程式的運作問題,我們将這個main方法定義為static,這樣的話,當我們在執行一個java代碼的時候,我們在指令提示符中寫:java Point(Point為一個類),解釋器就會在Point這個類當中,去調用這個靜态的main方法,而不需要産生Point這個類的對象,當我們加載Point這個類的時候,那麼main方法也被加載了,作為我們java程式的一個入口。
4)C++和Java的 非靜态函數可以通路靜态函數,而反過來 不行 ,在C++中靜态成員函數需要通路非靜态成員,需要傳遞 this指針;
C++的非靜态函數 可以通過類名和類的對象通路,通過對象通路其實就是通過類名通路;
5) Java類成員的四種通路權限
Java中的通路權限控制符有四個.
作用域 目前類 同一package 子孫類 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
沒有時預設為friendly,如構造函數等~這個和C++是不同的,C++預設是私有的,類外無法通路,而java是friendly,在目前類和同一個包内都可以通路。
在Java語言中有4種通路修飾符:package(預設)、private、public和protected.
1。package是預設的保護模式,又叫做包通路,沒有任何修飾符時就采用這種保護模式。包通路允許域和方法被同一個包内任何類的任何方法通路。(包内通路)
2。private辨別的通路模式,表示私有的域和方法隻能被同一個類中的其他方法通路,實作了資料隐藏;必要時,可以通過方法通路私有變量。(類内通路)
3。public修飾符用于暴露域和方法,以便在類定義的包外部能通路它們。對包和類中必要的接口元素,也需要使用這個級别;main()方法必須是public的,toString()方法也必須是public的。一般不會用public暴露一個域,除非這個域已經被聲明為final。(跨包通路)
4。protected修飾符提供一個從包外部通路包(有限制)的方法。在域和方法前增加protected修飾符不會影響同一個包内其他類和方法對它們的通路。要從包外部通路包(其中含有protected成員的類),必須保證被通路的類是帶有protected成員類的子類。也就是說,希望包中的一個類被包之外的類繼承重用時,就可以使用這個級别。一般應該慎用。(包中類被包外類繼承重用)。
6)java支援C++類似的STL嗎?Java中Vector和ArrayList的差別
首先看這兩類都實作List接口,而List接口一共有三個實作類,分别是ArrayList、Vector和LinkedList。List用于存放多個元素,能夠維護元素的次序,并且允許元素的重複。3個具體實作類的相關差別如下:
- ArrayList是最常用的List實作類,内部是通過數組實作的,它允許對元素進行快速随機通路。數組的缺點是每個元素之間不能有間隔,當數組大小不滿足時需要增加存儲能力,就要講已經有數組的資料複制到新的存儲空間中。當從ArrayList的中間位置插入或者删除元素時,需要對數組進行複制、移動、代價比較高。是以,它适合随機查找和周遊,不适合插入和删除。
- Vector與ArrayList一樣,也是通過數組實作的,不同的是它支援線程的同步,即某一時刻隻有一個線程能夠寫Vector,避免多線程同時寫而引起的不一緻性,但實作同步需要很高的花費,是以,通路它比通路ArrayList慢。
- LinkedList是用連結清單結構存儲資料的,很适合資料的動态插入和删除,随機通路和周遊速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。
檢視Java源代碼,發現當數組的大小不夠的時候,需要重建立立數組,然後将元素拷貝到新的數組内,ArrayList和Vector的擴充數組的大小不同。
java ArrayList和LinkedList的差別參考如下連結。
http://pengcqu.iteye.com/blog/502676
7)java和C++ 數組的差別
JAVA裡數組的記憶體配置設定是在堆裡面的,必須用new來配置設定,而C++裡面是在棧裡面配置設定的,定義的時候會自動配置設定。
java中的數組
1、數組不是集合,它隻能儲存同種類型的多個原始類型或者對象的引用。數組儲存的僅僅是對象的引用,而不是對象本身。數組聲明的兩種形式:一、int[] arr; 二、int arr[]; 推薦使用前者,這是一個int數組對象,而不是一個int原始類型。
2、數組本身就是對象,Java中對象是在堆中的,是以數組無論儲存原始類型還是其他對象類型,數組對象本身是在堆中的。
4、在數組聲明中包含數組長度永遠是不合法的!如:int[5] arr; 。因為,聲明的時候并沒有執行個體化任何對象,隻有在執行個體化數組對象時,JVM才配置設定空間,這時才與長度有關。
5、在數組構造的時候必須指定長度,因為JVM要知道需要在堆上配置設定多少空間。例:int[] arr = new int[5];
7、一維數組的構造。形如:String[] sa = new String[5]; 或者分成兩句:String[] sa; sa = new String[5];
8、原始類型數組元素的預設值。對于原始類型數組,在用new構造完成而沒有初始化時,JVM自動對其進行初始化。預設值:byte、short、 int、long--0 float--0.0f double--0.0 boolean--false char--'"u0000'。(無論該數組是成員變量還是局部變量)
10、對象類型的數組雖然被預設初始化了,但是并沒有調用其構造函數。(C++中則會調用)也就是說:Car[] myCar = new Car[10];隻建立了一個myCar數組對象!并沒有建立Car對象的任何執行個體!
11、多元數組的構造。float[][] ratings = new float[9][]; 第一維的長度必須給出,其餘的可以不寫,因為JVM隻需要知道賦給變量ratings的對象的長度。
12、數組索引的範圍。數組中各個元素的索引是從0開始的,到length-1。每個數組對象都有一個length屬性,它儲存了該數組對象的長度。(注意和String對象的length()方法區分開來)
13、Java有數組下标檢查,當通路超出索引範圍時,将産生ArrayIndexOutOfBoundsException運作時異常。注意,這種下标檢查不是在編譯時刻進行的,而是在運作時!也就是說int[] arr = new int[10]; arr[100] = 100; 這麼明顯的錯誤可以通過編譯,但在運作時抛出!
Java中的數組中既可以存儲基本的值類型,也可以存儲對象。對象數組和原始資料類型數組在使用方法上幾乎是完全一緻的,唯一的差别在于對象數組容納的是引用而原始資料類型數組容納的是具體的數值。在讨論關于數組的問題時,一定要先确定數組中存儲的是基本值類型還是對象。特别是在調試程式時,要注意這方面。
8)
Java中的抽象函數與C++中的虛函數 轉自:http://www.cnblogs.com/yhlx/articles/2177756.html
1:java中沒有虛函數的概念,但是有抽 象函數的概念,用abstract關鍵字表示,java中抽象函數必須在抽象類中,而且抽象 函數不能有函數體,抽象類不能被執行個體化,隻能由其子類實作抽象函數,如果某個抽象類的子類仍是抽象類,那麼該子類不需要實作其父類的抽象函數。
2:C++中的有虛函數的概念,用virtual 關鍵字來表示,每個類都會有一個虛函數表,該虛函數表首先會從父類中繼承得到父類的虛函數表, 如果子類中重寫了父類的虛函數(不管重寫後的函數是否為虛函數),要調用哪個虛函數,是根據目前實際的對象來判斷的(不管指針所屬類型是否為目前類,有可 能是父類型),指針目前指向的是哪種類型的對象,就調用哪個類型中類定義的虛函數。每個類隻有一張虛拟函數表,所有的對象共用這張表。
C++的函數多态就是通過虛函數來實作的。
3: C++中,如果函數不是虛函數,則調用某個函數,是根據目前指針類型來判斷的,并不是根據指針所指向對象的類型。
4:Java中,如果函數不是抽象函數,而是一個普通函數,它是預設實作類似C++中虛函數功能的,也就是說,調用某個函數,是根據目前指針所指向對象的類型來判斷的,而不是根據指針類型判斷。正好與C++中的普通函數相反。即:JAVA裡自動實作了虛函數。
C++ Java
虛函數 -------- 普通函數
純虛函數 -------- 抽象函數
抽象類 -------- 抽象類
虛基類 -------- 接口
純虛函數: 主要特征是不能被用來聲明對象,是抽象類,是用來確定程式結構與應用域的結構據具有直接映射關系的設計工具。帶有純虛函數的類稱為抽象類,抽象類能被子類 繼承使用,在子類中必須給出純虛函數的實作,如果子類未給出該純虛函數的實作,那麼該子類也是抽象類,隻有在子類不存在純虛函數時,子類才可以用來聲明對 象!抽象類也能用于聲明指針或引用,或用于函數聲明中。具有抽象類特性的類還有構造函數和析構函數,全部是保護的類。如果沒有給出純虛函數的實作,則在它 所在的類的構造函數或析構函數中不能直接或間接的調用它。純虛函數的實作可以在類聲明外進行定義。
5. C++中一般都是把析構函數聲明為虛函數。因為虛函數可以實作動态綁定,也就是到底調用哪個函數是根據指針目前指向哪個對象來确定的,不是根據指針的類型 來确定。如果C++中不把析構函數聲明為虛函數,那麼其有個子類,重寫了虛函數,那麼當父類指針指向一個子類對象時,當調用析構函數時,隻調用父類的析構 函數,而無法調用子類的析構函數,是以一般情況是把析構函數聲明為虛函數,實作動态綁定。當然如果一個類不包含虛函數,這經常預示不打算将它作為基類使 用。當一個類不打算作為基類時,将析構函數聲明為虛拟通常是個壞主意。
标準 string 類型不包含虛函數,如果把String作為基類繼承得到子類會出問題。
總之:多态基類應該聲明虛析構函數。如果一個類有任何虛函數,它就應該有一個虛析構函數;如果不是設計用于做基類或不是設計用于多态,這樣的類就不應該聲明虛析構函數。
9)java 序列槽通信問題
java序列槽通有有一個RXTX庫,下載下傳連結如下:
http://fizzed.com/oss/rxtx-for-java
10)eclipse 使用常見問題
10.1)eclipse 中找不到design界面了
在代碼中點右鍵,選擇菜單Open with,然後點選熟悉的WindowsBuilder Editor
11)C++ lambda 表達式 代碼如下:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
int b = 2;
auto func = [=, &b](int c)->int {return b += a + c;};
return 0;
}
當我第一次看到這段代碼時,我直接淩亂了,直接看不懂啊。上面這段代碼,如果你看懂了,下面的内容就當時複習了;如果看不懂了,就接着和我一起總結吧。
基本文法
簡單來說,Lambda函數也就是一個函數,它的文法定義如下:
複制代碼代碼如下:
[capture](parameters) mutable ->return-type{statement}
1.[capture]:捕捉清單。捕捉清單總是出現在Lambda函數的開始處。實際上,[]是Lambda引出符。編譯器根據該引出符判斷接下來的代碼是否是Lambda函數。捕捉清單能夠捕捉上下文中的變量以供Lambda函數使用;
2.(parameters):參數清單。與普通函數的參數清單一緻。如果不需要參數傳遞,則可以連同括号“()”一起省略;
3.mutable:mutable修飾符。預設情況下,Lambda函數總是一個const函數,mutable可以取消其常量性。在使用該修飾符時,參數清單不可省略(即使參數為空);
4.->return-type:傳回類型。用追蹤傳回類型形式聲明函數的傳回類型。我們可以在不需要傳回值的時候也可以連同符号”->”一起省略。此外,在傳回類型明确的情況下,也可以省略該部分,讓編譯器對傳回類型進行推導;
5.{statement}:函數體。内容與普通函數一樣,不過除了可以使用參數之外,還可以使用所有捕獲的變量。
與普通函數最大的差別是,除了可以使用參數以外,Lambda函數還可以通過捕獲清單通路一些上下文中的資料。具體地,捕捉清單描述了上下文中哪些資料可以被Lambda使用,以及使用方式(以值傳遞的方式或引用傳遞的方式)。文法上,在“[]”包括起來的是捕捉清單,捕捉清單由多個捕捉項組成,并以逗号分隔。捕捉清單有以下幾種形式:
1.[var]表示值傳遞方式捕捉變量var;
2.[=]表示值傳遞方式捕捉所有父作用域的變量(包括this);
3.[&var]表示引用傳遞捕捉變量var;
4.[&]表示引用傳遞方式捕捉所有父作用域的變量(包括this);
5.[this]表示值傳遞方式捕捉目前的this指針。
上面提到了一個父作用域,也就是包含Lambda函數的語句塊,說通俗點就是包含Lambda的“{}”代碼塊。上面的捕捉清單還可以進行組合,例如:
1.[=,&a,&b]表示以引用傳遞的方式捕捉變量a和b,以值傳遞方式捕捉其它所有變量;
2.[&,a,this]表示以值傳遞的方式捕捉變量a和this,引用傳遞方式捕捉其它所有變量。
不過值得注意的是,捕捉清單不允許變量重複傳遞。下面一些例子就是典型的重複,會導緻編譯時期的錯誤。例如:
3.[=,a]這裡已經以值傳遞方式捕捉了所有變量,但是重複捕捉a了,會報錯的;
4.[&,&this]這裡&已經以引用傳遞方式捕捉了所有變量,再捕捉this也是一種重複。