为什么80%的码农都做不了架构师?>>>
一、字符串
Java中字符串是对象。字符串是不可更改的。
String str = “abc”:
String str1 = new String(“abc”);
推荐使用第一种方式,因为第一种方式只创建了一个对象。
虚拟机首先创建一个Sting对象的引用,然后到堆区查找,有没有String对象”abc”,如果有就将这个String对象的引用指向”abc”。
第二种方式一共创建了两个对象:虚拟机首先创建一个”abc”的String对象,然后再创建一个String对象,将第一个对象作为参数传递给第二个对象。
一些特殊的字符:
回车 '\r'
换行 '\n'
Tab '\t'
换页 '\f'
退格 '\b'
二、== 和equals
== 是比较对象的引用(地址)是否相等,equals是比较对象的值是否相等。
String str = "abc";
String str2 = "abc";
String str1 = new String("abc");
System.out.println(str==str1);//false 因为引用的不是同一个对象
System.out.println(str==str2);//true 引用同一个对象
System.out.println(str.equals(str1));//true,他们的值是相等的
三、单职责原则
面向对象的一个基本的设计原则:一个类只做好一件事情,由于只做一件事情,所以改变类的动机只有一个。
同理,一个方法最好也只做一件事情,如果您的有个方法超过了10行,就应该对其进行重构了,将其分成更小的方法,方便理解和维护。
敏捷java中一个例子:
一个生成报表的类,重构前:
String getReport() {
StringBuilder buffer = new StringBuilder();
buffer.append(ROSTER_REPORT_HEADER);
for (Student student: session.getAllStudents()) {
buffer.append(student.getName());
buffer.append(NEWLINE);
}
buffer.append(
ROSTER_REPORT_FOOTER + session.getAllStudents().size() + NEWLINE);
return buffer.toString();
}
这个repot的方法很短,但是从概念上讲,该方法做了三件事情,为了方便理解,应该将他拆分成三个更小的方法重构后:
String getReport() {
StringBuilder buffer = new StringBuilder();
writeHeader(buffer);
writeBody(buffer);
writeFooter(buffer);
return buffer.toString();
}
void writeHeader(StringBuilder buffer) {
buffer.append(ROSTER_REPORT_HEADER);
}
void writeBody(StringBuilder buffer) {
for (Student student: session.getAllStudents()) {
buffer.append(student.getName());
buffer.append(NEWLINE);
}
}
void writeFooter(StringBuilder buffer) {
buffer.append(
ROSTER_REPORT_FOOTER + session.getAllStudents().size() + NEWLINE);
}
四、系统属性
Java虚拟机启动的时候设置好了许多系统属性,多数属性返回与虚拟机以及当前执行系统相关的信息,所以使用系统属性是消除系统之间差异的好方法;
比如,windows下面回车换行是’\r\n’而unix下面是’\n’,
使用系统属性即可这样表示:
System.getProperty("line.separatpr");
这样就消除了系统之间的某些差异,更多的属性见jdk帮助文档。
五、访问修饰符
前面我们接触了public和private,public的范围最大,public修饰的属性和方法可以被不同包的对象调用,private的范围最小,只能对象内部有效,public表示公共财产,private表示私有财产。
还有一个修饰符protected,表示受保护的,他的范围比public小一些,同一个包中的对象可以调用他修饰的属性和方法,对象的子类也可以调用(即便子类不在同一个包中)。
如果显示的注明修饰符,java会默认修饰符为friendly(package),表示同一个包的类可以访问
|
同一个类
|
同一个包
|
同一个包的子类
|
不同包的子类
|
不同包的类
|
public
|
可以 |
可以 |
可以 |
可以 |
可以 |
protected
|
可以 |
可以 |
可以 |
可以 |
不可以
|
friendly
|
可以 |
可以 |
可以 |
不可以
|
不可以
|
private
|
可以 |
不可以
|
不可以
|
不可以
|
不可以
|
为了安全的编程:推荐的使用顺序,首先是最受限的访问,然后需要是打开相应的访问权限,暴露太多的类给用户,会导致客户对系统集成的细节产生不必要的依赖。
原则:尽可能的保护代码,只有在必要的时候,放开访问权限。
在uml中public用+号表示,private用-号表示,protected用#表示,package用~表示