2.語(yǔ)法,,數(shù)據(jù)類(lèi)型
專(zhuān)業(yè)從事網(wǎng)站建設(shè)、做網(wǎng)站,高端網(wǎng)站制作設(shè)計(jì),小程序開(kāi)發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用H5響應(yīng)式網(wǎng)站+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站建設(shè),讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過(guò)程建立專(zhuān)項(xiàng)小組,與您實(shí)時(shí)在線(xiàn)互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。
3.能編一些小程序..
4.類(lèi)集
5.JDBC...
6.事件驅(qū)動(dòng)
7.網(wǎng)絡(luò).
8.hibernate
9.spring
10.j2ee
編號(hào)錯(cuò)了..呵呵...算了不管了..
其實(shí)JAVA嘛...很簡(jiǎn)單...對(duì)一個(gè)有C基礎(chǔ)的人來(lái)說(shuō)
沒(méi)C基礎(chǔ)的人學(xué)起來(lái)也很簡(jiǎn)單....
最重要的是要有一個(gè)類(lèi)與對(duì)象的概念....
class __Main_Test
{
public static void main(String[] args) throws Exception
{
//最簡(jiǎn)單的程序的結(jié)構(gòu)
}
}
__Main_Test就是一個(gè)類(lèi)...
而對(duì)象呢....對(duì)象就是一個(gè)類(lèi)的實(shí)體..
比如說(shuō)人是一個(gè)類(lèi)...人 說(shuō)起人...你想到的是什么???
人是不是包括你我他...
而你就是一個(gè)對(duì)象.... 先只要知道這個(gè)就行了..
理解了類(lèi)與對(duì)象...學(xué)起來(lái)會(huì)得心應(yīng)手....看代碼也比較輕松...
語(yǔ)法...要知道.....另外其它的一些東西 嘛...其實(shí)還得是自己多多去摸...多多去動(dòng)手...我在這里說(shuō)的全是你不知道的...是吧...所以說(shuō)我說(shuō)出來(lái)只能是讓你聽(tīng)得迷糊....有問(wèn)人的功夫..不如先去學(xué)最基礎(chǔ)的....碰到了實(shí)際問(wèn)題再來(lái)求救也不遲....
要是想要資料我可以給你一本我用過(guò)的PDF...
你可以發(fā)郵件給我:
lplxj1122@163.com
例1:以下程序我們申請(qǐng)幾個(gè)指向不同類(lèi)型的指針:
’使用StructLayout(LayoutKind.Sequential)屬性告訴net編譯器:結(jié)構(gòu)的元素在內(nèi)存中按其出現(xiàn)的順序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一個(gè)4字節(jié)數(shù)組指針
Dim tabytTest(3) As Byte
’以下語(yǔ)句告訴net垃圾回收進(jìn)程不對(duì)tabytTest進(jìn)行處理,也就是說(shuō)tabytTest占用的內(nèi)存區(qū)域固定不變。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字節(jié)數(shù)組的指針
’取得一個(gè)指向32位內(nèi)存數(shù)據(jù)的指針,
’由于使用gchandle取指針的方法只能對(duì)引用的對(duì)象有效,
’所以對(duì)如int32等值類(lèi)型必須使用將其封裝成為一個(gè)對(duì)象的方法以變?yōu)橐妙?lèi)型
Dim ti32Test As Object = Convert.ToInt32(0)
’以下語(yǔ)句告訴net垃圾回收進(jìn)程不對(duì)ti32test進(jìn)行處理,也就是說(shuō)ti32Test的內(nèi)存位置固定不變。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于結(jié)構(gòu)是一種值類(lèi)型變量,為保證指針申請(qǐng)方便,我們申請(qǐng)
’取得一個(gè)和結(jié)構(gòu)tudtTest1大小一致的字節(jié)數(shù)組指針,只要空間占用長(zhǎng)度和結(jié)構(gòu)一樣就可以了
’由于net在結(jié)構(gòu)封裝中會(huì)插入額外的數(shù)據(jù)位,所以一定要用sizeof方法得到結(jié)構(gòu)在非托管使用時(shí)的實(shí)際大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向結(jié)構(gòu)的指針
’在這兒你可以寫(xiě)對(duì)指針處理的任意代碼(在例2中會(huì)給予補(bǔ)充)……
’在使用完畢后一定要釋放指針指向的內(nèi)存塊,讓垃圾回收器可對(duì)這個(gè)內(nèi)存塊回收處理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End If
If thObject2.IsAllocated Then
thObject2.Free()
End If
End Function
上例中指針流程處理可以歸納為:
1、 定義一個(gè)具有合適內(nèi)存長(zhǎng)度的引用變量(關(guān)于引用變量和值變量的差異可以參觀VB.NET的書(shū)籍)
2、使用GCHandle.Alloc方法將變量的內(nèi)存區(qū)域固定下來(lái)。
3、使用GCHandle對(duì)象的AddrOfPinnedObject取得該內(nèi)存區(qū)域的首地址并賦值給指針變量.
4、對(duì)指針進(jìn)行操作
5、使用GCHandle對(duì)象的free方法釋放指針指向的內(nèi)存區(qū)域以便net垃圾回收器可以回收這個(gè)內(nèi)存空間
2、指針?biāo)赶驍?shù)據(jù)的存取
在.net中,對(duì)指針指向數(shù)據(jù)的存儲(chǔ)函數(shù)都封裝在marshal類(lèi)中,主要的函數(shù)包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針?biāo)硎镜牡刂分袑?xiě)入XXX類(lèi)型的數(shù)據(jù),而ReadXXX中作用就是將指針?biāo)诘刂返臄?shù)據(jù)以XXX類(lèi)型方式讀出??蠢?,我們使用這些方法演示對(duì)例1那幾個(gè)指向不同類(lèi)型數(shù)據(jù)的指針作數(shù)據(jù)存/取操作。
例2:演示向例1申請(qǐng)得到的幾個(gè)指針執(zhí)行寫(xiě)入及讀取數(shù)據(jù)的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test變量指向的地址寫(xiě)入32位整數(shù)77
MsgBox("現(xiàn)在ti32Test的值為:" ti32Test) ’因?yàn)樽兞看鎯?chǔ)地址的數(shù)據(jù)已改為77,所以顯示為77
’以下這句之所以可行,因?yàn)閠i32Test是32位整數(shù),而tpObject指向的tabytTest數(shù)組剛好有4個(gè)元素
’而每一個(gè)byte元素都占用8位,合起來(lái)就是32位,和ti32Test占用的空間一樣。這就印證了前面提’
’到的net中指針沒(méi)有指向類(lèi)型的說(shuō)明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代碼再將tabytTest字節(jié)數(shù)組的內(nèi)容理解為一個(gè)int32整數(shù),
’并將值賦值給tudtTest結(jié)構(gòu)中的int32元素
’我們使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在結(jié)構(gòu)中的內(nèi)存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就臨時(shí)產(chǎn)生了
’一個(gè)指針并指向i32a所在的內(nèi)存地址(, 這個(gè)方法也說(shuō)明了指針可以以字節(jié)為單位進(jìn)行加減計(jì)算以指向合適的變量。
’Marshal.ReadInt32的作用是從指針中讀取一個(gè)32整數(shù)。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’這兒可以將字節(jié)數(shù)組的內(nèi)容復(fù)制到真正的結(jié)構(gòu)中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("結(jié)構(gòu)tidtTest1中i32a元素的值為:" tudtTest1.i32a) ’此處將顯示剛賦的值77
我是 vb/asp 轉(zhuǎn) c#/MVC/WPF 的人,可能能給你一點(diǎn)指導(dǎo)
服務(wù)端和客戶(hù)端 通常有兩種方式,一種是 socket,一種是 http,
無(wú)非是 資料放到服務(wù)器(DataBase),通過(guò)接口(如http/socket),與 客戶(hù)軟件(如exe) 進(jìn)行數(shù)據(jù)的交互。
先學(xué)一下 TCP/UDP 客戶(hù)端、服務(wù)端
再學(xué)一下 HTTP(GET/POST)
通過(guò)VB NET VB程序員終于擁有了全部面向?qū)ο蟮奶卣?其中之一就是程序員以創(chuàng)建抽象類(lèi) 雖然抽象類(lèi)在編程中的作用常被過(guò)高估計(jì) 但抽象類(lèi)確實(shí)提供了不少開(kāi)發(fā)可行性 一段時(shí)間以來(lái) VB程序員都在要求微軟向他們提供全面的備受C++及JAVA程序員推崇的面向?qū)ο蟮奶匦?雖然有少部份與OOP相關(guān)的特征已被添加到舊的版本上 但程序員還得等待VB NET 將實(shí)際意義上的OOP添加到VB上去 通過(guò)OOP你可以創(chuàng)建抽象類(lèi) 雖然大家都對(duì)它寄予了厚望 但令人慚愧的是抽象類(lèi)僅僅只能給程序員提供更多的開(kāi)發(fā)可行性而已 閱讀本文您需要具備一定的面向?qū)ο笠约癡B NET的相關(guān)知識(shí) 很容易解釋什么是抽象類(lèi)? 抽象類(lèi)即是不能被實(shí)例化的類(lèi) 而且你不能夠在自己的程序里通過(guò)這種類(lèi)來(lái)生成一個(gè)對(duì)象 你也許會(huì)認(rèn)為不能被實(shí)例化的類(lèi)是沒(méi)多大用處的 事實(shí)上 在某些環(huán)境下 抽象類(lèi)是非常有用的 你可以把它作為一個(gè)基礎(chǔ)類(lèi)以此為基類(lèi)創(chuàng)建新的類(lèi) 在對(duì)功能要求不高的環(huán)境下生成的類(lèi) 會(huì)向你提供一個(gè)規(guī)定的啟始點(diǎn) 通過(guò)這個(gè)點(diǎn)你可以推導(dǎo)出非抽象類(lèi) 在此假設(shè)一個(gè)要用抽象類(lèi)的程序設(shè)計(jì) 假設(shè)圖形程序提供了大量的drawing類(lèi):比如圓 三角 曲線(xiàn)等等 所有這些作drawing類(lèi)都有某個(gè)共同的特性 比如位置 大小 色彩 刪除等屬性 其它的類(lèi)成員 比如描繪圖形的方法就不同于每個(gè)單獨(dú)的類(lèi) 因此 這樣為利用抽象類(lèi)創(chuàng)造了一個(gè)理想的環(huán)境 在抽象類(lèi)中 你需要定義所有drawing類(lèi)都需要的全部通用類(lèi)成員 因?yàn)閐rawing類(lèi)不響應(yīng)任何圖形 但是當(dāng)把它作為shape specific drawing類(lèi)中的base類(lèi) 你需要確認(rèn)所有這些非 抽象類(lèi)擁有最基本的功能 創(chuàng)建抽象類(lèi) 對(duì)抽象類(lèi)的定義很簡(jiǎn)單 只要在定義域里加入關(guān)鍵字MustInherit 如 Public MustInherit class MyAbstract class End class除開(kāi)要包含關(guān)鍵字之外 抽象類(lèi)的定義與非抽象類(lèi)的定義沒(méi)什么兩樣 抽象類(lèi)包含了從其它類(lèi)承繼而來(lái)的屬性及方法等等 但是 在抽象類(lèi)中定義的類(lèi)成員(屬性及方法)是如何與衍生類(lèi)中的定義元素產(chǎn)生聯(lián)系的呢?在此并沒(méi)有復(fù)雜的規(guī)則 但你作出的決定是與你所擁有的類(lèi)的性能及它將衍生出來(lái)的 類(lèi)所密切相關(guān) 你有三個(gè)選擇 抽象類(lèi)中已有的功能比如屬性 方法等在衍生類(lèi)中可以被重載 實(shí)現(xiàn)這一功能只要在成員定義中輸入Overridable關(guān)鍵字 如 Public Overridable Sub Move(NewX As Integer NewY As Integer) End Sub 為重載abstract base 類(lèi)中的成員 衍生類(lèi)在執(zhí)行語(yǔ)句中須使用Overrides關(guān)鍵字段 如 Public Overrides Move(NewX As Integer NewY As Integer) End Sub 抽象類(lèi)中已有的功能不能在衍生類(lèi)中重載 即是 衍生類(lèi)必須使用抽象類(lèi)定義的成員 如果你在抽象類(lèi)中不使用任何特殊字段來(lái)定義任一成員將會(huì)產(chǎn)生該缺省 以下代碼定義了抽象類(lèi)中的Xpos屬性 衍生類(lèi)必須使用該屬性 因?yàn)樵搶傩圆荒鼙恢剌d 如 Public Property XPos() As Integer End Property利用MustOverride關(guān)鍵字來(lái)定義抽象類(lèi)成員 該成員可以在衍生類(lèi)中重載 以下舉例說(shuō)明了衍生類(lèi)必須執(zhí)行名為GetObjectAt()的方法 Public MustOverride Function GetObjectAt(X As Integer Y As Integer) As Object請(qǐng)注意MustOverride成員不需要End Sub 或End Function語(yǔ)句 使用MustOverride最方便的地方在于它不僅規(guī)定了成員的名稱(chēng)同樣也規(guī)定了成員的符號(hào) 先前的例子要求任一衍生類(lèi)都需定義名稱(chēng)為GetObjectAt()的方法 因此會(huì)產(chǎn)生兩種類(lèi)型的整型變量以及返回一個(gè)類(lèi)型對(duì)象 該方法是在衍生類(lèi)中的執(zhí)行是完全根據(jù)程序員的指令要求 通過(guò)MustOverride字段說(shuō)明的方法一些時(shí)候也被稱(chēng)為abstract 成員 抽象類(lèi)與接口如果你熟悉接口的相關(guān)知識(shí) 你會(huì)認(rèn)為抽象類(lèi)與它是如此相似 事實(shí)上只是一部份類(lèi)似 定義僅含有抽象成員的抽象類(lèi)基本上是與接口的定義相同的 因?yàn)槟阋呀?jīng)規(guī)定衍生類(lèi)必須執(zhí)行某個(gè)具有專(zhuān)用符號(hào)的成員 另外 抽象類(lèi)具有其它的功能 是接口無(wú)法實(shí)現(xiàn)的 尤其是在定義非抽象類(lèi)成員的基本功能薄?BR當(dāng)你在認(rèn)為抽象類(lèi)或是接口都能如常運(yùn)作時(shí) 請(qǐng)謹(jǐn)記如下幾點(diǎn) 除了從一個(gè)類(lèi)(抽象或非抽象) 派生出來(lái) 一個(gè)衍生類(lèi)可以執(zhí)行多個(gè)接口 從抽象類(lèi)派生出來(lái)的子類(lèi)同樣能夠執(zhí)行一個(gè)或多個(gè)接口 這要依你的項(xiàng)目而定 你可以只用一個(gè)抽象類(lèi)或多個(gè)接口 或者抽象類(lèi)和接口混合使用 VB和 NET在這項(xiàng)工作上提供了非常大的靈活性 因此你可以通過(guò)不同的方式來(lái)達(dá)到你想要的結(jié)果 底線(xiàn)是一些項(xiàng)目必須是通過(guò)抽象類(lèi)來(lái)實(shí)現(xiàn) 抽象類(lèi)也許會(huì)被認(rèn)為是一種非常專(zhuān)業(yè)的編程方法 它可幫程序員減少工作量并且可以生成更簡(jiǎn)便功能更強(qiáng)大的程序 實(shí)際操作中使用抽象類(lèi) 設(shè)想一下你正在為一家大公司開(kāi)發(fā)一個(gè)新的員工數(shù)據(jù)庫(kù) 你的工作就是監(jiān)督類(lèi)的執(zhí)行 使雇員的基本情況與管理部門(mén)的要求相吻合 同樣 在區(qū)分公司分支機(jī)構(gòu)的要求時(shí)也提供更大的便利 基本要求如下: 抽象類(lèi)里有姓名 雇用時(shí)間等屬性 這些屬性不會(huì)被重載 因?yàn)榇蠖鄶?shù)雇員來(lái)自美國(guó) 因此在抽象類(lèi)里執(zhí)行退休ID 以運(yùn)行社會(huì)保障號(hào)碼 國(guó)外分公司將會(huì)利用不同的方式來(lái)鑒別雇員的退休ID 因此該屬性會(huì)在衍生類(lèi)里重載 以便單個(gè)分支機(jī)構(gòu)分別執(zhí)行 名稱(chēng)為補(bǔ)償金的方法不會(huì)引起爭(zhēng)議 然后會(huì)返回一個(gè)含有雇員補(bǔ)償金細(xì)節(jié)的類(lèi)型對(duì)象 因?yàn)椴煌止径家?guī)定不同的補(bǔ)償金 薪金 傭金 紅利等 因此靈活的執(zhí)行這些對(duì)象是很有必要的 由此會(huì)產(chǎn)生一個(gè)抽象方法 由此而產(chǎn)生的抽象類(lèi)的代碼 稱(chēng)為EmployeeBase 會(huì)在第一欄里顯示 位于法國(guó)的分公司的程序員用EmployeeBase類(lèi)作為EmployeeFrance類(lèi)的基類(lèi) 與當(dāng)?shù)毓蛦T記錄軟件合作使用 因此 衍生類(lèi)需要承繼名稱(chēng)及雇用日期等字段 更多的是 在EmployeeBase 類(lèi)中的RetirementID成份適合運(yùn)用在法國(guó) 因此 新類(lèi)不會(huì)重載該成份 程序員做的所有這些工作是為了執(zhí)行abstract Compensation member 的重載 但是在英國(guó) RetirementID 屬性不適用于該地 因此衍生類(lèi)將會(huì)重載該成員 同樣的也會(huì)重載Compensation 成員 lishixinzhi/Article/program/net/201311/13310