当前位置:文档之家› C#封装的完整FTP类

C#封装的完整FTP类

C#封装的完整FTP类
C#封装的完整FTP类

功能

?建立FTP链接

?支持代理

?多种重载的同步上传文件

?多种重载的异步上传文件

?多种重载的同步下载文件

?多种重载的异步下载文件

?上传文件的进度百分比

?下载文件的进度白分比

?有区分的列出目录或者文件的信息(考虑到MS DOS显示格式和UNIX 格式)

??目录或文件存在的判断

??删除文件

??重命名文件、目录

??在FTP服务器上面拷贝、移动文件(许多人可能在苦苦寻找这个功能)

??建立、删除目录

??目录切换操作(很新颖哦?)

公共构造函数

名称说明

clsFTP()初始化clsFtp类的新实例

clsFTP(Uri由FTP地址、FTP登录用户信息、FTP登录用户密码初始化clsFtp类的新实例

FtpUri,

string

strUserName,

string

strPassword)

clsFTP(Uri

FtpUri,

string

strUserName, string

strPassword,

WebProxy

objProxy) 由FTP 地址、FTP 登录用户信息、FTP 登录用户密码、代理服务器对象初始化clsFtp 类的新实例

公共属性

名称

说明 Uri

获取或设置FTP 服务器地址 DirectoryPath 获取当前工作目录

UserName

获取或设置FTP 登录用户 Password

获取或设置FTP 登录密码 Proxy

获取或设置连接FTP 服务器的代理服务 ErrorMsg 获取操在返回的错误信息

公共方法

名称 说明

DownloadFile(string RemoteFileName, string LocalPath)

从FTP 服务器下载文件,使用与远程文件同名的文件名来

保存文件。

参数说明:

RemoteFileName : 远程文件名

LocalPath : 本地路径

DownloadFile(string RemoteFileName, string LocalPath, string LocalFileName)

从FTP 服务器下载文件,指定本地路径和本地文件名。

参数说明:

LocalPath: 本地路径

LocalFilePath: 保存文件的本地路径,后面带有"\"

LocalFileName: 保存本地的文件名

DownloadFile(string

RemoteFileName) 从FTP 服务器下载文件,返回文件二进制数据。

参数说明:

RemoteFileName : 远程文件名

DownloadFileAsync(string RemoteFileName, string LocalPath, string LocalFileName)

从FTP 服务器异步下载文件,指定本地路径和本地文件名。

参数说明:

RemoteFileName: 远程文件名

LocalPath: 保存文件的本地路径,后面带有"\"

LocalFileName: 保存本地的文件名

DownloadFileAsync(string

RemoteFileName, string

LocalFullPath) 从FTP 服务器异步下载文件,指定本地完整路径文件名。

参数说明:

RemoteFileName: 远程文件名

LocalFullPath: 本地完整路径文件名

UploadFile(string LocalFullPath)上传文件到FTP服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件名

UploadFile(string LocalFullPath, bool OverWriteRemoteFile)上传文件到FTP服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件

OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件

UploadFile(string LocalFullPath, string RemoteFileName)上传文件到FTP服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件RemoteFileName: 要在FTP服务器上面保存文件名

UploadFile(string LocalFullPath, string RemoteFileName, bool OverWriteRemoteFile)上传文件到FTP服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件名

RemoteFileName: 要在FTP服务器上面保存文件名

OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件

UploadFile(byte[] FileBytes, 上传文件到FTP服务器。

string RemoteFileName)参数说明:

FileBytes: 上传的二进制数据

RemoteFileName: 要在FTP服务器上面保存文件名

UploadFile(byte[] FileBytes, string RemoteFileName, bool OverWriteRemoteFile)上传文件到FTP服务器。

参数说明:

FileBytes: 文件二进制内容

RemoteFileName: 要在FTP服务器上面保存文件名

OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件

UploadFileAsync(string LocalFullPath)异步上传文件到FTP服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件名

UploadFileAsync(string LocalFullPath, bool OverWriteRemoteFile)异步上传文件到FTP服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件

OverWriteRemoteFile: 是否覆盖远程服务器上面同名的文件

UploadFileAsync(string LocalFullPath, string RemoteFileName)异步上传文件到FTP服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件

RemoteFileName: 要在FTP 服务器上面保存文件名

UploadFileAsync(string

LocalFullPath, string

RemoteFileName, bool

OverWriteRemoteFile) 异步上传文件到FTP 服务器。

参数说明:

LocalFullPath: 本地带有完整路径的文件名

RemoteFileName: 要在FTP 服务器上面保存文件名

OverWriteRemoteFile: 是否覆盖远程服务器上面同名的

文件

UploadFileAsync(byte [] FileBytes,

string RemoteFileName) 异步上传文件到FTP 服务器。

参数说明:

FileBytes: 上传的二进制数据

RemoteFileName: 要在FTP 服务器上面保存文件名

UploadFileAsync(byte [] FileBytes,

string RemoteFileName, bool

OverWriteRemoteFile) 异步上传文件到FTP 服务器。

参数说明:

FileBytes: 文件二进制内容

RemoteFileName: 要在FTP 服务器上面保存文件名

OverWriteRemoteFile: 是否覆盖远程服务器上面同名的

文件

ListFilesAndDirectories()

列出FTP 服务器上面当前目录的所有文件和目录。 ListFiles() 列出FTP 服务器上面当前目录的所有文件。

ListDirectories()列出FTP服务器上面当前目录的所有的目录。

DirectoryExist(string RemoteDirectoryName)判断当前目录下指定的子目录是否存在。参数说明:

RemoteDirectoryName: 指定的目录名

FileExist(string RemoteFileName)判断一个远程文件是否存在服务器当前目录下面。参数说明:

RemoteFileName: 远程文件名

DeleteFile(string RemoteFileName)从FTP服务器上面删除一个文件。参数说明:

RemoteFileName: 远程文件名

ReName(string RemoteFileName, string NewFileName)更改一个文件的名称或一个目录的名称。参数说明:

RemoteFileName: 原始文件或目录名称NewFileName: 新的文件或目录的名称

CopyFileToAnotherDirectory(string RemoteFile, string DirectoryName)把当前目录下面的一个文件拷贝到服务器上面另外的目录中,注意,拷贝文件之后,当前工作目录还是文件原来所在的目录。

参数说明:

RemoteFile: 当前目录下的文件名

DirectoryName: 新目录名称。

说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ;

如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。

如:./NewDirectory/SubDirectory1/SubDirectory2

MoveFileToAnotherDirectory(string RemoteFile, string DirectoryName)把当前目录下面的一个文件移动到服务器上面另外的目录中,注意,移动文件之后,当前工作目录还是文件原来所在的目录。

参数说明:

RemoteFile: 当前目录下的文件名

DirectoryName: 新目录名称。

说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ;

如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。

如:./NewDirectory/SubDirectory1/SubDirectory2

MakeDirectory(string DirectoryName)在FTP服务器上当前工作目录建立一个子目录。参数说明:

DirectoryName: 子目录名称

RemoveDirectory(string DirectoryName)从当前工作目录中删除一个子目录。参数说明:

DirectoryName: 子目录名称

IsValidPathChars(string DirectoryName)判断目录名中字符是否合法。参数说明:

DirectoryName: 目录名称

IsValidFileChars(string FileName)判断文件名中字符是否合法。

参数说明:FileName: 文件名称

GotoDirectory(string DirectoryName)进入一个目录。

参数说明:

DirectoryName:

新目录的名字。

说明:如果新目录是当前目录的子目录,则直接指定子目录。如: SubDirectory1/SubDirectory2 ;

如果新目录不是当前目录的子目录,则必须从根目录一级一级的指定。

如:./NewDirectory/SubDirectory1/SubDirectory2

EnterOneSubDirectory(string DirectoryName)从当前工作目录进入一个子目录。参数说明:

DirectoryName: 子目录名称

ComeoutDirectory()从当前工作目录往上一级目录。

公共事件

名称说明

DownloadProgressChanged异步下载进度发生改变触发的事件DownloadDataCompleted异步下载文件完成之后触发的事件UploadProgressChanged异步上传进度发生改变触发的事件UploadFileCompleted异步上传文件完成之后触发的事件

其他说明

说明

1支持代理服务器。

可以显式地给Proxy属性赋值;也可以在构造函数中传递Proxy对象。如果代理需要登录用户和密码,则设置Proxy的Credentials属性,例如:

Proxy.Credentials = new NetworkCredential(UserName, Password)

如果没有代理,则无需给Proxy属性赋值或者在构造函数中无需传递Proxy参数。

2下载文件和上传文件大小最大受Int32.MaxValue限制,所以最大处理只能是2,147,483,647字节。如果您想处理更大的文件,请自己修改代码中对文件打开和读写操作部分的代码使其适应您的要求。

3只有在异步上传文件或者异步下载文件的时候,才支持进度百分比触发事件和下载(上传)完成事件。

4由于服务器未发送文件大小,因此被动 FTP 文件传输总是将进度百分比显示为零。若要显示进度,可以通过重写

[url=ms-help://MS.VSCC.v80/MS.MSDN.v80/https://www.doczj.com/doc/1715488374.html,DEVFX.v20.chs/cpref10/h tml/M_System_Net_WebClient_GetWebRequest_1_de465cc1.htm]GetWebReques t[/url] 虚拟方法来将 FTP 连接更改为活动状态。所以,我们在clsFTP类中另外使用内部类MyWebClient

5在列出文件和目录的时候,clsFTP类区分出了所获得的响应数据哪些是文件,哪些是目录。同时,考虑到了FTP服务器上面目录样式为MS DOS和UNIX两种表现形式的不同。

6支持在FTP服务器上面不同目录之间移动文件和拷贝文件的功能。移动文件的方法比较巧妙,只是拷贝文件所使用的方法不太理想。

全部源码:

using System;

using https://www.doczj.com/doc/1715488374.html,;

using System.IO;

using System.Text;

using https://www.doczj.com/doc/1715488374.html,.Sockets; ///

/// FTPC 的摘要说明。

///

public class FTPC

{

#region 构造函数

///

/// 缺省构造函数

///

public FTPC()

{

strRemoteHost = "";

strRemotePath = "";

strRemoteUser = "";

strRemotePass = "";

strRemotePort = 21;

bConnected = false;

} ///

/// 构造函数

///

///

///

///

///

///

public FTPC(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)

{

try

{

strRemoteHost = remoteHost;

strRemotePath = remotePath;

strRemoteUser = remoteUser;

strRemotePass = remotePass;

strRemotePort = remotePort;

Connect();

}

catch (Exception ex)

{

throw ex;

}

}

#endregion

#region 登陆

///

/// FTP服务器IP地址

///

private string strRemoteHost; public string RemoteHost

{

get

{

return strRemoteHost;

}

set

{

strRemoteHost = value;

}

}

///

/// FTP服务器端口

///

private int strRemotePort; public int RemotePort

{

get

{

return strRemotePort;

}

set

{

strRemotePort = value;

}

}

///

/// 当前服务器目录

///

private string strRemotePath; public string RemotePath

{

get

{

return strRemotePath;

}

set

{

strRemotePath = value;

}

}

///

/// 登录用户账号

///

private string strRemoteUser;

public string RemoteUser

{

set

{

strRemoteUser = value;

}

}

///

/// 用户登录密码

///

private string strRemotePass;

public string RemotePass

{

set

{

strRemotePass = value;

}

} ///

/// 是否登录

///

private Boolean bConnected;

public bool Connected

{

get

{

return bConnected;

}

}

#endregion

#region 链接

///

/// 建立连接

///

public void Connect()

{

try

{

socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);

// 链接

try

{

socketControl.Connect(ep);

}

catch (Exception)

{

throw new IOException("Couldn't connect to remote server");

} // 获取应答码

ReadReply();

if (iReplyCode != 220)

{

DisConnect();

throw new IOException(strReply);

} // 登陆

SendCommand("USER " + strRemoteUser);

if (!(iReplyCode == 331 || iReplyCode == 230))

{

CloseSocketConnect();//关闭连接

throw new IOException(strReply);

}

if (iReplyCode != 230)

{

SendCommand("PASS " + strRemotePass);

if (!(iReplyCode == 230 || iReplyCode == 202))

{

CloseSocketConnect();//关闭连接

throw new IOException(strReply);

}

}

bConnected = true; // 切换到目录

if (strRemotePath != "")

{

ChDir(strRemotePath);

}

}

catch(Exception ex)

{

throw ex;

}

}

///

/// 关闭连接

///

public void DisConnect()

{

if (socketControl != null)

{

SendCommand("QUIT");

}

CloseSocketConnect();

}

#endregion

#region 传输模式///

/// 传输模式:二进制类型、ASCII类型

///

public enum TransferType { Binary, ASCII }; ///

/// 设置传输模式

///

/// 传输模式

public void SetTransferType(TransferType ttType)

{

if (ttType == TransferType.Binary)

{

SendCommand("TYPE I");//binary类型传输}

else

{

SendCommand("TYPE A");//ASCII类型传输}

if (iReplyCode != 200)

{

throw new IOException(strReply);

}

else

{

trType = ttType;

}

}

///

/// 获得传输模式

///

/// 传输模式

public TransferType GetTransferType()

{

return trType;

}

#endregion

#region 文件操作

///

/// 获得文件列表

///

/// 文件名的匹配字符串

///

public string[] Dir(string strMask)

{

// 建立链接

if (!bConnected)

{

Connect();

} //建立进行数据连接的socket

Socket socketData = CreateDataSocket();

//传送命令

SendCommand("NLST " + strMask);

//分析应答代码

//550 没有文件或目录

if (iReplyCode == 550)

{

return new string[] { };

}

if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226)) {

throw new IOException(strReply);

}

//获得结果

strMsg = "";

DateTime timeout = DateTime.Now.AddSeconds(this.timeoutSeconds);

while (timeout > DateTime.Now)

//while (true)

{

int iBytes = socketData.Receive(buffer, buffer.Length, 0);

strMsg += ASCII.GetString(buffer, 0, iBytes);

if (iBytes < buffer.Length)

{

break;

}

}

char[] seperator = { '\n' };

string[] strsFileList = strMsg.Split(seperator);

socketData.Close();//数据socket关闭时也会有返回码

if (this.strMsg == "")

strsFileList = new string[] { };

if (iReplyCode != 226)

{

ReadReply();

if (iReplyCode != 226)

{

throw new IOException(strReply);

}

}

return strsFileList;

}

///

/// 获取文件大小

///

/// 文件名

/// 文件大小

private long GetFileSize(string strFileName)

{

if (!bConnected)

{

Connect();

}

SendCommand("SIZE " + Path.GetFileName(strFileName));

long lSize = 0;

if (iReplyCode == 213)

{

lSize = Int64.Parse(strReply.Substring(4));

}

else

{

throw new IOException(strReply);

}

return lSize;

}

///

/// 删除

///

/// 待删除文件名 public void Delete(string strFileName)

{

{

Connect();

}

SendCommand("DELE " + strFileName);

if (iReplyCode != 250)

{

throw new IOException(strReply);

}

}

///

/// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)

///

/// 旧文件名

/// 新文件名

public void Rename(string strOldFileName, string strNewFileName) {

if (!bConnected)

{

Connect();

}

SendCommand("RNFR " + strOldFileName);

if (iReplyCode != 350)

{

throw new IOException(strReply);

}

// 如果新文件名与原有文件重名,将覆盖原有文件

SendCommand("RNTO " + strNewFileName);

if (iReplyCode != 250)

{

throw new IOException(strReply);

}

}

#endregion

#region 上传和下载

///

/// 下载一批文件

///

/// 文件名的匹配字符串 /// 本地目录(不得以\结束) public void Get(string strFileNameMask, string strFolder)

{

if (!bConnected)

{

}

string[] strFiles = Dir(strFileNameMask);

foreach (string strFile in strFiles)

{

if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串

{

Get(strFile, strFolder, strFile);

}

}

}

///

/// 下载一个文件

///

/// 要下载的文件名

/// 本地目录(不得以\结束)

/// 保存在本地时的文件名

public void Get(string strRemoteFileName, string strFolder, string strLocalFileName) {

if (!bConnected)

{

Connect();

}

SetTransferType(TransferType.Binary);

if (strLocalFileName.Equals(""))

{

strLocalFileName = strRemoteFileName;

}

if (!File.Exists(strFolder + "\\" + strLocalFileName))

{

Stream st = File.Create(strFolder + @"\" + strLocalFileName);

st.Close();

}

FileStream output = new

FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);

Socket socketData = CreateDataSocket();

SendCommand("RETR " + strRemoteFileName);

if (!(iReplyCode == 150 || iReplyCode == 125

|| iReplyCode == 226 || iReplyCode == 250))

{

throw new IOException(strReply);

}

while (true)

{

int iBytes = socketData.Receive(buffer, buffer.Length, 0);

output.Write(buffer, 0, iBytes);

if (iBytes <= 0)

{

break;

}

}

output.Close();

if (socketData.Connected)

{

socketData.Close();

}

if (!(iReplyCode == 226 || iReplyCode == 250))

{

ReadReply();

if (!(iReplyCode == 226 || iReplyCode == 250))

{

throw new IOException(strReply);

}

}

}

///

/// 上传一批文件

///

/// 本地目录(不得以\结束)

/// 文件名匹配字符(可以包含*和?) public void Put(string strFolder, string strFileNameMask)

{

string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);

foreach (string strFile in strFiles)

{

//strFile是完整的文件名(包含路径)

Put(strFile);

}

}

///

/// 上传一个文件

///

/// 本地文件名

public void Put(string strFileName)

{

if (!bConnected)

{

Connect();

作业5 抽象与封装三

作业五抽象与封装三 确定以下代码段中是否存在错误,如果有错误,指出是逻辑错误还是语法错误,请在程序中用“绿色”标出错误的地方,并在每个练习的空白处写下正确的代码。如果代码中没有错误,则在答案中写上“没有错误”。注意:在每个程序段中可能包含多处错误。 问题1 、以下代码定义了Product类,它有一个不带参数的构造方法,将产品的名称设置为一个空的String,将price设置为0.00;该类还有一个toProductString方法,它返回一个包含产品的name和price的String import java.text.*; public class Product{ private String name; private double price; private static DecimalFormat money=new DecimalFormat("$0.00"); public Product() { name=" "; price=0.00; } Public String toProductString() { return name+" costs "+money.format(price); } }//end class Product 答案:没有错误 问题2 、如下代码定义了Product类的另一个构造方法,它有2个参数,并将这些参数赋给相应的实例变量 public Product(String name, double price) { name= name; price=price; } 答案: https://www.doczj.com/doc/1715488374.html,= name; this.price=price; 若类的构造方法中的参数与类的实例变量命名为相同的名称,在成员方法中引用的变量名为局部变量,若想引用视力变量就要加上this 问题3、如下代码定义了两个set方法,用于设置Product类的name和price

第6章_抽象、封装与类

第六章抽象、封装与类主要内容 ?一、抽象与封装 二、J a v a的类 三、对象的创建与使用 四、参数传递 五、匿名对象 1、抽象 抽象内涵 去除掉对象中与主旨无关的次要部 分,或是暂时不予考虑的部分 抽取出与研究工作有关的实质性的 内容加以考察 软件开发方法中所使用的抽象类型 (1)过程抽象 (2)数据抽象

(1)过程抽象 将整个系统功能划分为若干部分,强调功能完成的过程和步骤 面向过程的软件开发方法采用的就 是这种抽象方法 使用过程抽象有利于控制、降低整个 程序的复杂度 缺点:这种方法本身自由度较大,难 于规范化和标准化,操作起来有一定 难度,在质量上不易保证 (2)数据抽象 2、封装 利用抽象数据类型将数据和操作封装在一起 数据被保护在抽象数据类型的内部 系统其他部分只能通过被授权操作 与抽象数据交互 在面向对象程序设计中 抽象数据类型通过“类”来代表

每个类都封装相关的数据和操作 在实际开发过程中 类常用来构建系统内部的模块 ?封装特性把类内的数据保护得很严密, 模块与模块间仅通过严格控制的界面进 行交互 ?使它们之间耦合和交叉大大减少,从而 降低了开发过程的复杂性,提高了效率 和质量,减少了可能的错误 保证程序中数据的完整性和安全性主要内容 一、抽象与封装 ?二、J a v a的类 三、对象的创建与使用 四、参数传递 五、匿名对象 二.J a v a的类 ?1.J a v a类概念

2.类的定义与修饰 3.域 4.方法 1、J a v a类概念 类(C l a s s)和对象(O b j e c t)是面向对象程序设计方法中最核心的概念。 类是对某一类事物的描述(共性),是 抽象的、概念上的定义; 对象则是实际存在的属该类事物的 具体的个体(个性),因而也称为实 例(I n s t a n c e)。 1、J a v a类概念 类是J a v a程序的基本组成要素 封装了一类对象的状态和方法,是该 类对象的原型 J a v a程序设计就是定义类的过程

抽象、封装与类(一)

抽象、封装与类(一) 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验项目名称 抽象、封装与类(一) 二、实验目的 1、熟练掌握如何自定义一个类。 2、熟练掌握如何定义构造函数,如何创建对象。 三、实验基本原理 在计算机技术的软件开发方法中所使用的抽象有两类:一类是过程抽象,另一类是数据抽象。 过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。面向过程的软件开发方法采用的就是这种抽象方法。数据抽象是与过程抽象不同的抽象方法,它把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包括了针对这些数据的授权操作,是相对于过程抽象更为严格、也更为合理的抽象方法。 封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能够与这个抽象数据类型交流和交互。封装使得抽象数据类型对内成为一个结构完整,可自我管理、自我平衡、高度集中的整体;对外则是一个功能明确、接口单一、可在各种合适的环境下都能独立工作的右击的单元。 Java程序设计就是定义类的过程,但是Java程序中定义的类的数目和功能都是有限的,编程时还需要用到大量的系统定义好的类,即Java类库中的类。 类库是JAVA语言的重要组成部分。JAVA语言由语法规则和类库两部分组成,语法规则确定JAVA程序的书写规范;类库(或称为运行时库)则提供了JAVA 程序与运行它的系统软件(JAVA虚拟机)之间的接口。 创建对象:首先说明新建对象所属的类名,然后说明新建对象的名字,赋值号右边的NEW是为新建对象开辟内存空间的算符。 构造函数是与类同名的方法。 四、主要仪器设备及耗材 计算机一台、my Eclipse软件 五、实验步骤 (1)打开My Eclipse,新建工程和类。分别输入本实验的代码。 (2)按照需求,输入如下代码: P95~96:4-7、4-8、4-9(综合) 模仿例4-2,编写如下程序。 定义一个表示学生的类Student,包括属性“学号”、“班号”、“姓名”、“性别”、“年龄”;方法“获得学号”、“获得班号”、“获得姓名”、“获得性别”、“获得年龄”、“修改年龄”。 为Student类定义构造函数初始化所有属性,增加一个方法public String toString(),把Student类对象的所有属性信息组合成一个字符串输出。 在main()中创建Student类对象,测试自定义类。

实验7 抽象与封装综合应用

实验7 抽象与封装综合应用 抽象与封装综合应用 课程名称:面向对象程序设计实验 实验项目名称:实验7 抽象与封装综合应用 【实验目的】 1. 掌握高精度数值类BigInteger类的成员变量和方法的应用 2. 掌握Calendar、Date类在时间表示上的应用 3. 掌握类之间的主要关系:一般关联、聚集关联中的组合、分享关联;理解类关系中“整 体-部分”这个重要关联关系的设计策略与Java代码实现方法 【实验步骤】 1、编程实现:大整数的数值计算。编写一个Java应用程序,计算两个大整数的和、差、积和商,并计算一个大整数的因子个数。(部分源码参考讲义) import java.math.*; public class BigIntegerExample { public static void main(String args[]) { BigInteger n1=new BigInteger("987654321987654321987654321"), n2=new BigInteger("123456789123456789123456789"), result=null; //n1和n2做加法运算 result = 【代码1】,; //打印输出求和结果 System.out.print(" "+【代码2】 ); System.out.println("和:"+result.toString()); result = 【代码3】//n1和n2做减法运算 System.out.println("差:"+result.toString()); result = 【代码4】//n1和n2做乘法运算 System.out.println("积:"+result.toString()); result = 【代码5】//n1和n2做除法运算 System.out.println("商:"+result.toString()); BigInteger m = new BigInteger("1968957"),

C第3章规范标准答案

C++习题参考答案 第1章面向对象程序设计概论 一、名词解释 抽象封装消息 【问题解答】 面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。 面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。 消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。 二、填空题 (1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。 (2)结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法;而面向对象的程序设计方法,程序可表示为程序=对象+消息。 (4)结构化程序设计方法中的基本模块是过程;而面向对象程序设计方法中的基本模块是类。 (5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。 三、选择题(至少选一个,可以多选) (1)面向对象程序设计着重于( B )的设计。 A. 对象 B. 类 C. 算法 D. 数据 (2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做( C )。 A. 抽象 B. 继承 C. 封装 D. 多态 (3)在面向对象程序设计中,类通过( D )与外界发生关系。 A. 对象 B. 类 C. 消息 D. 接口 (4)面向对象程序设计中,对象与对象之间的通信机制是( C )。 A. 对象 B. 类 C. 消息 D. 接口 (5)关于C++与C语言的关系的描述中,( D )是错误的。 A. C语言是C++的一个子集 B. C语言与C++是兼容的 C. C++对C语言进行了一些改进 D. C++和C语言都是面向对象的 【结果分析】 C语言是面向过程的。C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。 (6)面向对象的程序设计将数据结构与( A )放在一起,作为一个相互依存、不可分割的整体来处理。 A. 算法 B. 信息 C. 数据隐藏 D. 数据抽象 (7)下面( A )不是面向对象系统所包含的要素。 A. 重载 B. 对象 C. 类 D. 继承

实验6 抽象与封装-3

实验6 抽象与封装-3 抽象与封装-3 课程名称:面向对象程序设计实验 实验项目名称:实验6 抽象与封装-3 学生姓名:专业:学号: 实验地点:实验日期:年月日 【实验目的】 1. 掌握Array 类的使用方式 2. 掌握String类和StringBuffer类的使用方式 3. 掌握Math类,掌握静态成员的使用方式 4. 掌握Calendar、Date类在时间表示上的应用 5.了解Integer类、Double类、Character类 6.熟悉重要JAVA API中类的成员变量和方法的应用。 【实验步骤】 1、编写一个Java应用程序,判断两个字符串是否相同,判断字符串的前缀、后缀是否和某个字符串相同,按照字典顺序比较两个字符串的大小关系,检索字符串,创建子字符串,将数字型字符串转换为数字,将字符串存放到数组中,用字符数组创建字符串。 public class StringExample { p ublic static void main(String args[]) { String s1=new String("you are a student"); String s2=new String("how are you"); if(【代码1】) // 使用equals方法判断s1与s2是否相同 { System.out.println("s1与s2相同"); } else { System.out.println("s1与s2不相同");

} String s3=new String("22030219851022024"); if(【代码2】) //判断s3的前缀是否是"220302"。 { System.out.println("吉林省的身份证"); } String s4=new String("你"), s5=new String("我"); if(【代码3】)//按着字典序s4大于s5的表达式。 { System.out.println("按字典序s4大于s5"); } else { System.out.println("按字典序s4小于s5"); } int position=0; String path="c:\\java\\jsp\\A.java"; position=【代码4】; //获取path中最后出现目录分隔符号的位置 System.out.println("c:\\java\\jsp\\A.java中最后出现\\的位 置:"+position); String fileName=【代码5】;//获取path中"A.java"子字符串。 System.out.println("c:\\java\\jsp\\A.java中含有的文件名:"+fileName); String s6=new String("100"), s7=new String("123.678"); int n1=【代码6】; //将s6转化成int型数据。 double n2=【代码7】; //将s7转化成double型数据。 double m=n1+n2; System.out.println(m); String s8=【代码8】; //String调用valuOf(int n)方法将m转化为字符串对象 position=s8.indexOf("."); String temp=s8.substring(position+1); System.out.println("数字"+m+"有"+temp.length()+"位小数") ; String s9=new String("ABCDEF"); char[] a=【代码9】; //将s9存放到数组a中。 【代码10】//采用for循环,输出a数组的各个字符。 } } (1)【代码1】 s1.equals(s2) (2)【代码2】 s3.startsWith("220302") (3)【代码3】 https://www.doczj.com/doc/1715488374.html,pareTo(s5) > 0

2.抽象和封装

抽象和封装 0.英语单词 1.抽象 我们需要设计一个电子宠物系统,其中领养宠物功能的详细需求如下: 根据控制台提示,输入领养宠物的昵称; 根据控制台提示,输入领养宠物的类型,有两种选择:狗狗和企鹅; 如果选择狗狗,要选择狗狗的品种,有两种选择:?聪明的拉布拉多犬?或?中华田园犬?如果选择类型,选择企鹅的性别:?Q仔?或?Q妹?。 所领养宠物的健康值默认是100,表示非常健康。 所领养的宠物和主人的亲密度是0,表示和主人不熟。 在控制台打印宠物信息,包括昵称、健康值、亲密度、品种或性别,表示领养成功。 领养成功后主人可以和狗狗玩接飞盘的游戏,也可以让狗狗看家;如果领养的是企鹅,主人可以和企鹅一起游泳,也可以和企鹅玩过家家的游戏。 根据上面的描述,进行分析和设计,找出类,设计类;并画出类图! 分析: 1)先找简单名词 2)再找修饰性名词 3)然后找动词 4)优化 类图 抽象时遵循的原则: 属性、方法的设臵是为了解决业务问题的;

关注主要属性、方法; 如果没有必要、勿增加额外的类、属性和方法。 2.类的定义 生活中描述事物无非就是描述事物的属性和行为,如人有身高、体重等属性,有说话、打球等行为。 Java中用类(class)来描述事物也是如此,属性:对应类中的成员变量,行为对应类中的成员函数。 定义类其实就是定义类的成员:成员变量和成员函数。 实例Dog.java Penguin.java 3.成员变量和局部变量的区别: 成员变量定义在类中,在整个类中都可以被访问; 成员变量随着对象的创建而建立,存在于对象所在的堆内存中; 成员变量都有默认初始值。 局部变量定义在局部范围内(方法内、语句或语句块内); 局部变量存在于栈内存中,局部变量只在所在的范围内有效,超出作用范围,变量所占内存就会被释放; 局部变量没有默认值,必须初始化。 实例: 成员变量的初始值 引用数据类型null 基本数据类型 byte short int long 0 float double 0.0 char ‘’ boolean false 4.创建和使用对象 1)创建对象的语句Dog dog = new Dog(); Penguin penguin = new Penguin(); 2)对象的内存结构 3)调用属性对象名.属性名 4)调用方法对象名.方法名 实例:Test.java 5.使用final定义常量 实例:Dog.java和Penguin.java的改进

抽象、封装与类(二)

抽象、封装与类(二) 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验项目名称 抽象、封装与类(二) 二、实验目的 1、熟练掌握属性的定义和静态属性、最终属性的使用。 2、熟练掌握方法的定义和静态方法、抽象方法、最终方法的使用。 三、实验基本原理 在计算机技术的软件开发方法中所使用的抽象有两类:一类是过程抽象,另一类是数据抽象。 过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。面向过程的软件开发方法采用的就是这种抽象方法。数据抽象是与过程抽象不同的抽象方法,它把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包括了针对这些数据的授权操作,是相对于过程抽象更为严格、也更为合理的抽象方法。 封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能够与这个抽象数据类型交流和交互。封装使得抽象数据类型对内成为一个结构完整,可自我管理、自我平衡、高度集中的整体;对外则是一个功能明确、接口单一、可在各种合适的环境下都能独立工作的右击的单元。 Java程序设计就是定义类的过程,但是Java程序中定义的类的数目和功能都是有限的,编程时还需要用到大量的系统定义好的类,即Java类库中的类。 类库是Java语言的重要组成部分。Java语言由语法规则和类库两部分组成,语法规则确定Java 程序的书写规范;类库,或称为运行时库,则提供了Java程序与运行的系统软件(JVM)之间的接口。系统定义的类虽然实现了许多常见的功能,但是用户程序仍然需要针对特定问题的特定逻辑来定义自己的类。用户程序定义自己的类有定义类头和定义类体两个步骤,其中类体又由属性(域)和方法组成。 四、主要仪器设备及耗材 计算机一台、my Eclipse软件 五、实验步骤 (1)打开My Eclipse,新建工程和类。分别输入本实验的代码。 (2)按照实验的需求,输入如下代码: 编写一程序,完成以下工作: 定义一个圆类Circle,成员变量有最终静态属性圆周率PI、半径radius,成员方法有自定义构造方法、获取半径getRadius()、修改半径updateRadius()、计算面积area() 。 再定义一个圆锥类Taper,成员变量有底bottom、高height,成员方法有自定义构造方法、获得底圆半径getBottomR()、修改底圆半径updateBottomR()、获得高getHeight()、修改高updateHeight()、计算体积volume()。 最后写一测试类,测试自定义圆类Circle、圆锥类Taper是否正确。 1、定义圆类Circle class Circle { static final double pi=3.1415926; private double radius;

java面向对象编程类的封装接口和基本类库练习题

面向对象编程基本知识练习 一、判断题 1.不需要定义类,就能创建对象。() 2.构造方法用于给类的private 实例变量赋值。() 3.对象一经声明就可以立即使用。() 4.在定义变量和方法时,必须清楚地在其面前标上访问权限修饰符。() 5.Java 程序中的参数传递都是把参数值传递给方法定义中的参数。() 6.在类定义中,成员访问权限修饰符不能多次出现。() 7.new 操作符动态地为对象按其指定的类型分配内存,并返回该类型的一个引用。() 8.类的方法通常设为public,而类的实例变量一般也设为public。() 9.构造方法在创建对象时被调用。() 10.通过点运算符与类对象的引用相连,可以访问此类的成员。() 11.声明为protected 的类成员只能被此类中的方法访问。() 12.同一个类的对象使用不同的内存段,但静态成员共享相同的内存空间。() 13.类的成员变量可以放在类体的任意位置。() 14.声明为protected 的类成员可以被此类作用域中的任何对象访问。() 15.没有返回值的方法可以用void 来表示,也可以不加。() 二、选择题 1. 下面对对象概念描述错误的是:( ) A 操作是对象的动态属性 B 任何对象都必须有继承性 C 对象间的通讯靠消息传递 D 对象是属性和方法的封装体 2.编译并运行下面的程序,运行结果为:( ) public class A { public static void main(String[] args) { A a=new A(); a.method(8); } void method(int i) { System.out.println(“int:“+i); } void method(long i) { System.out.println(“long:“+i); } } A 程序可以编译运行,输出结果为int:8 B 程序可以编译运行,输出结果为long:8

类的封装与继承习题

1.以下关于继承的叙述正确的是( C )。 A、在Java中类只允许单一继承 B、在Java中一个类只能实现一个接口 C、在Java中一个类不能同时继承一个类和实现一个接口 D、在Java中接口只允许单一继承 2.有继承关系时用到的关键字是(A )。( 2 分) A:extend B:extends C:implements D:implement 3:Java变量中,以下不属于复合类型的数据类型是( D)。( 2 分) A:类 B:字符型 C:数组型 D:接口 4:java中定义数组名为 abc,下面(B )可以得到数组元素的个数。( 2 分) A:( ) B: C:len(abc) D:ubound(abc) 5:下列说法正确的是(A )。( 2 分) A:编译后的Java源程序根据文件中定义的类和接口的个数产生相应个数的.class字节码文件。 B:Java语言的源文件中不是任何地方都可以加注释的。 C:一个文件中可以有多个访问权限为public的类。 D:含有main()方法的类可以为public的类,也可以为其他类。 6:在调用构造函数时(C )( 2 分) A:子类可以不加定义就使用父类的所有构造函数 B:不管类中是否定义了何种构造函数,创建对象时都可以使用默认构造函数C:先调用父类的构造函数 D:先调用形参多的构造函数 7:Java与C/C++比较说法错误的是(D)。( 2 分) A:Java不提供goto语句,所以也就没指定goto作为关键字。

B:Java没有指针。 C:Java没有联合和结构 D:Java只有单继承没有多重继承。 8:若需要定义一个类域或类方法,应使用( B)修饰符。( 2 分) A:static B:package C:private D:public 9:下列说法( C)是正确的。( 2 分) A:程序执行到break语句是一定会结束所有的循环 B:程序执行到continue语句时会结束当前循环 C:break语句和continue语句都可以和标签协同使用 D:continue语句和break语句的作用相同 10:以下说法正确的是(D )。( 2 分) A:每个Java类都至少有一个构造方法,如果没有则机器自动生成一个默认的构造方法。 B:如果类里定义了一个或多个构造方法,那么java也提供默认的构造方法 C:每个Java类中用户必须定义至少一个构造方法。 D:以上都不对 11:对封装的理解正确的是(A )。( 3 分) A:封装就是把对象的属性和行为结合成一个独立的单位。 B:封装就是把对象完全隐蔽起来,不让外界访问。 C:封装性是一个使用问题。 D:封装和抽象是一回事。 12:对成员的访问控制保护最强的是(C )。( 3 分) A:public B:缺省 C:private D:protected

对象、类、封装和接口的通俗解释

什么是类(Class) 面向对象的思想来源于对现实世界的认知。现实世界种类繁多,难于认识和理解。但是聪明的人们学会了把这些纷繁复杂的事物进行分类,从而使世界变得井井有条。比如我们由各式各样的具体的汽车抽象出“汽车”的概念,由形形色色的具体的猫抽象出“猫”的概念,由五彩斑斓的具体的鲜花抽象出“花类”的概念等。汽车、猫、花都代表着一类事物。每一类事物都有特定的状态,比如汽车的品牌、时速、马力、耗油量、座椅数;小猫的年龄、体重、毛色;鲜花的颜色、花瓣形状、花瓣数目,都是在描述事物的状态。每类事物也都有一定的行为,比如汽车启动、行驶、加速、减速、刹车、停车;猫捉老鼠;鲜花盛开。这些不同的状态和行为将各类事物区分开来。 面向对象编程也采用了类的概念,把事物编写成一个个“类”。在类中,用数据表示事物的状态,用函数实现事物的行为,这样就使编程方式和人的思维方式保持一致,极大的降低了思维难度。 什么是封装(Encapsulation) 制造汽车的过程中什么人最牛?当然不是焊钢板的,也不是装轮胎的,更不是拧螺丝的,而是设计汽车的工程师,因为他知道汽车的运行原理。但是我们开车时,需要知道汽车的运行原理吗?答案显然不需要。汽车的运行原理已经被伟大的工程师封装在汽车内部,提供给司机的只是一个简单的使用接口,司机操纵方向盘、刹车及各种按钮就可以灵活自如的开动汽车了。 与制造汽车相似,面向对象技术把事物的状态和行为的实现细节封装在类中,形成一个可以重复使用的“部件”。类一旦被设计好,就可以像工业部件一样,被成千上万的对其内部原理毫不知情的程序员使用。类的设计者相当于汽车工程师,类的使用者相当于司机。这样程序员就可以充份利用他人已经编写好的“部件”,而将主要精力集中在自己的专属领域。 对象是封装了数据和操作的程序块。所谓封装是为这个程序块建立显示的界面。其它对象只能向这个界面发消息,不能访问内部的私有数据和操作。比如我们要求某人“坐下”(发消息),某人接受消息后调整自己的肌肉、神经使自己坐下(操作),从而改变了他的状态(描述姿态的数据变了)。外界不必过问动用了哪几条神经,收缩了哪几块肌肉。 什么是接口(Interface) 司机操纵方向盘、刹车及各种按钮就可以灵活自如的使用汽车,同样,人们通过类的接口使用类。程序员在编写类时精心地为它设计接口,而设计良好的接口不但方便其他程序员使用,还有利于类的升级改造。 假设你是一个环保人士,最近你用节能的荧光灯代替了普通的白炽灯。白炽灯通过加热电阻丝照亮整个屋子;荧光灯则是激活空气中的某些分子的电子能而发光。虽然它们的原理不同,但是它们的功能却是一样的—照明。因为两种灯具有相同的接口,所以你只需拧下白炽灯,然后再拧上荧光灯即可,轻易的实现“零件”的更新换代。同样,在面向对象编程中,只要保持接口不变,你可以任意更

相关主题
文本预览
相关文档 最新文档