Learn Java for Android Development Second Edition 笔记(三)

来源:互联网 发布:js onclick 编辑:程序博客网 时间:2024/04/24 05:27

Collecting Garbage

Java提供一个后台程序GC来负责回收未被引用的对象,一般不需要用户自己手动设置对象为null,除非像一些collection里的对象要注意。

对象数组

Image[] imArray = new Image[3];for (int i = 0; i < imArray.length; i++)imArray[i] = new Image("image" + i + ".png"); // image0.png, image1.png, and so on
注意以上第一句话里实际上只是创建了三个空引用,并未实际创建对象,所以在接下来的行真正去new对象。

Inheritance

Java支持单一继承对象,但是可以实现多重interface。
class Vehicle{// member declarations}class Car extends Vehicle{// member declarations}
不能够extend声明为final的class。
super()函数是用来调用父类的构造函数,super只能出现在构造函数中,并且必须是第一行(因为这就符合下面的原则:子类的构造函数会先调用父类的构造函数)如果没调用super,且父类没有无参构造函数,编译器会报错,因为子类构造函数会在没有super()情况下调用父类的无参构造函数。换句话说,子类的构造函数需要要么手动通过super函数调用父类相应同参数的构造函数,要么就是默认的调用父类的无参构造函数。子类没有但是父类有的构造函数,子类是不能直接调用的。
一个类的对象不能被改变时,这种类称为immutable class。

Override方法

  • 子类的方法替换父类同名,同参数,同返回值的方法。
  • 子类override父类的方法里,可以通过super.method来再次调用父类的方法。
  • 对于声明为final和private的方法,不能被override。
  • 如果想使用Override方法,则建议在子类的该方法前加上@Override,这样编译器就可以帮你检查出来你是否真正的override了父类的同名方法,而不是overload。override需要函数同名,同参数,同返回值。
父类的class initializers总是在子类的class initializer之前执行。
子类的构造函数总是会调用父类的构造函数来初始化一个对象的父类层,然后再初始化子类层。A subclass’s constructor always calls the superclass constructor to initialize an object’s superclass layer and then initializes the subclass layer.
Java只支持单一继承。

终极祖类Object

clone()方法

该方法用于创建一个新的对象而不需要调用一个构造器。它将原子类型数据或引用的数据拷贝到新对象里。
实现该方法的类必须加上implements Cloneable
Shallow clone:浅拷贝,就是指不明显地实现clone()方法,而是利用Object类自身的clone方法。[这是书上所说,但是实际在ADT环境测试下来,必须显示地声明实现clone方法(否则会报出clone方法不可见错误),然后在clone方法里调用父类的clone方法,如下示例:]
class Employee implements Cloneable{String name;int age;Employee(String name, int age){this.name = name;this.age = age;}@Override    public Object clone() {//shallow copytry{return super.clone();} catch (CloneNotSupportedException e) {return null;}    }}
String方法就没有实现clone接口。
将一个对象clone到新对象后,新对象和老对象的引用值是不一样的,所以如果用==来比较两个对象,结果是false。
shallow clone也有需要注意的地方,对于原子类型的成员数据,值是拷贝的,对于对象类型成员数据,新老对象是引用同一个数据。所以只要有任何一个对象改变了它的对象成员数据,另一方也会跟着被改变。对于成员数据是String类型,由于它是不可改变的,所以倒是不需要注意这个副作用。
如果想要避免以上shallow clone的副作用,那么可以在类的clone方法里,除了调用父类的shallow clone外,在手动地把对象类型的成员变量new出一个新的来。如以下例子:
@Overrideprotected Object clone() throws CloneNotSupportedException{Employee emp = (Employee) super.clone();if (hireDate != null) // no point cloning a null object (one that doesn't exist)emp.hireDate = new Date(hireDate.year, hireDate.month, hireDate.day);return emp;}

Equality

Object的==和!=操作符,对于原子类型的数据,比较的是值是否相等,对于对象类型数据,比较的是两个引用是否指向同一个数据。不能用==来判断两个对象是否逻辑上相等(逻辑上相等指它们所有成员变量的值一致,即使引用不一样)。
String类型因为比较常用,它的==实现有比较特殊 的地方
System.out.println("abc" == "abc"); // Output: true
System.out.println("abc" == "a" + "bc"); // Output: true
System.out.println("abc" == "Abc"); // Output: false
System.out.println("abc" != "def"); // Output: true
System.out.println("abc" == new String("abc")); // Output: false
Object对象提供了equals()方法来比较两个对象是否逻辑上相等,该方法确实是比较两个引用是否指向同一个值,如果要比较对象的内容,必须override实现equals方法。
必须考虑是否一定要实现equals方法,StringBuffer就没有override该方法。
实现equals方法需要满足以下原则:
0 0
原创粉丝点击