java面向对象——多态

java面向对象——多态

多态:同一方法可以根据发送的对象不同而采用多种行为方式。即方法的多态。
在Java中,一个对象的实际类型是确定的而对象的应用类型是不确定的。

多态存在的条件:
  • 有继承关系
  • 子类重写了父类的方法
  • 父类的引用指向了子类的对象
    示例:
public class Person {
   public void run(){
       System.out.println("run");
   }
}
public class Student extends Person{
    @Override
    public void run() {
        System.out.println("student");
    }
    public void test(){
        System.out.println("eat");
    }
}
 public static void main(String[] args) {
        //一个类的实际对象是确定的
        //new Person();
        //new Student();
        //类的引用类型不确定
        Student s1 = new Student();
        Person s2 = new Student();//向上造型
        s1.run();
        s1.test();
        s2.run();

上例中,定义了父类Person和子类Student。

 Person s2 = new Student();

将父类的引用指向子类的对象,这种方式称为向上造型。然后我们用对象s1和s2来调用类中的方法,可以看到s1可以调用子类中所有的方法。但是s2只能调用父类中的方法。这样,我们得出结论:
子类能调用父类继承的和自己独有的
父类可以指向子类,但不能调用子类的独有方法和属性。

向上造型

向上造型:父类引用指向子类对象。
向下造型:子类对象指向父类引用。(需要强制转换)
示例:

public class Person {
   public void run(){
       System.out.println("run");
   }
}
public class Student extends Person{
    @Override
    public void run() {
        System.out.println("student");
    }
    public void test(){
        System.out.println("eat");
    }
}
public static void main(String[] args) {

        Person P1=new Student();
        Student P2=(Student) P1;//向下造型
        P2.test();
        ((Student)P1).test();//向下转型
    }

当使用向下造型时,需要强制转换:(子类)父类引用 。

instanceof

instanceof: 该运算符左边为对象右边为类。当左边的对象时右边类或子类创建的对象时,返回 true 否则返回 false 。需要注意的是,必须有继承关系。其判断在同一继承树内判断。

//继承树
//object->String
//Object->Person->Student
//Object->Person->Teacher
    public static void main(String[] args) {
        Object o = new Student();//看右边类
        Object o1 = new Object();
        Person person2 = new Person();
        Person person = new Student();
        Person person1 = new Person();
        System.out.println(person instanceof Student);//true
        System.out.println(person1 instanceof Person);//true
        System.out.println(person1 instanceof Student);//false
        System.out.println(person2 instanceof Teacher);//false
        System.out.println(o instanceof Student);//true
        System.out.println(o instanceof Object);//true
        System.out.println(o instanceof Person);//true
        System.out.println(o instanceof String);//false
        System.out.println(o instanceof Teacher);//false
        System.out.println(person instanceof String);//报错
    }
}

小结:
1、多态是方法的多态,
2、父类和子类,有继承关系时,需要用到类型转换
3、存在条件:继承关系,方法重写,父类引用指向子类实际类型(向上造型)
4、不可重写的方法:
static(属于类,不属于实例)\final(常量)\private

你可能感兴趣的:(java,开发语言,后端)