类的那些事(包含智能提示小图标,与对象的关系等)

2024-01-04 14:38

本文主要是介绍类的那些事(包含智能提示小图标,与对象的关系等),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 枚举项符号 枚举项
Visual Studio 模块符号 模块 映射项符号 映射项
扩展方法符号 扩展方法 声明符号 外部声明
委托符号 委托 类视图和对象浏览器的“错误”图标 错误
异常符号 异常 模板符号 模板
映射符号 映射 错误感叹号符号 未知
“类型转发”符号 类型转发  

信号图标

以下信号图标适用于前面的所有图标,指示它们的可访问性。

System_CAPS_ICON_note.jpg 说明

如果项目包含在源代码管理数据库中,则可能会显示其他信号图标来指示源代码管理的状态,如签入或签出。

图标 说明
<无信号图标> 公共。可从该组件内的任何地方访问或从任何引用它的组件访问。
信号 Protected 符号 受保护。可从包含类或类型内访问或从由包含类或类型派生的类或类型内访问。
信号 Private 符号 私有。仅可在包含类或类型内访问。
信号 Sealed 符号 密封。
信号 Friend/Internal 符号 朋友/内部。仅可以从此项目内访问。
信号图标箭头 快捷方式。对象的快捷方式

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类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显示的析构函数。

这篇关于类的那些事(包含智能提示小图标,与对象的关系等)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/569647

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚