当前位置: 移动技术网 > IT编程>开发语言>Java > Java学习笔记11(面向对象四:多态)

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

2018年01月08日  | 移动技术网IT编程  | 我要评论

多态:

举例:描述一个事物的多种形态,如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();
        }
    }
}
/*输出:
 * 猫在吃
 * 狗在吃
 * 猫在抓老鼠
 * 狗在看家
 */

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网