封装:
封装意义:更好的维护数据,让使用者无需关心如何使用,只需要知道怎么使用。
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和Set
public 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);
}
结果是一样的