多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。
Java 实现多态有 3 个必要条件:继承、重写和向上转型。只有满足这 3 个条件,开发人员才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而执行不同的行为。
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法
体现:
1.父类类型的引用 指向 子类的对象
Person p = new Teacher();
2.该引用只能调用父类中定义的属性或方法
1.父类类型的引用 指向 子类的对象
Person p = new Teacher();
2.该引用只能调用父类中定义的属性或方法
3.如果子类中将父类的方法重写,那么调取方法后执行的结果是子类重写之后的那个结果
如果父类与子类有同名的属性 执行父类的属性
如果父类与子类有同名的方法(重载) 执行子类重写之后的方法
4.若想要调用子类中独有的成员
(强制类型转化) 造型 铸型 (向上/向下转型)
5.造型时(强制向下转型时) 可能会出现一个运行时异常
如果父类与子类有同名的属性 执行父类的属性
如果父类与子类有同名的方法(重载) 执行子类重写之后的方法
4.若想要调用子类中独有的成员
(强制类型转化) 造型 铸型 (向上/向下转型)
5.造型时(强制向下转型时) 可能会出现一个运行时异常
public class Animal { public String name = "Animal的name属性"; public void eat(){ System.out.println("Animal的吃饭方法"); } public void sleep() { System.out.println("Animal的睡觉方法"); } } public class Person extends Animal{ public String name = "Person的Name属性"; public void sleep(){ System.out.println("Person重写的睡觉方法"); } public void eat(){ System.out.println("Person重写的吃饭方法"); } public void talk(){ System.out.println("Person自己的说话方法"); } } public class Teacher extends Person{ public String name = "Teacher的Name属性"; public void eat(){ System.out.println("Teacher的吃饭方法"); } public void teach(){ System.out.println("Teacher的讲课方法"); } } public class Student extends Person{ public String name = "Student的Name属性"; public void talk(){ System.out.println("学生遵守礼貌 应该好好说话"); } public void study(){ System.out.println("好好学习 天天向上"); } } public class Test { public static void main(String[] args){ Person p = new Teacher();//自动向上转型 Teacher--->Person p.eat(); p.sleep(); p.talk(); System.out.println(p.name); } } 运行结果: Teacher的吃饭方法 Person重写的睡觉方法 Person自己的说话方法 Person的Name属性
public class Test { public static void main(String[] args){ Object o = new Teacher(); o.hashCode(); o.toString(); System.out.println("------------------------"); Animal a = (Animal)o; a.hashCode(); a.toString(); System.out.println(a.name);//animal的name属性 a.sleep();//没有重写 person重写了 person的sleep a.eat();//执行teacher的eat方法 System.out.println("-----------------------"); Person p = (Person)o; p.hashCode(); System.out.println(p.name);//person的name属性 p.sleep();//人类的睡觉 p.eat();//老师的吃饭 p.talk();//人类的说话 System.out.println("----------------------"); Teacher t = (Teacher)o; System.out.println(t.name);//老师的name t.eat();//老师的吃饭 t.sleep();//人类睡觉 t.talk();//人类说话 t.teach();//老师的独有方法 System.out.println("-------------------"); if(o instanceof Person){//对象是否属于后面类型 System.out.println("类型匹配 可以造型"); // Student s = (Student)o;//运行时异常 ClassCastException // s.study(); }else{ System.out.println("对不起 类型不匹配 不帮您造型啦 否则会出问题"); } } } 运行结果: ------------------------ Animal的name属性 Person重写的睡觉方法 Teacher的吃饭方法 ----------------------- Person的Name属性 Person重写的睡觉方法 Teacher的吃饭方法 Person自己的说话方法 ---------------------- Teacher的Name属性 Teacher的吃饭方法 Person重写的睡觉方法 Person自己的说话方法 Teacher的讲课方法 ------------------- 类型匹配 可以造型