多态
意义:
-
同一个对象被造型为不同的类型时,此时me就可以掉用三种方法
我 me = new 我() 讲师 o1 = me; 妈妈 o2 = me; 老婆 o3 = me; class 我 implments 讲师,妈妈,老婆{ //我实现了讲师、妈妈、老婆接口必须重写3个方法 void 讲课(){ sout(讲课) } void 揍孩子(){ sout(揍孩子) } void 收财务(){ sout(收财务) } } interface 讲师{ void 讲课(); } interface 妈妈{ void 揍孩子(); } interface 老婆{ void 收财务(); }
-
行为多态,同一类型的引用指向不同对象,抽象方法都是多态的
人 p1 = new 理发师() //向上造型
人 p2 = new 医生()
人 p3 = new 导演()
p1.剪头()
p2.开刀()
p3.停止拍戏()
abstract class 人 {
void cut();
}
class 理发师 extends 人{
void cut(){ 箭头 }
}
class 医生 extends 人 {
void cut(开刀 )
}
class 导演 extends 人 {
void cut( 停止拍戏 )
}
例子
下面有动物类Animal、人类Person、猪类Pig、学生类Student、老师类Teacher、Test测试类关系图如下
public class Animal {
public String name = "Animal的name属性";
public void eat(){
System.out.println("动物的吃饭方法");
}
public void sleep(){
System.out.println("动物i的睡觉方法");
}
}
public class Person extends Animal {
public String name = "人类的name属性";
public void eat(){
System.out.println("人类的吃饭方法");
}
public void sleep(){
System.out.println("人类的睡觉方法");
}
public void talk(){
System.out.println("人类的交流方法");
}
public class Pig extends Animal{
public String name = "pig的name属性";
public void sleep(){
System.out.println("猪的睡觉方法~");
}
}
public class Student extends Person {
public String name = "学生的name属性";
public void talk(){
System.out.println("学生讲礼貌好好说话");
}
public void study(){
System.out.println("好好学习天天向上");
}
}
public class Teacher extends Person{
@Override
public void eat() {
System.out.println("老师通常不按时吃饭");
}
public void teach(){
System.out.println("老师会教课,其他人不会");
}
}
下面是Test测试方法
public class Test {
public static void main(String[] args) {
Person p = new Teacher(); //向上造型了
p.eat();
System.out.println(p.name);
p.sleep();
p.talk();
}
}
过程分析:Person p = new Teacher() 向上造型了,能点出来(编译的)是Person类型。运行看子类有没有重写父类方法
结果是
老师通常不按时吃饭 ---> eat()被teacher类重写
人类的name属性
人类的睡觉方法 --->teacher没有重写Person类的sleep方法,就向上找父类Person的sleep方法
人类的交流方法 --->teacher没有重写Person类的talk方法,就向上找父类Person的talk方法
Test2类代码如下
public class Test2 {
public static void main(String[] args) {
Object o = new Teacher(); //taecher对象指向Object引用
o.hashCode();
o.toString();
Animal aa = (Animal) o;
System.out.println(aa.name);
aa.eat();
aa.sleep();
}
}
输出的结果为
Animal的name属性 --->属性没有继承关系
老师通常不按时吃饭 --->teacher类中有eat()就调用
人类的睡觉方法 ---->teacher类中没有sleep()就在其父类Person中找sleep(),找到了就输出sleep()