Java private實現封裝處理
面向物件之中有三大主要特徵:封裝、繼承、多型,對於封裝是Java中最複雜的概念,本次所寫的只不過是幾個基本概念而已。
如果是想清楚封裝,首先必須清楚如果沒有封裝會怎麼樣。
範例: 觀察如下一段程式
class Person {
String name; //名字
int age; //年齡
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person(); //例項化物件
per.name = "Mo Jiu";
per.age = -20;
per.info();
}
}
此時不會出現任何的語法錯誤,因為從int
型的資料範圍來講,是允許儲存有負數的,但是不會有一個人的年齡是-20
,那麼也就證明這個時候屬於業務邏輯出錯。
此時如果要想回避此類問題,那麼首先要解決的就是如何可以讓物件不能夠直接操作年齡的屬性,或者指的是讓類的外部如何不能操作類中的敏感內容。所以此時解決問題的核心觀念就在於:如何讓內部的操作讓外部不可見,此時就可以利用private關鍵字來實現。
範例: 利用private來實現封裝
class Person {
private String name;
private int age;
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person(); //例項化物件
per.name = "Mo Jiu";
per.age = -20;
per.info();
}
}
類中的屬性和方法都可以使用private定義,但是大部分的情況下很少會在方法上使用private。一旦屬性的宣告使用了private定義之後,那麼如果其它類再直接進行該屬性訪問的時候就將出現如下的錯誤提示:
TestDemo.java:13: 錯誤: name可以在Person中訪問private
per.name = “Mo Jiu”;
^
TestDemo.java:14: 錯誤: age可以在Person中訪問private
per.age = -20;
此時使用了private宣告之後屬性安全了,外部無法直接操作了,但是新的問題又來了。那麼如果現在要想進行private私有屬性的訪問,按照Java的設計原則就可以使用setter、getter方法。
-
setter方法:主要用於進行屬性內容的設定
-
private String name:public void setName(String n)
-
getter方法:主要用於屬性內容的取得
-
private String name:public String getName()
範例: 擴充套件Person類中的內容
class Person {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public void setAge(int a) {
age = a;
}
public String getName() {
return name;
}
public int getAge(){
return age;
}
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person(); //例項化物件
per.setName("Mo Jiu");
per.setAge(-20);
per.info();
}
}
如果說現在非要進行檢測,那麼可以再setter裡面完成。
class Person {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public void setAge(int a) {
if(a >= 0 && a <= 150)
age = a;
age = 0;
}
public String getName() {
return name;
}
public int getAge(){
return age;
}
public void info() {
System.out.println("name = " + name + "、age = " + age);
}
}
public class TestDemo {
public static void main(String[] args) {
Person per = new Person(); //例項化物件
per.setName("Mo Jiu");
per.setAge(-20);
per.info();
}
}
類的設計原則:
以後在編寫類的時候類中的所有屬性必須使用private封裝。而使用private封裝的屬性如果需要被外部所使用,那麼就按照格式定義相應的 setter、getter 方法。
private 實現封裝的最大特徵在於:只允許本類訪問。
private 只是封裝的第一步。