首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java SE 学习札记03

2012-10-14 
Java SE 学习笔记03Parent parent new Parent()---正确System.out.println(parents x is + p.x)--

Java SE 学习笔记03
Parent parent = new Parent();--->正确
System.out.println("parent's x is" + p.x);-->不正确
}
}
结论:protected访问权限只允许子类跨包访问,在子类中不允许使用父类的引用调用父类中的protected修饰的变量或方法(但静态属性和方法可以被调用)
即子类可跨包访问,而父类遵守的是default访问权限(即从包外访问protected修饰的变量和方法只能通过继承实现)
此外,如果有一个类(Other)和子类处于同一个包中,其中有子类对象的引用,子类对象的引用也不能访问父类中protected修饰的变量或方法,这时的protected权限在子类中其实变成了private权限,因此类外是不能访问的
★protected = package + subclass

?

★Object类
★Object类是所有Java类的父类,如果一个类没有使用关键字extends继承一个类,其默认继承了Object类
★equals()方法。equals()方法默认执行的是==的比较,参看Object类的源码可知。因此要想实现自定义类的比较需要重写此方法自定义比较的规则。在API中有几个类已重写了equals()方法,如String、Date和封装类
equals()方法遵循一些原则:
自反性 如果x不为null,x.equals(x)为true
对称性 x.equals(y)为true,那y.equals(x)为true
传递性 x.equals(y)为true,y.equals(z)为true,那x.equals(z)返回值也为true
一致性 多次调用x.equals(y)结果均为true
非空性 如果x取值不为null,那么x.equals(null)为false
equals()方法的一般写法:(以 Person类为例)

public boolean equals(Object object){参数只能是Object类
if(this == object)return true;
if(object == null)return false;
if(this.getClass() != object.getClass())return false;
Person person = (Person)Object;
return ((this.name).equals(person.name)) && (this.age == person.age);
}
上面代码中的getClass()可以用instanceof测试。但不推荐使用instanceof。假设有一个Employee类和一个Manager类,后者继承自前者,分别有两个类的对象e和m,假设他们有相同的名字、薪水和入职日期。现在有e.equals(m),如果在equals方法中用(m instanceof Employee)来判断,肯定为true,但是根据equals对称性原则,要求m.equals(e)的返回结果为true,这时的equals方法中(e instanceof Manager)返回的要么是false要么抛出异常
如果子类有自己判断equals相等的原则,那么对称性原则要求强制使用getClass();
如果子类使用父类判断equals相等的原则,那么为了使不同子类之间的equals比较能够进行,可以使用instanceof来判定。instanceof superclass

public boolean equals(Person person)这个不叫方法重写。
数组的equals()和hashCode()方法:调用Arrays.equals(type[] a, type[] b)和Arrays.hashCode(type[] a);

★hashCode()方法,其主要作用是配合equals()方法来使用
重写equals()方法是必须重写hashCode()方法。因为两个对象如果用equals()方法比较相等的话,那么他们的hashCode()方法返回值也必须相等
如果两个对象的hashCode()方法返回值不相等,则两个对象的equals()方法比较返回false,即两个对象一定不相等
如果两个对象equal()方法返回值为false,则两个对象的hashCode()方法返回值并不一定要求一定不相等(即其hashCode可以相等)
hashCode()方法遵循原则:
多次调用x.hashCode()的返回值均是相等整数
hashCode()方法在重写是根据equals()方法比较的内容重写:
如Person的hashCode方法重写为:
public int hashCode(){
return 7 * name.hashCode() + 13 * new Integer(age).hashCode();
}

★toString()方法:返回的是该对象的字符串表示
只要对象和一个字符串通过 + 号进行连接的话,会自动调用该对象的toString()方法
★对于一维数组对象,调用的是Arrays.toString(arrayName)方法进行打印
★对于多维数组对象,调用的是Arrays.deepToString(arrayName)方法进行打印
子类中对于父类的equals()、hashCode()、toString()方法的重写是通过super调用父类中的equals()、hashCode()、toString()方法再加上子类自己添加的内容(这里假设父类已重写了Object的equals()hashCode()和toString()方法)

?

★clone()方法:protected修饰,用于拷贝对象,所有使用clone()方法的类都应该实现Cloneable接口(数组除外)
浅克隆:如果一个类中不包含引用类型的属性(如Date类型的属性),那么使用super.clone()方法可以实现该类对象的拷贝
深克隆:如果一个类中包含引用类型的属性,那么该类的每个引用类型的属性也必须分别调用clone()方法才能保证对该类对象实现正确的拷贝
假如有一个员工类:其有String类型的name属性和Date类型的hireDate属性。那么如何对其进行clone呢?首先Employee类必须实现Cloneable接口,然后重写里面的clone方法
public Employee clone() throws CloneNotSupportedException {
Employee cloned = new Employee();
cloned = (Employee) super.clone();
cloned.hireDay = (Date) hireDay.clone();
return cloned;
}
对于任何数组对象,其clone方法都是public的
int[] luckyNumbers = { 2, 3, 5, 7, 11, 13 };
int[] cloned = (int[]) luckyNumbers.clone();
cloned[5] = 12; // doesn't change luckyNumbers[5]
注意:如果原始对象中包含类似于String这样的不可变对象,浅克隆将不会有任何问题

<script type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/js/r20110824/r20110719/show_ads_impl.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script></script>

热点排行