记录一下看过的东西:
1.instanceof
public class Foot {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Apple extends Foot {
private String color;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
Foot foot=new Apple();
Foot foot1=new Foot();
Apple apple=new Apple();
((Apple) foot).setColor("green");
if (foot instanceof Apple){
System.out.println("33333");
System.out.println(((Apple) foot).getColor());
}
if (foot1 instanceof Apple){
System.out.println("444444");
}
if (apple instanceof Foot){
System.out.println("55555");
}
输出结果:
类及其子类都是其实例,能通过instanceof的校验。
2.抽象类
public abstract class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void getDescroption();
}
public class Dog extends Animal {
@Override
public void getDescroption() {
System.out.println("this is a dog");
}
}
Animal animal=new Dog();
animal.getDescroption();
输出结果:
定义抽象类的实例实际上是抽象类实现类的实例,在调用抽象方法时,实际上是调用的子类对象中的方法。
可以看出抽象方法一个很重要的角色就是占位,一是保证了实现类一定实现具体方法,二是使用变量animal调用子类对象中的方法实现,编译只允许调用在类中声明的方法。
如果省略了抽象方法的定义,实际上变成了只存在从属关系的父子类。
3.equals方法
在Object中,这个方法将判断两个对象是否具有相同的引用。(参考前面的值传递,对象参数传递的是地址的拷贝)
Object是所有类的超类,如果想比较自己创建的类,如姓名,年龄等数据一致,就认为是同一Cat,此时就需要重写equals方法。
public class Cat {
private int age;
private String name;
private boolean tag;
@Override
public boolean equals(Object o) {
//实参o传递的是地址值的副本
//检测this和o是否引用同一个对象
if (this == o) return true;
//检测o是否为null,或者this和o是否属于同一个类
if (o == null || getClass() != o.getClass()) return false;
//将o转换为Cat类型
Cat cat = (Cat) o;
//判断实例域数据是否匹配
return age == cat.age &&
tag == cat.tag &&
Objects.equals(name, cat.name);
}
}
如果Cat的所有子类不变,可以用 ! (o instanceof Cat) 代替getClass != o.getClass(),数据一致的情况下所有的子类也可以通过equals判断。这是特殊情况,建议不要使用——违反equals的对称性。