Java-------類與對象の(2)

目錄

1.private實現封裝處理

2.類的構造方法


1.private實現封裝處理

1.1先舉個例子:這個例子會出現亂碼

class Person{
    String name;
    int age;
    double hb; //花唄
    public void getInfo(){
        System.out.printf("年齡爲:"+age+",姓名爲:"+name+"餘額爲:"+hb);
    }
}

public class FristClass{
    //一般把主函數稱爲客戶端
     public static void main(String[] args){
        Person per=new Person();
        per.name="馬雲爸爸";
        per.age=50;
        per.hb=10000000000000000.0;
        Person per1=new Person();
        per1.name="張三";
        per1.age=20;
        per1.hb=100;
        //per1.hb=-2000;  //會出現數字亂碼
        per.getInfo();
        per1.getInfo();
    }
}

總結:

若類中屬性直接暴露給對象操作,存在不安全問題(由於對象可以直接操作操作類中屬性,無法限制屬性是否正常設置)。

應使用private進行修飾(對屬性做封裝).

使用private修飾的屬性或方法,表示該屬性與方法只能在本類中直接使用,其他類無法直接使用private封裝的屬性或方法。

改正後的代碼如下:

class Person{
    String name;
    int age;
    private double hb; //花唄
    public void getInfo(){
        System.out.printf("年齡爲:"+age+",姓名爲:"+name+"餘額爲:"+hb);
    }
}

public class FristClass{
    //一般把主函數稱爲客戶端
     public static void main(String[] args){
        Person per=new Person();
        per.name="馬雲爸爸";
        per.age=50;
        per.hb=10000000000000000.0;
        Person per1=new Person();
        per1.name="張三";
        per1.age=20;
        //per1.hb=100;
        per1.hb=-2000;  
        per.getInfo();
        per1.getInfo();
    }
}

default權限就是在屬性或方法前啥也不寫.

class Person{
     String name;//在string中都沒有加public或private
}

Person類與name屬性都是default權限(包訪問權限,在同一個源文件中都可以訪問)

1.2若private封裝的屬性要被類的外部訪問,需要提供setter/getter方法

  • setter方法用於設置屬性值
  • getter方法用於取得屬性值
class Person{
    String name;
    int age;
    private double hb; //花唄
    public void getInfo(){
        System.out.printf("年齡爲:"+age+",姓名爲:"+name+"餘額爲:"+hb);
    }
    //hb的setter方法
    public void setHb(double b){
        if(b<0){
            hb=0.0;
            return;
        }else{
            hb=b;
        }
        hb=b;
    }
    //hbd的getter方法
    public double getHb(){
        return hb;
    }
}

public class FristClass{
    //一般把主函數稱爲客戶端
     public static void main(String[] args){
        Person per=new Person();
        per.name="張三";
        per.age=20;
        per.setHb(-2000);
        //per.setHb(2000); //輸出結果正常
        per.getInfo();
    }
}

3.類的設計原則:

  • 編寫類時,所有的屬性必須使用private封裝
  • 屬性若要被外部訪問,必須定義相應的getter與setter方法

2.類的構造方法

定義:構造方法是在使用關鍵字new實例化新的對象時調用的方法。

1.Person 2.per=3.new 4.Person();

1:類名稱

2:對象引用

3:在堆上開闢空間

4:構造方法(無參構造)

4.1構造方法特徵:

I.構造方法名稱必須與類名稱相同

***II.***構造方法沒有返回值類型聲明

//命名不規範的普通方法,必須通過對象調用
public void Person(){}
//無參構造,在對象產生時調用,與類同名,並沒有返回值類型聲明
public Person(){}

III.每個類中一定至少存在一個構造方法(若沒有明確定義,系統會生成一個默認的無參構造;若明確定義了構造方法,系統不再生成無參構造)

class Person{
    String name;
    int age;
    private double hb; //花唄
    //無參構造
    public Person(){
        System.out.println("*******");
    }
    public void getInfo(){
        System.out.printf("年齡爲:"+age+",姓名爲:"+name+"餘額爲:"+hb);
    }
    //hb的setter方法
    public void setHb(double b){
        if(b<0){
            hb=0.0;
            return;
        }else{
            hb=b;
        }
        hb=b;
    }
    //hbd的getter方法
    public double getHb(){
        return hb;
    }
}

public class FristClass{
    //一般把主函數稱爲客戶端
     public static void main(String[] args){
        Person per=new Person();
        per.name="張三";
        per.age=20;
        per.setHb(-2000);
        //per.setHb(2000); //輸出結果正常
        per.getInfo();
    }
}

 

java編譯器是根據程序結構來區分普通方法與構造方法的,所以在構造方法前沒有返回值類型聲明

構造方法的作用:

爲類中屬性初始化,避免多次的setter調用。

class Person{
   // //要調用兩次setter,因爲用了兩個private封裝
   // private String name;
   // private int age; 
    //有參構造,爲類中屬性初始化值,構造方法
    public Person(String n,int a){
        //當調用時實際上會將這兩句移到構造方法
        //裏,進行賦默認值初始化,再等於後邊賦的值
         private String name=null;
         private int age=0; 
        name=n;
        age=a;
    }

public class FristClass{
    //一般把主函數稱爲客戶端
     public static void main(String[] args){
       Person per=new Person("張三",20); //無參構造
       per,getInfo();
    }
}

構造重載:

一系列參數個數不同的構造方法。

class Person{
   //要調用兩次setter,因爲用了兩個private封裝
    private String name;
    private int age; 
    //有參構造,爲類中屬性初始化值,構造方法
    public Person(){
        Syatem.out.printly("*******");
    }
    public Person(String n){
        name =n;
    }
    public Person(String n,int a){
        name=n;
        age=a;
    }

public class FristClass{
    //一般把主函數稱爲客戶端
     public static void main(String[] args){
       Person per=new Person("張三",20); //無參構造
       per.getInfo();
       Person per1=new Person();//全是默認值,調用**那行
       Per1.getInfo();
       Person per2=new Person("李四");//調用有參構造
       per2.getInfo();
    }
}

本文完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章