第七周总结
一、instanceof
关键字
instanceof
关键字是用来判断某个对象是不是某个类或者它的子类的对象,如果不是,或者该对象为空就返回false,比如在equals方法的重写中就会用到它。
class Student {
private String name;
public Student() {}
public Student(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
//@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof Student) {//使用instanceof关键字判断obj是不是属于Student或者他的子类的对象,若果是的话就返回true否则返回flase,在这里需要比较的是两个Student类型的对象它们的name是否相同。如果传入的对象不是Student类型的对象的话就无法进行比较,所以在这里进行判断。
Student student = (Student) obj;
if(student.getName().equals(this.name)) {
return true;
}
}
return false;
}
//@Override
public int hashCode() {
return this.name.hashCode();
}
}
class Stud extends Student {//Stud是继承Student
private String name;
public Stud(String name) {
this.name = name;
}
}
class Dog {
private int id;
public Dog(int id) {
this.id = id;
}
}
public class Test{
public static void main(String[] args){
Student stu1 = new Student("aa");
Stud stu = new Stud("aa");
Dog d = new Dog(123);
System.out.println(stu1 instanceof Student);//输出true
System.out.println(stu instanceof Student);//输出true
//System.out.println(d instanceof Student);
//错误: 不兼容的类型: Dog无法转换为Student
System.out.println(d instanceof Student);
}
}
刚开始尝试重写equals方法的时候对于if (obj instanceof Student)
返回的是true还存在着许多的不解,明明形参的类型是Object为什么还能返回true呢?经过对继承的学习知道了,由于所有的类都默认继承Object类,所参数传入后类型为Object就相当于是Object stu = new Student
,这里只是没有新建对象。这里面的obj就是Object父类型指向Student子类型的对象,所以返回值是true。
二、多态
多态:指一个方法有两种形态,编译期形态,运行期形态。
- 在编译期会发生静态绑定,此时的编译器只会看这个对象的父类中有没有这种方法,就的话编译就能过没有的话就过不了。
- 在运行期发生动态绑定此时的编译器会先去看子类中有没有重写该方法,有的话就调用子类的,没有就调用父类的。
- 没有继承就没有重写,没有重写就没有多态。
class Person {
private String name;
public Person() {}
public Person(String name) {
this.name = name;
}
public void sleep() {
System.out.println("人在睡觉");
}
}
class Student extends Person {
private String name;
public Student() {}
public Student(String name) {
this.name = name;
}
public void sleep() {
System.out.println("学生在睡觉");
}
}
public class Test{
public static void main(String[] args){
Person stu = new Student("aa");
stu.sleep();//输出学生在睡觉
}
}
如果只把Person类里面的sleep方法注释掉的话,静态绑定失败,编译的时候就会报错
如果是只注释掉Student里面的sleep方法的话编译能过,但是调用的是Person类的sleep方法
PS:写继承时如果父类写了有参构造方法那么父类的无参构造一定要写上去不然的话就会报错
把上面代码Person类的无参构造去掉后就会报如下错误: