Java對象和類

java做爲一種面向對象的語言,是支持多態,繼承,封裝,抽象,類,對象,實例,方法,重載.html

該文章研究對象和類的概念.java

  • 對象:對象是類的一個實例(對象不是找個女友),有狀態和行爲。例如,一我的是一個對象,它的狀態有:膚色、名字、性別;行爲有:睡覺,、說話,吃等。
  • :類是一個模板,它描述一類對象的行爲和狀態。

下圖中男孩女孩爲類,而具體的每一個人爲該類的對象:程序員

java中的對象

什麼是對象(object):萬物皆對象:對象就是個體數組

經過上圖能夠認爲人就是對象,像生活中車,動物,植物等,這些均可以認爲是對象,並且這些對象都有本身的狀態和行爲編輯器

用車舉例,它的狀態有,品牌,顏色,行爲有,啓動,要玻璃窗等模塊化

對比現實對象和軟件對象,它們之間十分類似。工具

軟件對象也有狀態和行爲。軟件對象的狀態就是屬性,行爲經過方法體現。學習

在軟件開發中,方法操做對象內部狀態的改變,對象的相互調用也是經過方法來完成。this

Java中的類

類是對象的圖紙,模板,spa

經過下面一個簡單的類來理解下Java中類的定義:

public class people{ String breed; int age; String color; void eating(){ } void hungry(){ } void sleeping(){ } }

一個類能夠包含如下類型變量:

  • 局部變量:在方法、構造方法或者語句塊中定義的變量被稱爲局部變量。變量聲明和初始化都是在方法中,方法結束後,變量就會自動銷燬。
  • 成員變量:成員變量是定義在類中,方法體以外的變量。這種變量在建立對象的時候實例化。成員變量能夠被類中方法、構造方法和特定類的語句塊訪問。
  • 類變量:類變量也聲明在類中,方法體以外,但必須聲明爲static類型。

一個類能夠擁有多個方法,在上面的例子中:eating()、hungry()和sleeping()都是People類的方法。

類和對象之間的關係

類是對象的圖紙,模板.對象是類的實例化

重點在於如何構建這個藍圖,模板

如何去定義一個類,肯定類和類之間的關係,下面介紹構造方法

 構造方法

每一個類都有構造方法。若是沒有顯式地爲類定義構造方法,Java編譯器將會爲該類提供一個默認構造方法。

在建立一個對象的時候,至少要調用一個構造方法。構造方法的名稱必須與類同名,一個類能夠有多個構造方法。

對象新建的過程:Person p = new Person

 

從廣義的角度,構造器的做用:初始化:對對象使用以前進行信息的預處理

構造器的定義:

①構造方法的方法名必須與類名保持一致

②構造方法沒有返回值類型;構造方法返回的必定對象本體的內存地址

③構造方法僅僅容許使用訪問權限修飾符進行修飾

④系統給每個類都提供一個默認的空構造(沒有參數的構造方法),這個構造方法僅僅用來給各個屬性賦默認值

⑤默認的控構造只能在沒有任何手動定義的構造器的類中使用:若是手動定義了一個構造方法,默認的構造方法就失效

⑥在同一個類中,能夠存在多個構造器(構造器的重載)

方法的重載

java中如何區分兩個方法

①方法的調用者:方法的調用者一旦肯定,就可以根據調用者找到這個方法的歸屬

②方法名

③方法的形參列表

****注意:方法的返回值並不能用來區分兩個方法:一個方法在調用的時候,能夠接收返回值也能夠不接收,在不接收返回值的時候,就沒有辦法經過返回值(類型)區分兩個同名、相同形參列表、定義在同一個類中的方法

方法的重載定義:兩同一不一樣:在同一個類中,定義多個同名方法,使用不相同的形參列表進行區分

不一樣的形參列表

  ①形參列表的長度(形參的個數)

  ②形參的類型

  ③形參的順序

注意:

  • 重載方法參數必須不一樣:

               參數個數不一樣,如method(int x)與method(int x,int y)不一樣

              參數類型不一樣,如method(int x)與method(double x)不一樣g

              參數順序不一樣,如method(int x,double y)與method(double x,int y)不一樣

  •  重載只與方法名與參數類型相關與返回值無關

              如void method(int x)與int method(int y)不是方法重載,不能同時存在

  • 重載與具體的變量標識符無關

              如method(int x)與method(int y)不是方法重載,不能同時存在

區分方法

建立對象

對象是根據類建立的。在Java中,使用關鍵字new來建立一個新的對象。建立對象須要如下三步:

  • 聲明:聲明一個對象,包括對象名稱和對象類型。
  • 實例化:使用關鍵字new來建立一個對象。
  • 初始化:使用new建立對象時,會調用構造方法初始化對象。

下面是一個建立對象的例子

public class People{ public People(String name){ //這個構造器僅有一個參數:name
      System.out.println("人的名字是 : " + name ); } public static void main(String []args){ // 下面的語句將建立一個People對象
      Puppy p= new People( "tom" ); } }

編譯並運行上面的程序,會打印出下面的結果:

人的名字是 : tom

訪問實例變量和方法

經過已建立的對象來訪問成員變量和成員方法,以下所示:

/* 實例化對象 */ ObjectReference = new Constructor(); /* 訪問類中的變量 */ ObjectReference.variableName; /* 訪問類中的方法 */ ObjectReference.methodName();

實例

下面的例子展現如何訪問實例變量和調用成員方法:

public class People{ int peopleAge ; public People(String name){ // 這個構造器僅有一個參數:name
      System.out.println("人的名字是 : " + name ); } public void setAge( int age ){ peopleAge = age; } public int getAge( ){ System.out.println("人的年齡爲 : " + peopleAge ); return peopleAge ; } public static void main(String []args){ /* 建立對象 */ People myPuppy = new People( "tom" ); /* 經過方法來設定age */ myPeople.setAge( 2 ); /* 調用另外一個方法獲取age */ myPeople.getAge( ); /*你也能夠像下面這樣訪問成員變量 */ System.out.println("變量值 : " + myPeople.peopleAge ); } }

結果:

人的名字是 : tommy 人的年齡爲 : 2 變量值 : 2

源文件聲明規則

在本節的最後部分,咱們將學習源文件的聲明規則。當在一個源文件中定義多個類,而且還有import語句和package語句時,要特別注意這些規則。

  • 一個源文件中只能有一個public類
  • 一個源文件能夠有多個非public類
  • 源文件的名稱應該和public類的類名保持一致。例如:源文件中public類的類名是Employee,那麼源文件應該命名爲Employee.java。
  • 若是一個類定義在某個包中,那麼package語句應該在源文件的首行。
  • 若是源文件包含import語句,那麼應該放在package語句和類定義之間。若是沒有package語句,那麼import語句應該在源文件中最前面。
  • import語句和package語句對源文件中定義的全部類都有效。在同一源文件中,不能給不一樣的類不一樣的包聲明。

類有若干種訪問級別,而且類也分不一樣的類型:抽象類和final類等。這些將在訪問控制章節介紹。

除了上面提到的幾種類型,Java還有一些特殊的類,如:內部類、匿名類。

Java包

包主要用來對類和接口進行分類。當開發Java程序時,可能編寫成百上千的類,所以頗有必要對類和接口進行分類。

Import語句

在Java中,若是給出一個完整的限定名,包括包名、類名,那麼Java編譯器就能夠很容易地定位到源代碼或者類。Import語句就是用來提供一個合理的路徑,使得編譯器能夠找到某個類。

例如,下面的命令行將會命令編譯器載入java_installation/java/io路徑下的全部類

import java.io.*;

一個簡單的例子

在該例子中,咱們建立兩個類:Employee 和 EmployeeTest

首先打開文本編輯器,把下面的代碼粘貼進去。注意將文件保存爲 Employee.java。

Employee類有四個成員變量:name、age、designation和salary。該類顯式聲明瞭一個構造方法,該方法只有一個參數。

Employee.java 文件代碼:

import java.io.*; public class Employee{ String name; int age; String designation; double salary; // Employee 類的構造器
   public Employee(String name){ this.name = name; } // 設置age的值
   public void empAge(int empAge){ age = empAge; } /* 設置designation的值*/
   public void empDesignation(String empDesig){ designation = empDesig; } /* 設置salary的值*/
   public void empSalary(double empSalary){ salary = empSalary; } /* 打印信息 */
   public void printEmployee(){ System.out.println("名字:"+ name ); System.out.println("年齡:" + age ); System.out.println("職位:" + designation ); System.out.println("薪水:" + salary); } }

程序都是從main方法開始執行。爲了能運行這個程序,必須包含main方法而且建立一個實例對象。

下面給出EmployeeTest類,該類實例化2個 Employee 類的實例,並調用方法設置變量的值。

將下面的代碼保存在 EmployeeTest.java文件中。

EmployeeTest.java 文件代碼:

import java.io.*; public class EmployeeTest{ public static void main(String []args){ /* 使用構造器建立兩個對象 */ Employee empOne = new Employee("RUNOOB1"); Employee empTwo = new Employee("RUNOOB2"); // 調用這兩個對象的成員方法
      empOne.empAge(26); empOne.empDesignation("初級程序員"); empOne.empSalary(1000); empOne.printEmployee(); empTwo.empAge(21); empTwo.empDesignation("小白程序員"); empTwo.empSalary(500); empTwo.printEmployee(); } }

結果:

本身能夠敲一下鍵盤就知道了.........

對象在內存中的存在形式

Java vm內存:堆內存,棧內存

棧內存:隨時開闢,使用,回收-->Java中的方法在運行起來的時候

會分配一個專有的佔內存,方法運行結束,棧內存回收

堆內存:長久存在,用來存儲對象的本體的一個空間--》一個公共的內存空間

Person p = new Person();

P:對象引用,引用變量,對象名-》存在方法棧內存中

new Persoon();對象本體--> 堆內存

對象本體的空間開闢,賦值等過程是相對比較消耗時間和空間的,沒喲個對象本體,都是寶貴的資源,可以重用就重用,對象本體不該該被隨便的回收,應該將對象本體放在一個穩定的空間內,因此將對象本體放在堆內存 中

凡是以對象本體和飲用方式存在的變量,都是引用數據類型的:數組,類的對象

*****基本數據類型的變量都存儲在棧內存中,和對象本體不同

棧:存儲局部變量;堆:存儲new出來的數組或對象

對象的回收

當一個對象本體失去全部的引用的時候,這個對象本體就變成一個弱引用對象

JVM中提供一種機制——垃圾回收機制,垃圾回收器Garbage Collector

垃圾回收機制會按期掃描內存空間,找到全部的弱引用對象,對其回收

類的構成

類的構成:變量和方法

1.變量:

    按照位置進行劃分:

        全局變量:(屬性)

            按照靜態進行劃分

                靜態全局變量(類屬性)

                非靜態全局變量 (對象屬性)

        局部變量:

            定義在方法中的局部變量

            定義在代碼塊中的局部變量

            定義在方法參數列表中的形參(形式參數)

 

局部變量

局部變量的生命週期:

想要訪問一個局部變量,必須在這個局部變量的生命週期以內對其進行訪問,在生命週期以外,要麼這個變量還沒有開始,要麼這個變量的生命週期已經結束

形參(形式參數):

形參的生命週期貫穿整個方法

形參的傳遞機制:值傳遞:值的拷貝

對於基本數據類型:拷貝的是基本數據類型中的常量值,形參進行值得改變不會對實參的值發生影響

對於引用數據類型:拷貝的是引用變量中存儲的對象本體的地址,實參將地址拷貝給形參,實參和形參實際上指向的對象本體實際上是同一個,其中一個對這個地址所在的對象本體進行修改,你們都能看得見

全局變量:屬性(Filed)

生命在類之中、方法以外的變量

全局變量的生命週期:在整個類中有效

屬性:相關信息的描述,經過衆多的屬性的有機結合,就可以描述一個特定的羣體

靜態全局變量和非靜態全局變量:

靜態全局變量(類屬性):

①類屬性都是用static進行修飾

②做用:用來描述一個類的對象都具備並且值相同的屬性

③類屬性的值是所有對象共享的,若是有一個對象對類屬性進行修改,其餘對象的這個類型屬性的值也會發生變化

④類屬性儘可能經過靜態的方式進行訪問——經過類名的方式進行訪問:類屬性既能夠經過類名訪問也能夠經過對象名訪問

⑤類屬性的做用

  1。能夠用來記錄一個類的屬性信息

  2.記錄程序在運行過程中產生的中間值

  3.在類與類之間傳遞信息

 

非靜態全局變量(對象屬性)

①對象屬性都不用static修飾

②對象屬性的做用;用來描述一個類的對象都具備,可是值個性化的屬性

③對象屬性的值是對象獨享的,一個對象的對象屬性發生改變,其餘不會跟着發生改變 

④對象屬性只可以經過非靜態的方式進行訪問:對象屬性只能被對象名訪問,類名不可以訪問對象屬性

 

其餘:

類先定義在使用:用來new對象

Java中的命名法:駝峯命名

定義類、屬性、方法:

①命名儘可能使用英語單詞

②明明使用的單詞詞組可以描述這個類、屬性、方法的做用

③包名儘可能徹底使用小寫字母:字母、數字、下劃線  類名:若是一個類名由多個單詞組成,各個單詞的首字母大寫,若是出現縮寫,整個縮寫單詞都大寫:TestMyMD5  變量名和方法名:第一個單詞的首字母小寫,以後其餘單詞的首字母大寫

add()  addElement() eye eyeNumber  屬性的命名不容許使用數字做爲開頭

 

空對象:null

①null並不依賴於任何一個類,null不是任何類的對象,沒有任何一個類與null相對應

②可是任何一個類對象的引用變量均可以引用null String str = null;  Person p1 = null;  Car c1 = null;

③null或者指向null的引用變量不可以調用任何屬性和方法,不然會引發NullPointerException

2.方法:

 

方法:

 

    按照功能進行區分:

 

        main方法:

        通常方法:

            按照靜態與非靜態:

                靜態方法:

                非靜態方法:    

        構造方法

定義:一系列相關處理過程的集合

方法的原子性:功能的模塊化:在定義方法的時候,儘可能將功能差分紅不可再細分的子功能,大功能的完成取決於子功能呢的調用和配合

方法的內聚性和耦合性:高內聚,低耦合

內聚性:方法自行完成任務,儘可能不依賴於外界條件的性質

耦合性:方法完成一項任務須要依賴多少的外界條件

方法:

    按照功能進行區分:

        main方法:

        通常方法:

            按照靜態與非靜態:

                靜態方法:

                非靜態方法:    

        構造方法:

 

main方法:

Main方法是全部程序的入口,程序運行起來首先執行main方法,在經過main方法中對其餘方法的調用,達到運行程序的目的,

形參String[] args:外部程序命令集

在通常狀況下,args != null,args.length == 0

通常方法

方法定義的通常語法

Pubilc static void main(String[] args){}

[訪問權限修飾符][靜態修飾符][final修飾符][同步修飾符]...返回值類型 方法名(形參列表)[聲明異常拋出]

靜態方法:類方法

①使用static關鍵字進行修飾

②靜態方法的做用:靜態方法通常都是充當工具方法的做用,使用者僅關心這個方法的執行過程和執行結果,不必關心是誰提供的這個方法

④靜態方法(類方法)調用屬性:類方法只可以調用類屬性,不可以調用對象屬性

非靜態方法:對象方法

①對象方法不使用static修飾

②對象方法僅可以經過對象調用:對象方法的調用結果取決於調用者

③對象方法的做用:由於調用者不一樣可以引發運行結果的不一樣,這樣的方法應該聲明成對象方法

④對象方法訪問屬性:對象方法便可以訪問類屬性也能夠訪問對象屬性

 

 參數傳遞

參數傳遞,能夠理解當咱們要調用一個方法時,咱們會把指定的數值,傳遞給方法中的參數,這樣方法中的參數就擁有了這個指定的值,可使用該值,在方法中運算了。這種傳遞方式,咱們稱爲參數傳遞。

  • l  在這裏,定義方法時,參數列表中的變量,咱們稱爲形式參數
  • l  調用方法時,傳入給方法的數值,咱們稱爲實際參數

咱們看下面的兩段代碼,來明確下參數傳遞的過程:

 

public class ArgumentsDemo01 { public static void main(String[] args) { int a=5; int b=10; change(a, b);//調用方法時,傳入的數值稱爲實際參數
        System.out.println("a=" + a); System.out.println("b=" + b); } public static void change(int a, int b){//方法中指定的多個參數稱爲形式參數
        a=200; b=500; } }

結果:

a=5 b=10

再看另外一段代碼

public class ArgumentsDemo02 { public static void main(String[] args) { int[] arr = { 1, 2, 3 }; change(arr);// 調用方法時,傳入的數值稱爲實際參數
        
    for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public static void change(int[] arr) {// 方法中指定的多個參數稱爲形式參數
        for (int i = 0; i < arr.length; i++) { arr[i] *= 2; } } } 

程序的運行結果以下:

2
4
6

參數傳遞圖解

經過上面的兩段程序能夠得出以下結論:

  •   當調用方法時,若是傳入的數值爲基本數據類型(包含String類型),形式參數的改變對實際參數不影響
  •   當調用方法時,若是傳入的數值爲引用數據類型(String類型除外),形式參數的改變對實際參數有影響

 參考資料:http://www.runoob.com/java/java-object-classes.html

相關文章
相關標籤/搜索