多态

多态格式:父类类型  变量名 = new 子类类型();

多态体现为父类引用变量可以指向子类对象:定义了一个父类类型的引用,指向新建的子类类型的对象,由于子类是继承他的父类的,所以父类类型的引用是可以指向子类类型的对象的。

多态对变量的引用以父类为准,如下代码:

class Person{
    int age = 11;
}
class Student extends Person{
    int age = 1;
}
public class test {
    public static void main(String args[]) {
        Person p  =new Student();
        System.out.println(p.age);// 输出: 11  本质上Studnet的引用是Person,所以age是Person中的age
        }
}

当子类和父类中存在同名方法时,子类覆盖父类的方法,如下代码:

class Person{
    void show() {
        System.out.println("Person");
    }
    
}
class Student extends Person{
    void show() {
        System.out.println("Student");
    }

}
public class test {
    public static void main(String args[]) {
        Person p  =new Student();
        p.show();//输出 Student
        }
}

注,父类无法访问子类独有的方法

class Person{
    void show() {
        System.out.println("Person");
    }
    
}
class Student extends Person{
    void show() {
        System.out.println("Student");
    }
    void study(){//Studnet中独有的
        System.out.println("Study");
    }

}
public class test {
    public static void main(String args[]) {
        Person p  =new Student();
        p.show();
        p.study();//报错
        }
}

子类的引用就是父类,因此不需要特别声明。但父类想转为子类,则需要手动转换。如下代码:

class Person{
    void show() {
        System.out.println("Person");
    }
    
}
class Student extends Person{
    void show() {
        System.out.println("Student");
    }
    void study(){
        System.out.println("Study");
    }

}
public class test {
    public static void main(String args[]) {
        Person p  =new Student();
        p.show();//Student
        Student p1 = (Student) p;//强制将Person p转化为Student类
        p1.study();//study
        }
}

判断变量是否为所要求的类或其子类,使用关键词instanceof,如下代码:

class Person{
}
class Student extends Person{
    void student() {
        System.out.println("Student");
    }
}
class Teacher extends Person{
    void teacher(){
        System.out.println("Teacher");
    }
}
public class test {
    public static void main(String args[]) {
        Person p  =new Student();
        if(p instanceof Teacher) {
            Teacher p1 = (Teacher) p;//强制转换
             p1.teacher();
        }else {
            Student p1 = (Student) p;//强制转换
            p1.student();
        }
        /////////////输出:Student
    }
}

 

posted @ 2023-11-05 17:10  kandhera  阅读(17)  评论(0)    收藏  举报