大纲
- 方法的重写(override)
- Object类(非常重要)
- toString()方法
- ==和equals方法
学习笔记
方法的重写(override)
:子类通过重写父类的方法,可以用自身的行为替换父亲的行为
方法重写需要符合下面三个要点:
- “==”:方法名,形参列表相同
- “<=”:返回值类型和声明异常类型,子类小鱼父类。
- “>=”:访问权限,子类大于父类
toString方法
Object类中定义有public String toString()方法,其返回值是String类型。Object类型中toString方法的源码可以在eclipse中查看
==和equals方法
“==”代表比较双方是否相同。如果是基本类型则表示值相等,若果是引用类型则表示地址相等即是否是同一个对象。
Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如…
Object的equals方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回true柔则返回false。但是,我们可以根据我们自己的要求重写equals方法。
代码
package com.L.oo2;
/**
- 了解Object类
- @author L
*/
public class TestObject {
public static void main(String[] args) {
Object obj;
TestObject to = new TestObject();
System.out.println(to.toString());//能直接用toString方法,说明TestObject类继承于Object类
Person2 p2 = new Person2(“毛毛”,8);//不手动写构造器会报错
System.out.println(p2.toString());
}
public String toString() {
return “测试对Object类中toString方法的重写”;
}
}
class Person2{
String name;
int age;
@Override
public String toString() {
return name+",年龄:"+age;
}
public Person2(String name,int age) {
this.name = name;
this.age = age;
}
}
package com.L.oo2;
/**
- 测试重写(覆盖)
- @author L
*/
public class TestOverride {
public static void main(String[] args) {
Horse h = new Horse();
h.run();
}
}
class Vehicle{
public void run() {
System.out.println(“跑…”);
}
public void stop() {
System.out.println(“停止”);
}
/public Man jj() {
return new Man();
}///man不是一个类型,所以下面的Person的特殊之处在哪?
//是不是同一个包中的.java的类是共用的,而且 自己定义的类可以做作为一种类型
/public Student Girl() {
return new Student();
}/ //果然没有报错,上述猜想正确
public Person WhoIsPsg() {
return new Person();
}
}
class Horse extends Vehicle{
public void run(){
System.out.println(“四蹄翻飞,咯噔咯噔…”);//方法名和参数列表和父类中的同名方法一致
}
/public Person WhoIsPsg() {//Person是一种类型,返回值类型的那种类型,为什么?
return new Person();
}/
public Student WhoIsPsg() {//在子类中,对父类中的方法进行重写,方法的类型必须<=父类中定义该方法的类型(是该类型或者是其子类)
return new Student();
}
/public Object WhoIsPsg() {
return new Object();
}/ //报错 ,印证了上一句注释
}
package com.L.oo2;
/**
- 对equals方法的重写
- @author L
*/
public class TestEquals {
public static void main(String[] args) {
Object obj;
String str;
User u1 = new User(1000,"毛毛","12346546");
User u2 = new User(1000,"虫虫","12346546");
System.out.println(u1==u2);//在这里测试的是两个地址是否指向同一个对象
System.out.println(u1.equals(u2));//测试两个地址所指向的对象的内容是否相同
}
}
class User{
int id;
String name;
String pwd;
public User(int id, String name, String pwd) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}
/* @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}*/ //加不加无所谓 所以他是干嘛用的?
@Override
public boolean equals(Object obj) {//重写之后上面调用equals方法对比u1和u2时,返回值true
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())//如果两个值的类型不同,直接返回false
return false;
User other = (User) obj;
if (id != other.id)
return false;
return true;
}
}