1. 程式人生 > 其它 >面向物件(5):封裝

面向物件(5):封裝

面向物件(5):封裝

例1、show方法表示列印全部成員變數

//定義一個學生類
 class Student02{
    //定義學生類中的成員變數
    String name;
    int age;
    //定義學生類中的成員方法
    //show方法表示打印出所有的成員變數,切記!
    public void show(){
        System.out.println("姓名:"+name+",年齡:"+age);
    }
}

//定義一個測試類
public class Test88 {
    public static void main(String[] args) {
        //建立學生物件
        Student02 cc = new Student02();
        //呼叫學生類中的show方法
        cc.show(); //因為未賦值,輸出為是null和0

        //給成員變數賦值
        cc.name = "偉神";
        cc.age = 18;
        //再次呼叫成員方法show
        cc.show();
    }
}

        執行結果:
                姓名:null,年齡:0
                姓名:偉神,年齡:18

                Process finished with exit code 0

例2、當給年齡賦值10000,再呼叫方法,不影響程式執行,但是10000歲不符合現實,這時候就需要加入判斷;

這個判斷就是,再新增一個成員方法,來控制著年齡

//定義一個學生類
 class Student02{
    //定義學生類中的成員變數
    String name;
    int age;

    //新增一個判斷方法
    public void setAge(int x){
        if(x>0 && x<=100){
            age = x;    //如果滿足條件,就將x賦值給age
        }else{
            System.out.println("年齡輸入有誤");
        }
    }
    //定義學生類中的成員方法
    //show方法表示打印出所有的成員變數,切記!
    public void show(){
        System.out.println("姓名:"+name+",年齡:"+age);
    }
}

//定義一個測試類
public class Test88 {
    public static void main(String[] args) {
        //建立學生物件
        Student02 cc = new Student02();
        //呼叫學生類中的show方法
        //因為未賦值,輸出為是null和0
        cc.show();

        //給成員變數賦值
        cc.name = "偉神";
        cc.age = 18;
        //再次呼叫成員方法show
        cc.show();
        System.out.println("=====================");
        //假如我們給年齡賦值10000
        //呼叫判斷的方法,直接將引數寫成10000即可
        cc.setAge(10000);
        cc.show();
        System.out.println("======================");
        //假如給年齡賦值98
        cc.setAge(98);
        cc.show();
    }
}

        執行結果如下:
                姓名:null,年齡:0
                姓名:偉神,年齡:18
                =====================
                年齡輸入有誤
                姓名:偉神,年齡:18
                ======================
                姓名:偉神,年齡:98

                Process finished with exit code 0

3、通過例1、例2,雖然我們加入了一個方法傳參的形式去給成員變數進行賦值,並且在賦值的時候進行判斷;
但是呢,我偏偏不使用定義的方法,就使用物件名.成員變數的形式去賦值,依舊可以賦值一些不合理的值;

​ 如果有一個辦法可以讓外界不能直接訪問到成員變數就好了,這樣想要進行對成員變數賦值,就不能通過物件名.成員變數的形式去賦值,只能通過我們定義的方法去賦值。
這樣的方法,java提供了一個關鍵字給我們使用,這個關鍵字叫做:private(私有的)

使用private修飾的成員變數,在其他類中不能直接訪問

通過例1、例2,主要引出一個思想:面向物件的三大特徵之一:封裝

4、封裝

1、封裝的含義:實際上就是隱藏物件的屬性和相關實現細節,僅僅對外提供公共的(public)訪問的方式
2、封裝的好處:
		①隱藏實現細節,提供公共的訪問方式
		②提高了程式碼的複用性
		③提高安全性
3、封裝原則:
		①將不需要對外提供的內容都隱藏起來
		②把屬性隱藏,提供公共方法對其訪問
4、封裝中的private關鍵字介紹:
        ①是一個許可權修飾符
        ②可以修飾成員變數和成員方法
        ③被private修飾的成員只在本類中才能訪問
//定義一個人類
class Person{
    /*
    定義成員變數(之前的做法)
    String name;
    int age;
     */
//學過了private,在以後定義成員變數的時候,
// 前面必須加上private,這是規範
    private String name;
    private int age;

//我們需要提供一個公共的方法,可以讓外界可以獲取到成員變數,以及對成員變數可以賦值

//先對name來說,定義一個公共的方法,讓外界其他類可以對name進行賦值
    public void setName(String n){  //setName這個名字是統一的
        name = n;
    }
//對name來說,需要提供一個公共的方法,讓外界可以獲取到name
    public String getName(){  //外界呼叫getName的時候,可以接收一個String的值
        return name;          //接收的String的值,就是name
    }
//上面建立的公共set和get方法,可以讓外界對成員變數name,進行賦值和取值

    //根據上面,同理,age也是如此
    public void setAge(int a){
        age = a;
    }
    public int getAge(){
        return age;
    }

    //此外,還有提供一個方法,來輸出列印所有的成員變數
    public void show(){
        System.out.println("姓名:"+name+",年齡:"+age);
    }
}
        //這樣,一個標準規範的類就寫好了

//定義一個測試類
public class PrivateDemo {
    public static void main(String[] args) {
        //建立Person物件
        Person x = new Person();
        //被private修飾的成員變數無法直接被訪問,寫x.name;是錯誤的
        //只能呼叫公共的方法進行獲取(暫未賦值)
        String name = x.getName();
            int age = x.getAge();
        System.out.println(name+"======"+age);

        //呼叫公共的方法對成員變數進行賦值
        //之前做法是 x.name ="偉爺";
        x.setName("偉爺");
        x.setAge(18);
        //然後呼叫show方法
        x.show();

        /*
        如果在人類中再定義一個方法fun被private修飾
            private void fun(){
                System.out.println("嚶嚶嚶");
            }
            這個fun方法在PrivateDemo中也是無法訪問的,
            但是如果將fun放進show中,是可以被訪問到的,最後會打印出:嚶嚶嚶
            public void show(){
                    fun();
                    System.out.println("姓名:"+name+",年齡:"+age);
            }
         */
    }
}

            執行結果如下:
                    null======0
                    姓名:偉爺,年齡:18

                    Process finished with exit code 0