一、面向对象之多态性
何谓多态?
广义上:
- 方法的重写、方法的重载
- 子类对象的多态性
狭义上:
就是指子类对象的多态性
多态的前提:
- 要有继承关系
- 要有方法的重写
- 父类的引用指向子类的对象
思考:属性有多态性嘛?——没有。
只有方法可以多态
对象类型转换
Man m = (Man) p; //发生错误: ClassCastException ——类型转换异常
注意:
为了解决类型转换异常可以在向下转型时使用 instanceof:
temp instanceof Man:temp对象是否是 Man的一个实例(对象),如果是返回true
public class Person(){
}
public class Woman extends Person (){
public void show(){
System.out.println("beautiful")
}
...
}
...
//多态:动态绑定——编译看左边,运行看右边
Person p = new Woman(); //
//在多态前提下如何调用子类对象中特有的属性和方法?——采用向下转型的方式:
Woman w = (Woman)p;//注意:p指向的对象必须是 woman 的对象才可以这么做
Creature cre = new Woman();
Person per = (Person) cre;
per.show();//这里调用的仍然是 woman 对象的方法,person是障眼法,要看 实际指向的对象到底是谁
二、Object 类的介绍
基础:
- object 类是所有类的父类
- 如果一个类没有显式继承其他类,那么默认继承object类
- object只有一个空参的构造器
- object中有11个方法,其中三个wait方法是重载方法
equals方法:
【一道面试题】:equals 和 == 的区别是什么?
⭐==:
- 基本数据类型,比较的是具体的内容是否相等;
- 引用数据类型,比较的是地址值是否相同(两个变量指向的是否是同一个对象)
⭐object中的equals方法:
public boolean equals(Object obj){
return (this == obj);
}
像 String、data 等核心类库基本上都重写了 equals 方法,用来比较具体内容;
自定义类如果没有重写equals 方法,那么调用的是 object 类中的 equals 方法来比较地址值。但是我们自定义类的时候通常都会重写 equals 方法,用来比较内容。
public class Person{
String name;
int age;
@Override
public boolean equals(Object obj){
if(this == obj){//同一个对象,内容一定相同
return true;
}
if(obj instanceof Person){
//向下转型???为什么是向下???
Person p = (Person) obj;
//比较内容
return (p.age == this.age) && this.name.equals(p.name);
}
//return super.equals(obj);
return false;
}
}
public class EqualsTest{
public static void main(String[] args){
Person p1 = new Person("cc",20);
Person p2 = new Person("cc",20);
System.out.println(p1.equals(p2));//如果没有上面那个 重载的 equals方法,这里的返回值是false,如果重载了,则可以比较大小,此时返回的是true
}
}
toString 方法:
Object中的 toString方法就是输出地址。
注意:当我们输出对象的名字时,默认调用的是当前对象的 toString 方法。