Java对象的特性:多态
Java面向对象的四大特性
继承 封装 多态 (抽象)
多态
同一个对象 体现出来的多种不同形态(身份) 将一种行为表现出不同的效果
要想实现多态的效果 需要现有继承关系
体现:
1.父类类型的引用 指向 子类的对象
Person p = new Teacher();
2.该引用只能调用父类中定义的属性或方法
3.如果子类中将父类的方法重写,那么调取方法后执行的结果是子类重写之后的那个结果
如果父类与子类有同名的属性 执行父类的属性
如果父类与子类有同名的方法(重载) 执行子类重写之后的方法
4.若想要调用子类中独有的成员
(强制类型转化) 造型 铸型 (向上/向下转型)
5.造型时(强制向下转型时) 可能会出现一个运行时异常
ClassCastException 造型 铸型 异常
如果想要避免造型的异常 可以用instanceof关键字来进行判断
对象 instanceof 类
案例
//动物类
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 eat(){
System.out.println("person的吃饭方法");
}
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 = "student的name属性";
public void talk(){
System.out.println("学生遵守礼貌 应该好好说话");
}
public void study(){
System.out.println("好好学习 天天向上");
}
}
//老师
public class Teacher extends Person{
public String name = "teacher的name属性";
public void eat(){
System.out.println("做老师的通常不按时吃饭");
}
public void teach(){
System.out.println("做老师的独有方法 一般人不会讲课 我会");
}
}
public class Test {
public static void main(String[] args){
//1.创建对象
//这个真是的老师 体现出来的身份是一个人的身份
// Person p = new Teacher();//自动向上转型 Teacher--->Person
// p.eat();
// p.sleep();
// p.talk();
// //如果想要调用子类独有的属性或方法
// //需要将类型还原会真实类型 强制类型转化 造型 向上转型 向下转型
// Teacher t = (Teacher)p;
// t.eat();
// t.sleep();
// t.talk();
// t.teach();
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("对不起 类型不匹配 不帮您造型啦 否则会出问题");
}
}
}