面向物件(5):封裝
阿新 • • 發佈:2021-12-05
面向物件(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