Java学习-面向对象05多态

多态

  • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多。
  • 多态存在的条件
    • 依赖于继承,要有继承关系。(继承)
    • 子类重写父类的方法。(方法重写)
    • 父类引用指向子类对象。(引用)
  • 注意:多态是方法的多态,属性没有多态性(跟方法重写类似,只有方法的重写,没有属性的重写)
  • instanceof (类型转换)引用类型,判断一个对象是什么类型

代码示例

Application.java

package com.oop.www;

import com.oop.www.demo06.Person;
import com.oop.www.demo06.Student;

public class Application {
    public static void main(String[] args) {

        //一个对象的实际类型是确定的
        //new Student();
        //new Person();

        //可以指向的引用类型就不确定了:父类的引用指向子类

        //Student能调用的方法都是自己或者继承父类的
        Student s1 = new Student();
        //Person父类型,可以指向子类,但是不能调用子类独有的方法
        Person s2 = new Student();
        Object s3 = new Student();

        //子类重写了父类的方法,父类调用子类的方法
        s1.run();//student run
        s2.run();//student run

        //对象能执行哪些方法,主要看对象左边的类型,和右边类型关系不大!
        s1.eat();
        //报错:父类不能调用子类独有的方法
        //s2.eat();
        //可以将父类转换为子类,就可以调用子类独有方法
        ((Student)s2).eat();



    }



}

Person.java

package com.oop.www.demo06;

public class Person {
    public void run(){
        System.out.println("run");
    }
}

Student.java

package com.oop.www.demo06;

public class Student extends Person {
    @Override
    public void run() {
        System.out.println("student run");
    }
}

多态注意事项:

  1. 多态是方法的多态,属性没有多态。

  2. 父类和子类,有联系,可以将父类转换为子类去调用子类独有方法。

  3. 多态前提条件:继承,方法重写,父类引用指向子类对象。

  4. 回顾:

    • static方法从属于类不属于实例对象。

    • final关键字修饰属性表示常量。

    • private关键字可以私有化属性方法。

instanceof

作用:判断对象是什么类型

代码示例

Application.java

package com.oop.www;

import com.oop.www.demo06.Teacher;
import com.oop.www.demo06.Person;
import com.oop.www.demo06.Student;

public class Application {
    public static void main(String[] args) {

        //Object->String
        //Object->Person->Teacher
        //Object->Person->Student
        Object object = new Student();//父类的引用指向子类对象

        //System.out.println(x instanceof y);//能不能编译通过!

        System.out.println(object instanceof Student);// true
        System.out.println(object instanceof Person);// true
        System.out.println(object instanceof Object);// true
        System.out.println(object instanceof Teacher);// false
        System.out.println(object instanceof String);// false
        System.out.println("=============================");
        Person person = new Student();
        System.out.println(person instanceof Student);// true
        System.out.println(person instanceof Person);// true
        System.out.println(person instanceof Object);// true
        System.out.println(person instanceof Teacher);// false
        //System.out.println(person instanceof String);//编译报错!
        System.out.println("=============================");
        Student student = new Student();
        System.out.println(student instanceof Student);// true
        System.out.println(student instanceof Person);// true
        System.out.println(student instanceof Object);// true
        //System.out.println(student instanceof Teacher);//编译报错!
        //System.out.println(student instanceof String);//编译报错!





    }



}

类型转换

代码示例

Application.java

package com.oop.www;

import com.oop.www.demo06.Teacher;
import com.oop.www.demo06.Person;
import com.oop.www.demo06.Student;

public class Application {
    public static void main(String[] args) {
        //类型之间的转换:父  子

        //高 -> 低
        Person p = new Student();

        //Student将这个对象转换为Student类型,我们就可以使用Student类型中的方法了!
        //((Student) p).go();
        
        //子类转换为父类,可能丢失自己本来的一些方法!
        Student s = new Student();
        s.go();
        Person p2 = s;





    }



}

Student.java

package com.oop.www.demo06;

public class Student extends Person {
    @Override
    public void run() {
        System.out.println("student run");
    }

    public void eat(){
        System.out.println("student eat");

    }

    public void go(){
        System.out.println("student go");
    }
}

总结:

  1. 父类引用指向子类对象。
  2. 把子类转换成父类,向上转型。
  3. 把父类转换为子类,向下转型。(强制转换)
  4. 方便方法的调用,减少重复的代码!
posted on 2025-06-25 23:51  burgess0x  阅读(10)  评论(0)    收藏  举报