java-面向對象-封裝-this-構造函數

概要圖

 

一 構造函數

需求:爲了描述事物更準確,發現事物對應的不少對象一建立時,
就有了,一些初始化的數據。在類中該如何完成的。
 
經過Java中的另外一個小技術完成:就是構造函數。對象自己就是構造出來,
構造時,須要作一些動做這些應該定義在函數內。
 

1.1 構造函數(Constructor)有什麼用?

能夠對對象建立進行初始化。
 

1.2 構造函數怎麼在代碼中體現呢?

1,沒有返回值類型。由於構造對象,建立完就結束,須要結果。void也不要寫,由於要有區別與通常函數。
2,構造函數名稱和類名一致。
3,沒有具體的返回值。
接下來,按照以上三點,在Person類中定義一個構造函數。
對象一建立就具有了姓名。
 
發現了問題?
沒有學習構造函數時,對象也建立出來了。那麼該對象是否有被構造呢?或者說是否有調用構造函數呢?
是的。必須調用!
那麼類中那個構造函數是什麼呢?
class Person
{
    //Person(){}//默認的空參數構造函數。
}
 
main()
{
    Person p = new Person();//這就已經調用了Person類中的空參數的構造函數。
                            //類中有定義該構造函數嗎?有的。只要定義一個類,
                            //該類中默認就有一個空參數的構造函數,是編譯器編譯時添加到class文件中。
                            //注意:若是在類中自定義了構造函數,那麼默認的空參數構造函數編譯器就不添加了。
                            //原理:沒有定義對象的初始化過程,編譯器會添加一個默認的初始化過程。
                            //      若是定義了指定的對象初始化過程,默認的就不添加了。
}

1.3 構造函數的細節:

1,一個類中能夠有多個構造函數,它們的存在是以重載的形式體現的。
2,構造函數中也是有return語句的, 用於結束初始化動做的。
3,構造函數是否能被private修飾呢?能,做用:其餘程序沒法建立該類的對象。
class Person
{
    private Person(){}
}
 
 
main()
{
    Person p = new Person();//建立對象沒法初始化。
}

1.4 構造函數和通常函數的區別?

1,寫法不同。不重要。
2,運行上有差異,對象一建立就會調用對應的構造函數。
    通常方法是對象建立後,纔會調用所需的通常函數。
問:有了構造函數初始化姓名,那麼還須要setName方法嗎?
須要,由於對象建立後,若是須要對數據進行修改,能夠經過set完成。
3,構造函數在對象建立時,僅調用一次(初始化動做只作一次,並且先執行)。通常方法能夠被對象調用屢次。
 
class Person
{
    //Person(){}
    void Person(){}//這是通常函數。但不要這些書寫,由於通常函數名稱有規範。
}
 
main()
{
    Person p = new Person();
}
 
 
*/
 
class Person
{
    //屬性:姓名,年齡。
    private String name;
    private int age;
    //一初始化,既沒有姓名,又沒有年齡。
    Person()
    {
        
    }
//    Person(int a)
//    {
//        if(a<0)
//            return;
//        age = a;
//    }
 
 
    //定義構造函數,對象一建立就具有姓名。
    Person(String n)
    {
        //將接收到的值賦值給對象的name
        name = n;
    }
 
    //一初始化既有姓名,又有年齡。
    Person(String n,int a)
    {
        name = n;
        age = a;
        
    }
    
    //行爲。
    public void speak()
    {
        System.out.println("name="+name+",age="+age);
    }
}
 
 
class PersonDemo2
{
    public static void main(String[] args)
    {
 
        Person p1 = new Person();
        
//        Person p = new Person("lisi");//對象建立時,必須會調用對應的構造函數,由於對象須要初始化。
    
//        Person p2 = new Person("wangwu",23);
        
    }
}

二 構造函數調用圖解

三 基本數據引用數據類型參數傳遞圖解 

 四 封裝

表現:
1,函數就是一個最基本封裝體。
2,類其實也是一個封裝體。java

從以上兩點得出結論:
好處:
1,提升了代碼的複用性。
2,隱藏了實現細節,還要對外提供能夠訪問的方式。便於調用者的使用。這是核心之一,也能夠理解爲就是封裝的概念。
3,提升了安全性。
它也是面向對象思想的特徵之一。
共有三個特徵:封裝,繼承,多態。安全


舉例:機箱。隱藏了辦卡設備的細節,對外提供了插口以及開關等訪問內部細節的方式。函數

*/學習

//描述人。Person
//屬性:年齡。
//行爲:說話:說出本身的年齡。測試

 

 

/*
總結:
類中不須要對外提供的內容都私有化,包括屬性和行爲。this

selectSort(int[] arr)
{
swap(
}

bubbleSort(int[] arr)
{
swap(
}

private swap(int[] arr,int a,int b)
{

}

  

重點:之後再描述事物,屬性都私有化,並提供setXxx getXxx方法對其進行訪問。spa

*/

class Person
{
//屬性:
private int age;//age就是被修飾爲了private私有。也就是被隱藏了。這就是封裝的一種體現。
//行爲:
void speak()
{
System.out.println("age="+age);
}

/*

  

年齡已被私有,錯誤的值沒法賦值,但是正確的值也賦值不了,不行。
咋辦,按照以前所學習的封裝的原理,隱藏後,還須要提供訪問方式。
經過方法的方式,讓其餘程序訪問到,就能夠了。更重要的是能夠在方法中加入邏輯判斷。

記住:對變量的訪問操做有兩個動做:賦值(設置 set),取值(獲取 get)
因此,對私有的變量訪問的方式就是 set變量 get變量--> setAge getAge3d

*/
//定義對age賦值的方法。
void setAge(int a)
{
//加入邏輯判斷。
if(a>0 && a<130)
age = a;
else
//	System.out.println("對不起,您的年齡數值 "+a+" 是非法的。");
//	throw new RuntimeException("對不起,您的年齡數值 "+a+" 是非法的。");//異常!一旦出現,程序結束。須要修正代碼。
}

//定義一個獲取age值的方法。
int getAge()
{
return age;
}

}

class PersonDemo
{
public static void main(String[] args)
{
//測試Person.class。
//建立對象。
Person p = new Person();

/*
賦值-20是能夠的,由於age屬性是int類型,可是確不符合現實生活中的事物。
怎麼解決這個問題呢?
不讓它訪問就哦了。怎麼在代碼上實現呢?須要使用一個Java中的關鍵字也是一個修飾符 private(私有,權限修飾符)
記住:私有僅僅是封裝的體現形式而已。

*/
//	p.age = -20;//age不能在person類之外的程序中直接訪問了。

//演示對age設置和獲取方法的體現。
p.setAge(-20);
int a = p.getAge();
System.out.println("a="+a);
//	p.speak();
}
}

五 this

5.1 當構造函數之間進行互相調用時,該如何解決呢?

構造函數是對象初始化時調用的。
給哪一個對象初始化呢?經過this關鍵字來記錄住對象的地址。並經過this來明確被初始化的對象。code

在構造函數中調用其餘構造函數的格式: this(實參列表);就會調用對應的構造函數。對象

小節:
this到底表明什麼呢?★★★★★
this就表明對象,表明哪一個對象呢?哪一個對象調用了this所在函數,this就表明哪一個對象

*/
class Person
{
private String name;
private int age;
Person()
{

}
//初始化姓名。
private Person(String n)
{

name = n;
}
//初始化姓名和年齡。既然有初始化姓名的動做。直接調用就能夠了。
Person(String n,int a)
{

this(n);//調用一個字符串參數的構造函數。注意:調用其餘構造函數的語句,
//必須定義在構造函數的第一行。緣由:初始化動做要先執行。
//	name = n;
age = a;
}


}

class PersonDemo3 
{
public static void main(String[] args) 
{
Person p = new Person("lisi",20);
Person p1 = new Person("lisi1",21);
}
}

 圖解

/*
this關鍵字的另外一個做用:
能夠用this標識哪一個變量是成員變量。這個標識能夠省略不寫。
可是,當局部變量和成員變量同名時,必須用this.來標識成員變量


*/

class Person
{
private String name;
private int age;

Person(String name,int age)
{
this.name = name;
this.age = age;
}
public void speak()
{
String name = "haha"; 
System.out.println("name="+this.name+",age="+this.age);
}
public void method()
{
this.speak();//this能夠省略。
}

  

5.2 練習

定義功能,判斷兩我的是不是同齡人。
//1,明確結果,boolean 2,明確未知內容,1個,Person類型。

public boolean equalsAge(Person pp)
{
/*
if(pp.age == this.age)//當函數中使用到了調用該函數的對象時,用this表示這個對象。
return true;
return false;
*/
//	return (pp.age == this.age)?true:false;
return pp.age == this.age;
}
}

  

 注意下面代碼的結果

class Person
{
    void show()
    {
        System.out.println(this);
    }
}
public class Test {

    public static void main(String[] args)  {
        Person p = new Person();
        p.show();
        System.out.println(p);
        
    }

}

結果

相關文章
相關標籤/搜索