封裝:
封裝意義:更好的維護數據,讓使用者無需關心如何使用,只需要知道怎么使用。
Java Bean:
然后我們要知道Java Bean(實體類)標準。
1.對于這個類的成員都需要設為私有,而且要對外提供相應Get,Set的接口。
2.類中要有公有的無參和帶參構造。
意義:對于實體類只需要負責數據的存取,而對數據的處理交給其他方法類完成,以實現數據與業務的分離。
比如我們實現一個學生信息管理系統,學生就是實體類。
如將一個學生信息的封裝:
public class StudentInfor {//成員變量用private修飾private String id;private String name;private int age;private String sex;private int MathScore;private int ChineseSocre;private int EnglishScore;private int arrSocre;//無參構造public StudentInfor() {}//帶參構造public StudentInfor(String id, String name, int age, String sex, int mathScore, int chineseSocre, int englishScore) {this.id = id;this.name = name;this.age = age;this.sex = sex;MathScore = mathScore;ChineseSocre = chineseSocre;EnglishScore = englishScore;arrSocre=mathScore+chineseSocre+englishScore;}//各個成員的Get和Setpublic String getId() {return id;}public void setId(String id) {this.id = id;}public int getArrSocre() {return arrSocre;}public void setArrSocre() {arrSocre=MathScore+EnglishScore+ChineseSocre;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getMathScore() {return MathScore;}public void setMathScore(int mathScore) {MathScore = mathScore;}public int getChineseSocre() {return ChineseSocre;}public void setChineseSocre(int chineseSocre) {ChineseSocre = chineseSocre;}public int getEnglishScore() {return EnglishScore;}public void setEnglishScore(int englishScore) {EnglishScore = englishScore;}
}
權限修飾:
這里我截了一張黑馬的圖:
具體有什么用后面再說。
String:
首先我們要知道" "雙引號里的類容都是String的對象。
jdk8之前內部存儲定義的是char類型數組
jdk9以后是定義的byte類型數組存儲,可以更好的節省了空間
這里有jdk9版本之后的圖。
我們要知道直接new一個String的話會在堆中,而直接賦值的話會在先在常量池中找,我們看一下具體怎么做的。
我們來看個例子:
public static void main(String[] args) {String s1="abc";String s2="abc";if(s1==s2){System.out.println("地址相同");}else {System.out.println("地址不同");}}
這兩個地址會相同嗎?
運行一下發現是相同的。
為什么呢?
這里畫一張對應的堆圖來理解
其中的創建用的是toString方法
這是一張及其簡單的圖片,但是要注意jdk7版本之前常量池在方法區中,jdk7版本之后常量池在堆中。
Java中還存在常量優化機制。
比如:
public static void main(String[] args) {String s1="abc";String s2="a"+"b"+"c";if(s1==s2){System.out.println("地址相同");}else {System.out.println("地址不同");}}
這個地址也是相同的喲!
常量優化機制會將?? String s2="a"+"b"+"c";->優化為:Stirng s2="abc";
所以地址會相同
StringBuilder:
1.它是一個可變字符。
2.StringBuilder是字符緩沖區,可以理解為容器,這個容器可以儲存任何類型的數據類型,只要進入這個容器全部都是變成字符。
我們來舉個例子:
public static void main(String[] args) {StringBuilder s1=new StringBuilder();s1.append("abc");s1.append(11);s1.append(false);System.out.println(s1);}
Java中有個叫做鏈式編程的東西。
StringBuilder也能演示鏈式編程,首先我們要知道append返回的是什么,我們可以去API里面查:
可見全都是返回的StringBuilder,所以這時候就可以用前面一個的返回值調用方法,這就是鏈式編程。
類似這樣:
public static void main(String[] args) {StringBuilder s1=new StringBuilder();s1.append("abc").append(11).append(false);;System.out.println(s1);}
結果是一樣的