当定义一个类时,首先这个类会继承Object类(所有类的父类)的equals方法,然后开发者可以根据具体业务场景去考虑要不要重写equals方法。
public boolean equals(Object obj) {return (this == obj)
}
上面代码即是Object的equals方法的实现, == 判断,即两个对象的地址完全一样的时候才相等。
当开发者定义类时不重写equals方法,则实际调用中使用Object这个父类的equals方法实现。
下面看看String的equals方法:
public boolean equals(Object anObject) {if (this == anObject) {
return true
}
if (anObject instanceof String) {
String anotherString = (String)anObject
int n = value.length
if (n == anotherString.value.length) {
char v1[] = value
char v2[] = anotherString.value
int i = 0
while (n-- != 0) {
if (v1[i] != v2[i])
return false
i++
}
return true
}
}
return false
}
这就是String重写的equals方法,可以仔细看看,很有参考价值。
接下来写段类定义的代码:
public class Person {private String name // 姓名
private int age // 年龄
private String speciality // 特长
@Override
public boolean equals(Object obj) {
// 两个对象是同一个时,直接return true
if (this == obj) {
return true
}
if (obj instanceof Person) {
// 比较对象也是Person对象时,判断name和age是否都相同
Person p = (Person) obj
return name.equals(p.name) && age == p.age
}
return false
}
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 getSpeciality() {
return speciality
}
public void setSpeciality(String speciality) {
this.speciality = speciality
}
}
测试代码:
public class Test {public static void main(String[] args) throws IOException {
Person p1 = new Person("张三", 20, "java")
Person p2 = new Person("张三", 20, "python")
System.out.println(p1.equals(p2))
}
}
根据Person重写的equals方法可以知道,运行结果为 true
如果Person没有重写equals方法,那么会调用Object的equals方法,运行结果为 false
所以实际怎么比较两个对象这完全是看开发者也就是你自己的意思
。在java中我们可以有静态实例变量、静态方法、静态块。类也可以是静态的。java允许我们在一个类里面定义静态类。比如内部类(nested class)。把nested class封闭起来的类叫外部类。在java中,我们不能用static修饰顶级类(top level class)。只有内部类可以为static。
静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同。
(1)内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。
(2)非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。
(3)一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。
要达到这个的标准,还得从开发一个Java项目的过程来分析。我们说需求分析实质上就是提出问题域概要设计和详细设计本质上是给出问题域的解决方案而编码环节就是时使用代码来实践这个解决方案。而学员之所以明明敲完Java项目代码,也运行良好,却依然心里发虚,过后遗忘,就是因为没有掌握提出的问题域(也就是常说的软件需求),而对于其解决方案更是没有概念,只是一味的按照视频中的思路机械照搬,也就是不知其然,不明所以然。明白了问题根源,我们要如何解决这个问题呢?其实答案已经给大家了,就是要从Java项目代码中整理出Java项目的需求和设计思路,然后再验证需求和设计思路是否正确