面向对象是java的重点,所以也是这本书的重点。这章延续上章,我粗略数了下,这两张加起来竟然达到这本书的四分之一。这章刚开始讲了包装类,由于jdk1.5以后引入了自动装箱和拆箱,基本类型和包装类转化就方便了。包装类有很多方法用起来很方便大家要熟悉下,eg
- public class Primitive2String
- {
- public static void main(String[] args)
- {
- String intStr = "123";
- //把一个特定字符串转换成int变量
- int it = Integer.parseInt(intStr);
- System.out.println(it);
- String floatStr = "4.56";
- //把一个特定字符串转换成float变量
- float ft = Float.parseFloat(floatStr);
- System.out.println(ft);
- //把一个float变量转换成String变量
- String ftStr = String.valueOf(2.345f);
- System.out.println(ftStr);
- //把一个double变量转换成String变量
- String dbStr = String.valueOf(3.344);
- System.out.println(dbStr);
- //把一个boolean变量转换成String变量
- String boolStr = String.valueOf(true);
- System.out.println(boolStr.toUpperCase());
- }
- }
网上说的很多关于==和equals的区别,误导了一大片人,看了李刚的书,然后我也研究了下jdk的源码。发现对object来说这两者是一样的。下面看源码
- public boolean equals(Object obj) {
- return (this == obj);
- }
网上说了很多他们之间的不同是由于(我们那String来做例子)equals被重写过,eg
- public boolean equals(Object anObject) {
- if (this == anObject) {
- return true;
- }
- if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = count;
- if (n == anotherString.count) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = offset;
- int j = anotherString.offset;
- while (n-- != 0) {
- if (v1[i++] != v2[j++])
- return false;
- }
- return true;
- }
- }
- return false;
- }
然后讲了设计模式中的单例模式(具体我会在以后的设计模式中讲)现在先举个例子,eg
- class Singleton
- {
- //使用一个变量来缓存曾经创建的实例
- private static Singleton instance;
- //将构造器使用private修饰,隐藏该构造器
- private Singleton(){}
- //提供一个静态方法,用于返回Singleton实例
- //该方法可以加入自定义的控制,保证只产生一个Singleton对象
- public static Singleton getInstance()
- {
- //如果instance为null,表明还不曾创建Singleton对象
- //如果instance不为null,则表明已经创建了Singleton对象,将不会执行该方法
- if (instance == null)
- {
- //创建一个Singleton对象,并将其缓存起来
- instance = new Singleton();
- }
- return instance;
- }
- }
- public class TestSingleton
- {
- public static void main(String[] args)
- {
- //创建Singleton对象不能通过构造器,只能通过getInstance方法
- Singleton s1 = Singleton.getInstance();
- Singleton s2 = Singleton.getInstance();
- //将输出true
- System.out.println(s1 == s2);
- }
- }
不可变类的设计,注意引用变量的问题。eg
- class Name
- {
- private String firstName;
- private String lastName;
- public Name(){}
- public Name(String firstName , String lastName)
- {
- this.firstName = firstName;
- this.lastName = lastName;
- }
- public void setFirstName(String firstName)
- {
- this.firstName = firstName;
- }
- public String getFirstName()
- {
- return this.firstName;
- }
- public void setLastName(String lastName)
- {
- this.lastName = lastName;
- }
- public String getLastName()
- {
- return this.lastName;
- }
- }
这里虽然没改person对象,但其实改name对象的时候,由于name对person是引用对象,所以person中的name其实也是改变了,为了解决这个问题,使用以下方法。eg
public class Person { private final Name name; public Person(Name name) { //this.name = name; this.name = new Name(name.getFirstName(), name.getLastName()); } public Name getName() { //return name; return new Name(name.getFirstName(), name.getLastName()); } public static void main(String[] args) { Name n = new Name("悟空", "孙"); Person p = new Person(n); //如果没有保护:Person对象的Name属性的firstName属性值为"悟空" System.out.println(p.getName().getFirstName()); //改变Person对象Name属性的firstName属性值 n.setFirstName("八戒"); //如果没有保护:Person对象的Name属性的firstName属性值为"八戒" System.out.println(p.getName().getFirstName()); } }
虽说还是引用对象但这个name对象别人访问不到了,这样就实现了不可变类。
最后讲个用缓存来实现不可变类,eg
public class CacheImmutale { private final String name; private static CacheImmutale[] cache = new CacheImmutale[10]; //记录缓存实例在缓存中的位置,cache[pos-1]是最新缓存的实例 private static int pos = 0; public CacheImmutale(String name) { this.name = name; } public String getName() { return name; } public static CacheImmutale valueOf(String name) { //遍历已缓存的对象, for (int i = 0 ; i < pos; i++) { //如果已有相同实例,直接返回该缓存的实例 if (cache[i] != null && cache[i].getName().equals(name)) { return cache[i]; } } //如果缓存池已满 if (pos == 10) { //把缓存的第一个对象覆盖 cache[0] = new CacheImmutale(name); //把pos设为1 pos = 1; return cache[0]; } else { //把新创建的对象缓存起来,pos加1 cache[pos++] = new CacheImmutale(name); return cache[pos - 1]; } } public boolean equals(Object obj) { if (obj instanceof CacheImmutale) { CacheImmutale ci = (CacheImmutale)obj; if (name.equals(ci.getName())) { return true; } } return false; } public int hashCode() { return name.hashCode(); } public static void main(String[] args) { CacheImmutale c1 = CacheImmutale.valueOf("hello"); CacheImmutale c2 = CacheImmutale.valueOf("hello"); //下面代码将输出true System.out.println(c1 == c2); } }