class Person
{
//Person(){}//默認的空參數構造函數。
}
main()
{
Person p = new Person();//這就已經調用了Person類中的空參數的構造函數。
//類中有定義該構造函數嗎?有的。只要定義一個類,
//該類中默認就有一個空參數的構造函數,是編譯器編譯時添加到class文件中。
//注意:若是在類中自定義了構造函數,那麼默認的空參數構造函數編譯器就不添加了。
//原理:沒有定義對象的初始化過程,編譯器會添加一個默認的初始化過程。
// 若是定義了指定的對象初始化過程,默認的就不添加了。
}
class Person { private Person(){} } main() { Person p = new Person();//建立對象沒法初始化。 }
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關鍵字來記錄住對象的地址。並經過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能夠省略。 }
定義功能,判斷兩我的是不是同齡人。
//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); } }
結果