1. 程式人生 > >類和物件(欄位=變數、方法=函式、方法過載、靜態成員、屬性、建構函式)

類和物件(欄位=變數、方法=函式、方法過載、靜態成員、屬性、建構函式)

一、類

類包括:欄位(用來儲存資料)、屬性(用來保護欄位,屬性的本質是兩個函式get和set)、建構函式(用來初始化物件,給物件的每一個屬性賦值)、函式(描述物件的行為)、索引器(以索引的方式去訪問物件)。

一個類都可以包含兩種成員:欄位(Field)與方法(Method)。

欄位即變數,方法即函式。
類的欄位一般代表類中被處理的資料,類的方法大多代表對這些資料的處理過程或用於實現某種特定的功能,方法中的程式碼往往需要訪問欄位儲存的資料。


宣告為public 的變數和函式可以被外界直接訪問,與此對應,private 的變數與函式,則為類的私有成員,只能由類自己使用。

二、欄位(變數)

欄位(Field)代表了類中的資料,在類的所有方法之外定義一個變數即定義了一個欄位。在變數之前可以加上public、private 和protected 表示欄位的訪問許可權。以下程式碼展示了在類Student 中定義的兩個公有欄位Age 和SN,外界可以通過類Student 建立的物件來讀取或設定這兩個欄位的值。
可以在定義欄位的同時給予一個初始值,如下所示:


三、方法(函式)

一個C#函式:

返回值型別 方法名(引數列表)
{
  語句1;
  語句2;
  //…
  return 表示式;
}

例:函式需要向外界返回一個值,由return 語句實現。

int Add(int x, int y)
{
  return x + y;
}

放在一個類中的函式(通常附加一個存取許可權修飾符如public 和private)稱為“方法(method)”。

如果一個函式沒有返回值或不關心其返回值,則將其返回值定義為void。

void f() //不返回任何值的函式
{
  語句1;
  語句2;
  //…
  return ; //在return後寫一個空語句
}

四、方法的定義與使用

訪問一個方法的最基本方式是通過類建立的物件。

public class MathOpt
{
  public int Add(int x, int y)
  {
     return x + y;
  }

}

class Program
{
  static void Main(string[] args)
  {
    //建立MathOpt類的物件
    MathOpt obj = new MathOpt();
    //通過物件呼叫類的方法,結果儲存在區域性變數中
    int result = obj.Add(100, 200);
  }
}

五、方法的過載

兩個構成過載(Overload)關係的函式必須滿足以下條件:
(1)函式名相同。
(2)引數型別不同,或引數個數不同。
需要注意的是,函式返回值型別的不同不是函式過載的判斷條件,另外,C#是區分大小寫的語言。
class MathOpt

{
  //整數相加
  public int Add(int x, int y)
  {
    return x + y;
  }
  //浮點數相加
  public double Add(double x, double y)
  {
    return x + y;
  }
}

過載函式的呼叫:

MathOpt mathobj = null; //定義MathOpt物件變數
mathobj = new MathOpt(); //建立物件

int IResult=mathobj.Add(100, 200); //呼叫類的整數相加方法

double FResult = mathobj.Add(5.5, 9.2); //呼叫類的浮點數相加方法
Console.WriteLine("100+200=" + IResult ); //輸出結果
Console.WriteLine("5.5+9.2=" + FResult ); //輸出結果

傳給方法的實參為整數時,呼叫引數型別為int 的Add(int,int)方法,傳給方法實參為浮點數時,將呼叫引數型別為double 的Add(double , double)方法。

六、類的靜態成員

如果在宣告時沒有加“static”關鍵字,則稱之為類的“例項方法(instancemethod)”。加了static 關鍵字的方法稱為“靜態方法(static method)”。

加了static 關鍵字的欄位稱為“靜態欄位(static field)”。

靜態方法在使用時不需要建立物件,而是按以下格式直接呼叫:


例:計算2的3次方

double ret = Math.Pow(2, 3);//,.NETFramework 將常用的數學函式放到了類Math 中

類的例項方法可以直接訪問類的公有靜態欄位,比如數學常數π 就是Math 類的公有靜態欄位,可以被用來計算圓周長:
//計算圓周長
double GetPerimeterOfCircle(Double radius)
{
return 2 * Math.PI * radius;
}

區分靜態成員與例項成員的典型例子:

class StaticMembers
{
public static int staticVar=0; //靜態欄位
public int dynamicVar=0;
public void increaseValue()
{
staticVar++;
dynamicVar++;
}
}

以下是測試程式碼:

static void Main(string[] args)
{
StaticMembers obj=null;
  //建立100個物件
  for (int i = 0; i < 100; i++)
  {
    obj = new StaticMembers();
    obj.increaseValue();

  }
//檢視靜態欄位與普通欄位的值
Console.WriteLine("dynamicVar=" + obj.dynamicVar);
Console.WriteLine("staticVar=" + StaticMembers.staticVar);
//程式暫停,敲任意鍵繼續
Console.ReadKey();
}

程式的執行結果:

dynamicVar=1
staticVar=100

因為類的靜態成員擁有以下特性:
類的靜態成員是供類的所有物件所共享的。
在本節示例中建立了100 個物件,每個物件擁有1 個dyanmicVar 欄位,一共有100 個dyanmicVar 欄位,這些欄位是獨立的,“互不干涉內政”。而staticVar 欄位僅有一個,為所
有物件所共享。因此,任何一個物件對staticVar 欄位的修改,都會被其他物件所感知。

類例項成員與靜態成員的訪問規則:

① 位於同一類中的例項方法可直接相互呼叫。
② 類的欄位(包括例項欄位和靜態欄位)可以被同一類中的所有例項方法直接訪問。
③類中的靜態方法只能直接訪問類靜態欄位。
上述規則中,需要特別注意在靜態方法中直接呼叫類的例項方法是非法的。

例如以下程式碼將無法通過編譯。

class StaticMembers
{

  public static int staticVar=0; //靜態欄位
  public static void staticFunc() //靜態方法
  {
    increaseValue(); //靜態方法中不能呼叫例項方法×
    dynamicVar++; //靜態方法中不能訪問例項欄位×
    staticVar++; //靜態方法可以訪問靜態欄位正確!
  }
  public int dynamicVar=0;
  public void increaseValue()
  {
    staticVar++;
    dynamicVar++;
  }
}

那麼,如何在靜態方法中訪問例項資料?
很簡單,可以在靜態方法中建立物件,通過物件來訪問即可。將靜態方法staticFunc()修改如下即可通過編譯:
public static void staticFunc() //靜態方法
{
  //在靜態方法中通過物件訪問類的例項成員
  StaticMembers obj = new StaticMembers();
  obj.increaseValue(); //呼叫例項方法,OK!
  obj.dynamicVar++; //訪問例項欄位,OK!
}

七、類的屬性是一種特殊的“欄位”。

在設計類時使用屬性(Property)可以保證只有合法的資料可以傳給物件。

例:

class Student
{

  private String _Name="姓名預設值";//定義一個私有的_Name 欄位

  public String Name//定義一個Name 屬性
  {
    get //讀
    {
      return _Name;
    }
    set //寫,使用隱含變數value
    {
      if (value.Length == 0)
      throw new Exception("名字不能為空");
      _Name = value;
    }
  }

}

class Program
    {
        static void Main(string[] args)
        {
            Student stu = new Student();
            Console.WriteLine("請輸入姓名");
            string value = Console.ReadLine();
            stu.Name = value;
            Console.WriteLine(stu.Name);//或Console.WriteLine(value);
            Console.ReadKey();
        }
    }

編寫屬性的方法如下:
(1)設計一個私有的欄位用於儲存屬性的資料;
(2)設計get 讀訪問器和set 寫訪問器存取私有欄位資料。
C#中還允許定義只讀屬性和只寫屬性。

八、建構函式(constructor)

當使用new 關鍵字建立一個物件時,建構函式被自動呼叫。在C#中,類的建構函式與類名相同,沒有返回值。

class A
{
  //類A的建構函式
  public A()
  {
  }
}
類的建構函式在以類為模板建立物件時被自動呼叫。建構函式一般用於初始化類的私有資料欄位。

相關推薦

物件(=變數方法=函式方法過載靜態成員屬性建構函式)

一、類 類包括:欄位(用來儲存資料)、屬性(用來保護欄位,屬性的本質是兩個函式get和set)、建構函式(用來初始化物件,給物件的每一個屬性賦值)、函式(描述物件的行為)、索引器(以索引的方式去訪問物件)。 一個類都可以包含兩種成員:欄位(Field)與方法(Method)

Scala教程(六)屬性物件

Scala教程(六)類、屬性和物件欄位 1 類(class) 1.1 定義類     Scala是一種純粹的面向物件程式語言,而又無縫地結合了命令式和函式式的程式設計風格。在面向物件的語言有

Sqlserver根據查詢表根據值查詢表的幾個方法

-------------Sqlserver根據欄位名稱查詢表(多個欄位值),例如查詢欄位名包含 ibatch和cbatch 的表 SELECT *FROM( SELECT t2.name  FROM syscolumns t1,sysobjects t2 WHERE t1

面向物件基礎物件繫結方法

一、面向物件程式設計 回顧:面向過程程式設計 是一種之前程式設計師們設計出來的比較好的程式設計方法,也是一種程式設計思想。 核心是過程二字,顧名思義,就是先幹什麼,再幹什麼,完成一個事情具有的所有步驟。 優點:複雜的流程簡單化,程式化,一步一步拆分,降低開發難度。 缺點:擴充套件性差, 不容易維護。 主要使用

java物件的記憶體佈局(二):利用sun.misc.Unsafe獲取的偏移地址讀取的值

在上一篇文章中,我們列出了計算java物件大小的幾個結論以及jol工具的使用,jol工具的原始碼有興趣的可以去看下。現在我們利用JDK中的sun.misc.Unsafe來計算下欄位的偏移地址,一則驗證下之前文章中的結論,再則跟jol輸出結果對比下。如何獲取sun.misc.

物件 - 方法的呼叫

  這個方法呼叫  列印的結果是  1  跟 2  :基本資料型別問題 解:change方法呼叫的時候 傳進去的引數屬於基本資料型別。 change方法在壓站執行的時候 只是重新賦值了  a 跟 b ;main方法執行完change的方法之後

物件】求1+2+3+...+n,要求不能使用乘除法forwhileifelseswitchcase等關鍵字及條件判斷語句(A?B:C)

題目描述: 求1+2+3+...+n,要求不能使用乘除法(數學公式)、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C). 分析:這道題雖然常用的方式都給禁掉了,但是可以使用我們c++學過的類和物件,通過使用類和靜態來完成。常規情況下,從1+到n,

物件——建構函式解構函式複製建構函式

類: 要宣告類,用class,注意區分大小寫。類含有成員屬性和方法。在宣告類的末尾要加分號; 物件: 宣告完類之後,它並不能對程式產生任何影響。只有依據類,例項化物件,才可以訪問類成員屬性和方法。 下面是類例項化物件、動態分配記憶體與變數的對比: double pi=3.14; int* p

JAVA程式設計基礎——物件(繼承多型)

一、單利模式 (1)單例類只能有一個例項; (2)單例類必須自己建立自己的唯一例項; (3)單例類必須給所有其他物件提供這個例項。 場景:一個類可以定義無數個物件,但是隻有一個例項。 1、餓漢式單利模式 package practise.test1030; //餓漢式單利模式

面向物件物件封裝---------私有privatethis關鍵字

1、面向物件和麵向過程 面向物件是讓誰幹什麼 面向過程是按什麼順序來幹(幹活過程都有參與) 所以在工作中,面向物件更好。 例如: 以打掃辦公室為例:面向過程就是將掃地、拖地、擦玻璃、擦門窗這幾件事情排好(做好)順序,先幹啥再幹啥,需要按照順序一件一件的參與幹活‘ 面向物件就是打掃衛生時,小李拖地,小楊擦玻璃,

1.面向過程程式設計 2.面向物件程式設計 3.物件 4.python 建立物件 如何使用物件 5.屬性的查詢順序 6.初始化函式 7.繫結方法 與非繫結方法

1.面向過程程式設計 面向過程:一種程式設計思想在編寫程式碼時 要時刻想著過程這個兩個字過程指的是什麼? 解決問題的步驟 流程,即第一步幹什麼 第二步幹什麼,其目的是將一個複雜的問題,拆分為若干的小的問題,按照步驟一一解決,也可以說 將一個複雜的問題,流程化(為其制定一個固定的實現流程),從而變得簡單化例如

面向物件思想:物件封裝建構函式

面向物件的特點: 面向物件是一種更符合我們思考習慣的思想,它可以將複雜的事件簡單化,並將我們從執行者變成指揮者。 面向過程-強調步驟 面向過程-強調物件,這裡的物件就是洗衣機。 面向物件的語

C#7種變數_物件_161017

靜態變數,帶有static,在它所在的類或者結構型別中被裝載後就儲存在記憶體中,如果沒有初始化賦值,預設是是它型別的預設值非靜態變數,不帶static的例項變數陣列元素值引數,引用引數輸出引數 :專門

djang模型中BinaryField的序列化輸出問題外來鍵問題

最近在專案開發時進行模型類設計時遇到了一些問題,在這裡和大家分享以下 1.BinaryField欄位的序列化輸出問題 專案經理的需求是將多個不同資料庫的查詢結果資訊存放到另一個關係型資料庫(比如mysql1)中,那麼多個數據庫的查詢資訊的欄位上,型別上都不相同,這導致我在儲存資料庫(mysq

Python基礎筆記_Day10_Python面向物件物件__init____str__訪問限制setget

Day10_Python面向物件、類和物件、init、str、訪問限制、set、get 10.01_Python語言基礎(面向物件思想)(理解) 10.02_Python語言基礎(類和物件)(掌握) 10.03_Python語言基礎(類的構成)(掌握) 10.04_Python語言基礎(

java面向物件物件,區域性變數成員變數,基本型別引用型別作為引數傳遞)

一.類和物件的區別 類是對某一類事物的抽象描述,而物件用於表示現實中該類事物的個體 可以將玩具模型看作是一個類,將一個個玩具看作物件,從玩具模型和玩具之間的關係便可以看出類與物件之間的關係。類用於描述多個物件的共同特徵,它是物件的模板。物件用於描述現實中的個體,它是類的例項 二.區域性變數和成員變數

C#中自定義控制元件隱藏基成員屬性方法事件)的方法

       編寫自定義控制元件時,總是繼承C#中提供的Control類,而Control類是C#中所有窗體控制元件的基類,裡面定義了大量的屬性、方法和事件,而很多基類成員在自定義控制元件中可能不需要,因為編寫者會希望在自定義控制元件中隱藏這些成員,避免使用者呼叫這些成員。

【C++物件】計算兩點間距離的兩種方法

使用類的組合(線段Line類中包含點Point類成員): #include <iostream> #include <cmath> using namespace std; //Point類的定義 class Point { public: Po

笨方法學Python—習題40:模組物件

Python是一種面向物件biancheng(OPP)語言。即,Python中有一種叫做類(class)的結構,通過它可用一種特殊的方式構造軟體。 模組和字典差不多 字典:一種將一個東西對應到另外一個的方式— 若有一個字典,其有一個叫‘apple’的鍵,想獲取值就需要: m

Mybatis-屬性資料庫對映方式

1. 通過XML對映檔案中的resultMap<mapper namespace="data.UserMapper"> <resultMap type="data.User" id="userResultMap"> <!-