java学习笔记-多态

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("对不起 类型不匹配 不帮您造型啦 否则会出问题");
        }

    }
}


发布了30 篇原创文章 · 获赞 0 · 访问量 6645

猜你喜欢

转载自blog.csdn.net/qq_37710756/article/details/103543710