欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java学习笔记11(面向对象四:多态)

程序员文章站 2022-03-21 21:10:25
多态: 举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person 多态体现为:父类引用变量可以指向子类对象 多态的前提:必须有子父类关系或者类实现接口关系,否则无法完成多态 在使用多态后的父类引用变量调用方法时,会调用子类重写后 ......

多态:

举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person

多态体现为:父类引用变量可以指向子类对象

多态的前提:必须有子父类关系或者类实现接口关系,否则无法完成多态

在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法

 

举例:

public class Fu {
    public void show(){
        System.out.println("父类的show方法");
    }
}
public class Zi extends Fu{
    public void show(){
        System.out.println("子类重写父类的show方法");
    }
}
public class Test {

    public static void main(String[] args) {
        //利用多态性
        //公式:父类类型(接口类型)变量 = new 子类的对象
        Fu f = new Zi();
        f.show();
    }

}
//输出:子类重写父类的show方法

抽象类多态:

public abstract class Person {
    public abstract void work();
}
public class Teacher extends Person {
    public void work() {
        System.out.println("Teacher在工作");
    }

}
public class Test {

    public static void main(String[] args) {
        //抽象类多态
        Person p = new Teacher();
        p.work();
    }

}
//输出:Teacher在工作

接口多态:

public interface Work {
    public abstract void work();
}
public class Student implements Work{
    public void work(){
        System.out.println("Student在工作");
    }
}
public class Test {

    public static void main(String[] args) {
        //接口多态
        Work w = new Student();
        w.work();
    }

}
//输出:Student在工作

 

 

多态中成员方法的特点:

public class Fu {
    int a = 1; 
}
public class Zi extends Fu{
    int a = 2;
}
public class Test {
    public static void main(String[] args) {
        Fu f = new Zi();
        System.out.println(f.a);
    }
}
//输出:1

成员变量:

编译的时候,参考父类中有没有这个变量,如果有,编译成功,如果没有,编译失败

运行的时候,运行的是父类中的变量值

总结:编译运行全看父类

成员方法:

父类中没有声明或者定义的方法无法调用,

子类如果重写,调用的是子类方法,子类没有重写,调用父类方法

总结:编译看父类,运行看子类

 

 

instanceof关键字:

用于比较引用数据类型:

public class Test {
    public static void main(String[] args) {
        //Person p = new Student();
        Person p = new Teacher();
        boolean b = p instanceof Student;
        System.out.println(b);
    }
}
//输出:false

 

多态转型:

向上转型:

 java是一种强制数据类型的语言,参与运算的数据,需要保证类型的统一

如Person p = new Student();

两个数据类型是不同的,但是成功运行

因为这里出现了自动类型提升,将取值范围小的自动提升为取值范围大的

范围小的,看成是子类,范围大的,看成是父类

这里子类提升到了父类的类型

 

优点:可以调用子类和父类的共有内容

缺点:无法调用子类的特有内容

 

如果想调用子类的特有内容:

向下转型(类似以前提到的强制转型):

Student s = (Student)p;

由父类类型强制转回子类的类型

 

好处:可以调用子类特有的功能

 

转型的案例:

public abstract class Animal {
    public abstract void eat();
}
public class Cat extends Animal {
    public void eat(){
        System.out.println("猫在吃");
    }
    public void catchMouse(){
        System.out.println("猫在抓老鼠");
    }
    
}
public class Dog extends Animal {
    public void eat(){
        System.out.println("狗在吃");
    }
    public void lookHome(){
        System.out.println("狗在看家");
    }
}
public class Test {
    public static void main(String[] args) {
        Animal a1 = new Cat();
        Animal a2 = new Dog();
        a1.eat();
        a2.eat();
        //向下转型,调用子类的特有方法
        //使用if .instanceof. 为了确保安全性
        if(a1 instanceof Cat){
            Cat c = (Cat)a1;
            c.catchMouse();
        }
        if(a2 instanceof Dog){
            Dog d = (Dog)a2;
            d.lookHome();
        }
    }
}
/*输出:
 * 猫在吃
 * 狗在吃
 * 猫在抓老鼠
 * 狗在看家
 */