类的那些事(包含智能提示小图标,与对象的关系等)
2017-03-28 17:18
260 查看
C#类、对象、方法和属性详解http://www.cnblogs.com/q1092813103/p/5660367.html
一、什么是类?什么是对象?
类(Class)实际上是对某种类型的对象定义变量和方法的原型。它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。
简单地说,类是一种抽象的数据类型,是对一类对象的统一描述。在生活中,我们常常会把一组具有相同特性的事物归为一类,当然根据分类的标准不同,划分的类也是不相同的。汽车和人都是独立的类,它们都有各自的特点。汽车这个大类还可以分为卡车,公共汽车,和小轿车等各种小类。人可以分为男人和女人。将这些思想反映在编程技术中就产生了类的概念。
类是对象概念在面向对象编程语言中的反映,是相同对象的集合。类描述了一系列在概念上有相同含义的对象,为这些对象统一定义了编程语言上的属性和方法。
类是对某个对象的定义。它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。实际上它本身并不是对象,因为它不存在于内存中。当引用类的代码运行时,类的一个新的实例,即对象,就在内存中创建了。虽然只有一个类,但能从这个类在内存中创建多个相同类型的对象。
可以把类看作“理论上”的对象,也就是说,它为对象提供蓝图,但在内存中并不存在。从这个蓝图可以创建任何数量的对象。从类创建的所有对象都有相同的成员:属性、方法和事件。但是,每个对象都象一个独立的实体一样动作。例如,一个对象的属性可以设置成与同类型的其他对象不同的值。
类是C#能最为强大的数据类型。类定义了数据类型的数据和行为。
二、类和对象之间的关系
类是具有相同数据结构(属性)和相同操作功能(行为)对象的集合。对象就是符合某种类所产生的一个实例。对象与类的关系是:
对象的共性抽象为类,类的实例化就是对象。
类是一个抽象的概念,而对象是具体的,比如说车是一个类的话,张三的那辆奔驰车就是车这个类的一个实例,动物是一个类的话,李四的家养的那只猫就是动物类的一个对象实例。
人类就是一个类,这个类包含了所有人的共同属性,像有四肢,有名字,会吃喝拉撒,会睡觉等等。而实例就是这个人类的具体实现,比如叫张三的这个人就是人类的一个实例,张三有着人类的所有属性。张三是人类的一个实例,同样李四也是人类的一个实例,但是张三和李四是不同的,因为他们是人类的两个不同的实例,比如:张三的名字是“张三”,性别是“男”,而李四的名字是“李四”,性别是“女",他们虽然都有姓名,都有性别,但是其具体表现不同。
对象是类的一个实例,它具有确定的属性,如张三(人的实例)身高180,体重70公斤,大学本科,男,23岁,汉族。
人类只有一个,人类的实例可以有无数个,当然包括你我他。
对象可以被创建和销毁,但类是无所不在的(因为类是面向对象编程的基本组成单位)。
初学者往往混淆类和对象的关系,实际上它们之间是蓝图和产品的关系。类就是一张蓝图,它规定对象具有哪些特征。而对象就是根据这张蓝图生产出来的产品。同一个类产生的对象也是这样,它们具有同样的结构,却可能在某些特性上有不同之处。
例如,桌子是一个类,人们不断打造各种尺寸和风格(属性)的桌子(桌子的实例),打造桌子,又不断毁坏桌子,年复一年,旧的去了,新的又来,但桌子的概念没变,它是一个抽象的概念。应该称它为桌子类,以区别于打造的具体桌子。
类的那些事
编写更好的C#代码
http://www.cnblogs.com/gaochundong/archive/2013/06/03/practice_to_write_better_csharp_code.html
各种命名空间的解释:
此处仅举一例:
System.Data.OleDb 命名空间 https://msdn.microsoft.com/zh-cn/library/system.data.oledb(VS.80).aspx
“类视图”和“对象浏览器”图标https://msdn.microsoft.com/zh-cn/library/y47ychfe.aspx
“类视图”和“对象浏览器”显示一些图标,这些图标表示代码实体,例如命名空间、类、函数和变量。下表以图文并茂的形式说明了这些图标。
图标 | 说明 | 图标 | 说明 |
---|---|---|---|
命名空间 | 方法或函数 | ||
类 | 运算符 | ||
接口 | 属性 | ||
结构 | 字段或变量 | ||
Union | Event | ||
Enum | 常量 | ||
TypeDef | 枚举项 | ||
模块 | 映射项 | ||
扩展方法 | 外部声明 | ||
委托 | 错误 | ||
异常 | 模板 | ||
映射 | 未知 | ||
类型转发 |
信号图标
说明 |
---|
如果项目包含在源代码管理数据库中,则可能会显示其他信号图标来指示源代码管理的状态,如签入或签出。 |
图标 | 说明 |
---|---|
<无信号图标> | 公共。可从该组件内的任何地方访问或从任何引用它的组件访问。 |
受保护。可从包含类或类型内访问或从由包含类或类型派生的类或类型内访问。 | |
私有。仅可在包含类或类型内访问。 | |
密封。 | |
朋友/内部。仅可以从此项目内访问。 | |
快捷方式。对象的快捷方式。 |
Web应用程序每个页面类都会自动加上一个命名空间,而网站页面类不会。
Web应用程序的区别
1.页面的C#代码(后台文件代码)一旦发生修改,需要手动重新编译(生成)一下,生成新的网站程序集(.dll),否则不会运行新代码
2.再次强调,无论是【网站】,还是【网站应用程序】,最终还是被编译成程序集使用的。也就是说,我们所谓的【动态页面】(aspx/ashx)都是网站程序集里的类而已。
Web应用程序每个页面类都会自动加上一个命名空间,而网站页面类不会。
在c#中知道了要用的类怎么找它所对应的 命名空间? msdn里面有提示么?
c#中using system这些不是引用的类吗,怎么叫引用命名空间?
引入了命名空间,就可以直接使用这些名字 “空间内” 的 “类” 及其方法属性了
追问
那有时候system后面加个点然后又是一个字符串,那个代表引用的是什么
追答
比如 using System.Net.Sockets;
System 下的 Net 下的 Sockets
C#中的类是利用命名空间组织起来的。命名空间提供了一种从逻辑上组织类的方式,防止命名冲突。
server.mappath需要using什么命名空间
这样就可以用上了.
System.Web.HttpContext.Current.Server.MapPath()
在普通的CS文件中是不能直接用Server的,加命名空间也没有用,这能这么用,其他的request,response.cache.都是这样
using System;
using System.Xml;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using System.Web.UI.Page.Server;
using DBUtility;
using Model;
using System.Web;
using System.Web.UI;
namespace SQLServerDAL
{
class photoshowDAL
{
public void WriteXml()
{
System.Web.HttpContext.Current.Server.MapPath()
}
}
}
成员变量、实例变量、类变量、成员方法、实例方法、类方法的区别
简单来说:例如定义一个类:
class Text
{
public static int number;
public int temp;
}
如果你想访问temp属性,你就必须先创建一个Text的对象,才能访问:Text b = new Text();
b.temp;这就是实例成员变量。
而你想访问number的话,不用创建Text的实例就可以访问,就像这样:Text.number.这就是类成员变量。
主要区别就是访问是需不需要创建对象,而对于类成员变量,所有对象是共享一个变量的。
注意问题:
using newClasses;//已经打开类库,类库中有superUserInfo这个类。
执行语句: superUserInfo su1 = Session["userInfo"];
提示错误:错误 1 无法将类型“object”隐式转换为“newClass.superUserInfo”。存在一个显式转换(是否缺少强制转换?)
改成:superUserInfo su = (superUserInfo)Session["userInfo"];
问题解决!
显式转换、隐式转换
一般情况下,数据的类型的转换通常是由编译系统自动进行的,不需要人工干预,所以被称为隐式类型转换。但如果程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式转换。
目录
(强制的类型名)表达式
用于强行将“表达式”的值转换成“类型名”所表示的数据类型。例如,(int)4.2的结果是4;强制类型转换的目的是使表达式的值的数据类型发生改变,从而使不同类型数据之间的运算能够进行下去。
应用情况编辑
如果表达式仅是单个常量或变量,则常量或变量不必用圆括号括起来;但是如果是含有运算符的表达式,则必须利用括号将其统一,否则容易发生歧义。例如:
(float)(a+b)
(int)a+b
经强制类型转换后仅产生一个临时的、类型不同的数据继续参加运算,其常量、变量或表达式的原有类型以及原来数据值均不改变。例如:
int x;
(float)x;
此时x的值被强制转换位实型参与下一步的运算处理,但并不改变x类型的是整型。
由于类型转换将占用系统时间,过多的转换将降低程序的运行效率。再设计程序时应尽量选择好数据类型,以减少不必要的类型转换。
_______________________________________________________________________________
成员变量、实例变量、类变量、成员方法、实例方法、类方法的区别
类体的定义包括成员变量的定义和方法的定义。
1、成员变量包括实例变量和类变量;而成员方法包括实例方法、类方法,当然还有一种特殊的构造方法。
2、类变量、类方法就是类中的变量、方法,必须是静态的,要加static;故其又称静态变量、静态方法。
3、成员变量、成员方法是对象或实例中的变量、方法,不加static;
类变量:静态域,静态字段,或叫静态变量,它属于该类所有实例共有的属性,在内存中只有一个地方存储这个变量。而且所有的实例都可以修改这个类变量的值(前提是这个类变量没有被final修饰,否则是常量了),而且访问类变量的时候不用实例,直接用类就可以了。
类方法:和类变量一样,可以不用实例,直接用类就可以调用类方法。
实例变量:实例域,实例字段,或叫成员变量。
实例方法:或叫成员方法,必须先有实例,然后才能通过实例调用该实例方法。
使用方法:类方法可以直接调用类变量和类方法
类方法不可以直接调用实例变量和实例方法
类方法中没有this,因为没有实例,this不知道调用哪个实例
类方法可以从类里面直接访问类成员
实例方法可以调用类方法,访问类变量,但是不提倡这样做,会把类方法和类变量混淆成实例方法和实例变量
程序实例:
class AnIntegerNamedX {
int x; //这个是成员变量
public int x() { //成员方法
return x;
}
public void setX(int newX) { //成员方法
x = newX;
}
}
public class Practice{
public static void main(String args[]){
AnIntegerNamedX myX = new AnIntegerNamedX();
AnIntegerNamedX anotherX = new AnIntegerNamedX();
myX.setX(1);
anotherX.x = 2;
System.out.println("myX.x = " + myX.x());
System.out.println("anotherX.x = " + anotherX.x());
}
}
2:
class AnIntegerNamedX {
static int x; //这里写成static,结果就变成全是2了,因为类变量是被实例所共享的,包括myX和anotherX
调用anotherX时所有的所有实例都改变了。
public int x() {
return x;
}
public void setX(int newX) {
x = newX;
}
}
public class Practice{
public static void main(String args[]){
AnIntegerNamedX myX = new AnIntegerNamedX();
AnIntegerNamedX anotherX = new AnIntegerNamedX();
myX.setX(1);
anotherX.x = 2; //这里把X的值改成2,所有实例的X都是2了,因为类变量是被所有实例共享的,任何实
例都可以对类变量做最终的修改
System.out.println("myX.x = " + myX.x());
System.out.println("anotherX.x = " + anotherX.x());
}
}
3:同样的,当把那两个方法都加上static变成类方法的时候,会提示错误让你把X变成静态,是应为类方法不能直接访问实例变量!
类变量也叫静态变量,也就是在变量前加了static的变量; 实例变量也叫对象变量,即没加static的变量;区别在于:类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象;
C++中定义类的对象:用new和不用new有何区别?
举个简单的例子:
class Point
{
private:
int x;
int y;
public:
void Set(int a,int b)
{ x=a; y=b; }
void Print()
{ cout<<"("<<x<<","<<y<<")"<<endl; }
};
void main()
{
Point p1;
Point *p2=new Point();
p1.Set(1,2);
p2->Set(4,5);
p1.Print();
p2->Print();
delete p2;
}
对象p1,p2的定义方式有何本质不同?用哪种方式比较好?
p1有系统创建并释放,你不要担心会出现内存泄露,但是生命期只有在本区域的大括号内,出了大括号就没用了。P2是指针,要自己释放,用不好很危险,用好了功能强大,因为他可以赋值给全局的变量,一下子从局部变量变成全局变量,还能把对象作为函数返回值。
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
析构函数简介
以C++语言为例:[1] 析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显示的析构函数。
相关文章推荐
- 提示并显示EXE文件包含的图标
- 还原Wss3.0内容数据库时遇到:"ComputerName\Microsoft##SSEE 上的 WSS_Content 包含用户定义的架构。数据库在能够使用之前必须为空。请删除所有表、存储过程以及其他对象,或使用其他数据库。 " 的提示,无法加载内容数据库
- OOD沉思录 之 类和对象的关系--包含关系3
- OOD沉思录2 类和对象的关系--包含关系
- C#智能提示小图标
- sql2000备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象"的解决方法
- sqlserver2008设置表、存储过程等对象筛选出现“无法为该请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc) ”以及智能提示失效问题
- OOD沉思录 之 类和对象的关系--包含关系1
- 面向对象系统分析与设计专题<7>__UML用例图之泛化(generalization)、扩展(extend)和包含(include)关系
- SharePoint【ECMAScript对象模型系列】-- 02. 实现编写代码时的智能提示功能
- “数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象"的解决方法
- sql2000备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先使用“数据库属性”对话框的“文件”页或 ALTER AUTHORIZATION 语句将数据库所
- mx:states包含mx:AddChild 在切换时提示错误"TypeError: Error #1009: 无法访问空对象引用的属性或方法"的解决方法
- OOD沉思录 之 类和对象的关系--包含关系2
- GDI+中图形对象包含关系判断
- javascript调试测试,利用vs2008:智能对象类型感知,方法及属性提示;立即窗口调试等
- sql2000备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象。若要继续,请首先使用“数据库属性”对话框的“文件”页或 Alter AUTHORIZATION 语句将数据库
- sql2000备份的数据库还原到sql2005后,选择“数据库关系图”提示:此数据库没有有效所有者,因此无法安装数据库关系图支持对象"的解决方法
- Sharepoint学习笔记—ECMAScript对象模型系列-- 2、实现编写代码时的智能提示功能
- has-a关系——包含对象成员的类