【狂神说Java】多态及类型转换

多态

  • 同一方法可以根据发送对象的不用而采用多种不同的行为方式。
  • 一个对象的实际类型是确定的,但可以指向对象的类型有很多

多态存在的条件

  • 有继承关系
  • 子类重写父类方法
  • 父类应用指向子类对象

注意:多态是方法的多态,属性没有多态。


  • 对象能执行哪些方法和对象左边的类型有关,和右边关系不大。
  • 父类可以指向子类但是不能调用子类独有的方法,即父类没有这个方法,实例化后的对象也不能使用这个方法。
  • 强制转换的类型必须有继承关系
public class Main {
    public static void main(String[] args) {
        // 多态,只有在程序运行中才能动态的确定

        // 一个对象的实际类型是确定的 new Student
        // 可以指向的的引用类型就不确定了,Student、Person...
        Student s1 = new Student();
        Person s2 = new Student();
        Object s3 = new Student();

        s1.run(); // 子类跑步
        s2.run(); // 子类跑步;子类重写调用的是子类的方法,如果要用父类的方法:Person s2 = new Person();
        // 只有引用类型中有的方法才能被调用
        // s3.run(); object中没有run(),会出错

        s1.sleep(); // 父类睡觉;没有重写父类方法,调用直接继承父类方法
        s2.sleep(); // 父类睡觉
        // s3.sleep(); //object中没有sleep(),会出错

        ((Student) s2).test(); // 引用类型强制转换成Student就能使用Student的方法了。
    }
}

class Student extends Person {
    @Override
    public void run() {
        System.out.println("子类跑步");
    }
    public void test(){
        System.out.println("子类测试");
    }
}

class Person {
    public void run(){
        System.out.println("父类跑步");
    }
    public void sleep(){
        System.out.println("父类睡觉");
    }
}

注意:

  1. static方法,属于类,它不属于实例,没有多态
  2. final 修饰的写入常量池,没有多态
  3. private修饰的也无法被重写,没有多态

instanceof

instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例。

  1. instanceof是测试一个对象是否为一个类的实例,返回true或者false
  2. instanceof判断的对象必须有继承关系,否则编译出错
  3. 实例化对象时,这个对象是它本身的类及其父类的实例。
  4. instanceof可以理解为某一个类是另一个类的具体的个例么,例如:【括号内的为引用类型】
    • (事物)学生 instanceof 人 ,学生是人的一个个例(事物和人有关,编译不报错)
    • (事物)学生 instanceof 事物 ,学生是事物的一个个例(事物和事物有关,编译不报错)
    • (事物)人 instanceof 人 ,人也是人的一个个例(事物和人有关,编译不报错)
    • (事物)人 instanceof 字符串 ,人不是字符串的一个个例(事物和字符串有关,编译不报错)
    • (人)人 instanceof 字符串 ,(人和字符串没有关联,编译报错)
    • (事物)人 instanceof 学生,人不一定是学生(事物和学生有关,编译不报错)
// 结构 Object->String
// 结构 Object->Person->Student
// 结构 Object->Person->Teacher
Object s3 = new Student();
System.out.println(s3 instanceof String); // false
System.out.println(s3 instanceof Student);// true
System.out.println(s3 instanceof Person);// true
System.out.println(s3 instanceof Teacher);// false
System.out.println(s3 instanceof Object);// true

// new的对象和引用类型必须有继承关系,否则编译出错
Student s1 = new Student();
//System.out.println(s2 instanceof String); 编译出错 Student和String没有关系
System.out.println(s1 instanceof Student);// true
System.out.println(s1 instanceof Person);// true
//System.out.println(s1 instanceof Teacher);/编译出错 Student和Teacher没有关系
System.out.println(s1 instanceof Object);// true


Person s4 = new Person();
//System.out.println(s4 instanceof String); //编译出错 Person和String没有关系
System.out.println(s4 instanceof Student);// false
System.out.println(s4 instanceof Person);// true
System.out.println(s4 instanceof Teacher);// false
System.out.println(s4 instanceof Object);// true

类型转换

  1. 引用类型在转换的时候,子类转父类可以自动转但是会损失子类方法
  2. 父类想调用子类方法需要强制转换,例如:((Student)Person).子类方法
posted @ 2021-09-08 20:14  Jie7  阅读(92)  评论(0)    收藏  举报