2.语法,,数据类型
专业从事网站建设、做网站,高端网站制作设计,小程序开发,网站推广的成都做网站的公司。优秀技术团队竭力真诚服务,采用H5响应式网站+CSS3前端渲染技术,响应式网站建设,让网站在手机、平板、PC、微信下都能呈现。建站过程建立专项小组,与您实时在线互动,随时提供解决方案,畅聊想法和感受。
3.能编一些小程序..
4.类集
5.JDBC...
6.事件驱动
7.网络.
8.hibernate
9.spring
10.j2ee
编号错了..呵呵...算了不管了..
其实JAVA嘛...很简单...对一个有C基础的人来说
没C基础的人学起来也很简单....
最重要的是要有一个类与对象的概念....
class __Main_Test
{
public static void main(String[] args) throws Exception
{
//最简单的程序的结构
}
}
__Main_Test就是一个类...
而对象呢....对象就是一个类的实体..
比如说人是一个类...人 说起人...你想到的是什么???
人是不是包括你我他...
而你就是一个对象.... 先只要知道这个就行了..
理解了类与对象...学起来会得心应手....看代码也比较轻松...
语法...要知道.....另外其它的一些东西 嘛...其实还得是自己多多去摸...多多去动手...我在这里说的全是你不知道的...是吧...所以说我说出来只能是让你听得迷糊....有问人的功夫..不如先去学最基础的....碰到了实际问题再来求救也不迟....
要是想要资料我可以给你一本我用过的PDF...
你可以发邮件给我:
lplxj1122@163.com
例1:以下程序我们申请几个指向不同类型的指针:
’使用StructLayout(LayoutKind.Sequential)属性告诉net编译器:结构的元素在内存中按其出现的顺序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一个4字节数组指针
Dim tabytTest(3) As Byte
’以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字节数组的指针
’取得一个指向32位内存数据的指针,
’由于使用gchandle取指针的方法只能对引用的对象有效,
’所以对如int32等值类型必须使用将其封装成为一个对象的方法以变为引用类型
Dim ti32Test As Object = Convert.ToInt32(0)
’以下语句告诉net垃圾回收进程不对ti32test进行处理,也就是说ti32Test的内存位置固定不变。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于结构是一种值类型变量,为保证指针申请方便,我们申请
’取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了
’由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向结构的指针
’在这儿你可以写对指针处理的任意代码(在例2中会给予补充)……
’在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理
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、 定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)
2、使用GCHandle.Alloc方法将变量的内存区域固定下来。
3、使用GCHandle对象的AddrOfPinnedObject取得该内存区域的首地址并赋值给指针变量.
4、对指针进行操作
5、使用GCHandle对象的free方法释放指针指向的内存区域以便net垃圾回收器可以回收这个内存空间
2、指针所指向数据的存取
在.net中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指针所表示的地址中写入XXX类型的数据,而ReadXXX中作用就是将指针所在地址的数据以XXX类型方式读出。看例程2,我们使用这些方法演示对例1那几个指向不同类型数据的指针作数据存/取操作。
例2:演示向例1申请得到的几个指针执行写入及读取数据的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test变量指向的地址写入32位整数77
MsgBox("现在ti32Test的值为:" ti32Test) ’因为变量存储地址的数据已改为77,所以显示为77
’以下这句之所以可行,因为ti32Test是32位整数,而tpObject指向的tabytTest数组刚好有4个元素
’而每一个byte元素都占用8位,合起来就是32位,和ti32Test占用的空间一样。这就印证了前面提’
’到的net中指针没有指向类型的说明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代码再将tabytTest字节数组的内容理解为一个int32整数,
’并将值赋值给tudtTest结构中的int32元素
’我们使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在结构中的内存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就临时产生了
’一个指针并指向i32a所在的内存地址(, 这个方法也说明了指针可以以字节为单位进行加减计算以指向合适的变量。
’Marshal.ReadInt32的作用是从指针中读取一个32整数。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’这儿可以将字节数组的内容复制到真正的结构中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("结构tidtTest1中i32a元素的值为:" tudtTest1.i32a) ’此处将显示刚赋的值77
我是 vb/asp 转 c#/MVC/WPF 的人,可能能给你一点指导
服务端和客户端 通常有两种方式,一种是 socket,一种是 http,
无非是 资料放到服务器(DataBase),通过接口(如http/socket),与 客户软件(如exe) 进行数据的交互。
先学一下 TCP/UDP 客户端、服务端
再学一下 HTTP(GET/POST)
通过VB NET VB程序员终于拥有了全部面向对象的特征 其中之一就是程序员以创建抽象类 虽然抽象类在编程中的作用常被过高估计 但抽象类确实提供了不少开发可行性 一段时间以来 VB程序员都在要求微软向他们提供全面的备受C++及JAVA程序员推崇的面向对象的特性 虽然有少部份与OOP相关的特征已被添加到旧的版本上 但程序员还得等待VB NET 将实际意义上的OOP添加到VB上去 通过OOP你可以创建抽象类 虽然大家都对它寄予了厚望 但令人惭愧的是抽象类仅仅只能给程序员提供更多的开发可行性而已 阅读本文您需要具备一定的面向对象以及VB NET的相关知识 很容易解释什么是抽象类? 抽象类即是不能被实例化的类 而且你不能够在自己的程序里通过这种类来生成一个对象 你也许会认为不能被实例化的类是没多大用处的 事实上 在某些环境下 抽象类是非常有用的 你可以把它作为一个基础类以此为基类创建新的类 在对功能要求不高的环境下生成的类 会向你提供一个规定的启始点 通过这个点你可以推导出非抽象类 在此假设一个要用抽象类的程序设计 假设图形程序提供了大量的drawing类:比如圆 三角 曲线等等 所有这些作drawing类都有某个共同的特性 比如位置 大小 色彩 删除等属性 其它的类成员 比如描绘图形的方法就不同于每个单独的类 因此 这样为利用抽象类创造了一个理想的环境 在抽象类中 你需要定义所有drawing类都需要的全部通用类成员 因为drawing类不响应任何图形 但是当把它作为shape specific drawing类中的base类 你需要确认所有这些非 抽象类拥有最基本的功能 创建抽象类 对抽象类的定义很简单 只要在定义域里加入关键字MustInherit 如 Public MustInherit class MyAbstract class End class除开要包含关键字之外 抽象类的定义与非抽象类的定义没什么两样 抽象类包含了从其它类承继而来的属性及方法等等 但是 在抽象类中定义的类成员(属性及方法)是如何与衍生类中的定义元素产生联系的呢?在此并没有复杂的规则 但你作出的决定是与你所拥有的类的性能及它将衍生出来的 类所密切相关 你有三个选择 抽象类中已有的功能比如属性 方法等在衍生类中可以被重载 实现这一功能只要在成员定义中输入Overridable关键字 如 Public Overridable Sub Move(NewX As Integer NewY As Integer) End Sub 为重载abstract base 类中的成员 衍生类在执行语句中须使用Overrides关键字段 如 Public Overrides Move(NewX As Integer NewY As Integer) End Sub 抽象类中已有的功能不能在衍生类中重载 即是 衍生类必须使用抽象类定义的成员 如果你在抽象类中不使用任何特殊字段来定义任一成员将会产生该缺省 以下代码定义了抽象类中的Xpos属性 衍生类必须使用该属性 因为该属性不能被重载 如 Public Property XPos() As Integer End Property利用MustOverride关键字来定义抽象类成员 该成员可以在衍生类中重载 以下举例说明了衍生类必须执行名为GetObjectAt()的方法 Public MustOverride Function GetObjectAt(X As Integer Y As Integer) As Object请注意MustOverride成员不需要End Sub 或End Function语句 使用MustOverride最方便的地方在于它不仅规定了成员的名称同样也规定了成员的符号 先前的例子要求任一衍生类都需定义名称为GetObjectAt()的方法 因此会产生两种类型的整型变量以及返回一个类型对象 该方法是在衍生类中的执行是完全根据程序员的指令要求 通过MustOverride字段说明的方法一些时候也被称为abstract 成员 抽象类与接口如果你熟悉接口的相关知识 你会认为抽象类与它是如此相似 事实上只是一部份类似 定义仅含有抽象成员的抽象类基本上是与接口的定义相同的 因为你已经规定衍生类必须执行某个具有专用符号的成员 另外 抽象类具有其它的功能 是接口无法实现的 尤其是在定义非抽象类成员的基本功能薄?BR当你在认为抽象类或是接口都能如常运作时 请谨记如下几点 除了从一个类(抽象或非抽象) 派生出来 一个衍生类可以执行多个接口 从抽象类派生出来的子类同样能够执行一个或多个接口 这要依你的项目而定 你可以只用一个抽象类或多个接口 或者抽象类和接口混合使用 VB和 NET在这项工作上提供了非常大的灵活性 因此你可以通过不同的方式来达到你想要的结果 底线是一些项目必须是通过抽象类来实现 抽象类也许会被认为是一种非常专业的编程方法 它可帮程序员减少工作量并且可以生成更简便功能更强大的程序 实际操作中使用抽象类 设想一下你正在为一家大公司开发一个新的员工数据库 你的工作就是监督类的执行 使雇员的基本情况与管理部门的要求相吻合 同样 在区分公司分支机构的要求时也提供更大的便利 基本要求如下: 抽象类里有姓名 雇用时间等属性 这些属性不会被重载 因为大多数雇员来自美国 因此在抽象类里执行退休ID 以运行社会保障号码 国外分公司将会利用不同的方式来鉴别雇员的退休ID 因此该属性会在衍生类里重载 以便单个分支机构分别执行 名称为补偿金的方法不会引起争议 然后会返回一个含有雇员补偿金细节的类型对象 因为不同分公司都规定不同的补偿金 薪金 佣金 红利等 因此灵活的执行这些对象是很有必要的 由此会产生一个抽象方法 由此而产生的抽象类的代码 称为EmployeeBase 会在第一栏里显示 位于法国的分公司的程序员用EmployeeBase类作为EmployeeFrance类的基类 与当地雇员记录软件合作使用 因此 衍生类需要承继名称及雇用日期等字段 更多的是 在EmployeeBase 类中的RetirementID成份适合运用在法国 因此 新类不会重载该成份 程序员做的所有这些工作是为了执行abstract Compensation member 的重载 但是在英国 RetirementID 属性不适用于该地 因此衍生类将会重载该成员 同样的也会重载Compensation 成员 lishixinzhi/Article/program/net/201311/13310