目錄
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();
}
}
本文完。