一.Java中多态的定义
1.体现出多态的前提必须要有子父类关系,或者是类实现接口的关系
2.多态的最终体现就是:父类引用指向子类对象;父类引用调用方法时,如果子类重写了该方法,会调用子类重写后的方法,如若没有重写该方法,会调用父类中的方法(成员方法,在编译时,会检索父类,如果父类中有该方法,编译成功!运行时会优先运行子类重写后的方法)。例:
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:55 2018/04/22
*/
public class Father {
public void test_01(){
System.out.println("Father");
}
}
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:56 2018/04/22
*/
public class Son extends Father{
//重写父类的方法
public void test_01() {
System.out.println("Son");
}
}
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:58 2018/04/22
*/
public class Test {
public static void main(String[] args){
//父类引用指向子类对象
Father f = new Son();
//使用父类引用调用子类重写后的方法,以下打印结果为Son
f.test_01();
}
}
注释掉子类重写后的方法,再次调用,如下:
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:56 2018/04/22
*/
public class Son extends Father{
//重写父类的方法
/*public void test_01() {
System.out.println("Son");
}*/
}
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:58 2018/04/22
*/
public class Test {
public static void main(String[] args){
//父类引用指向子类对象
Father f = new Son();
//由于子类没有重写该方法,所以调用父类的方法,打印结果为Father
f.test_01();
}
}
二.成员变量的特点
成员变量,编译的时候检索父类,父类中有,编译成功;运行时,也会运行父类中的成员变量的值,例:
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:55 2018/04/22
*/
public class Father {
//父类中的成员变量a
int a = 100;
public void test_01(){
System.out.println("Father");
}
}
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:56 2018/04/22
*/
public class Son extends Father{
//子类中的成员变量a
int a = 1;
//重写父类的方法
public void test_01() {
System.out.println("Son");
}
}
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:58 2018/04/22
*/
public class Test {
public static void main(String[] args){
//父类引用指向子类对象
Father f = new Son();
//使用父类引用调用成员变量,打印结果为100
System.out.println(f.a);
}
}
三.instanceof关键字
instanceof是一个比较运算符,判断一个引用类型是否属于某个类型(要有继承或实现关系)的对象,例:
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:58 2018/04/22
*/
public class Test {
public static void main(String[] args){
//父类引用指向子类对象
Father f = new Son();
//判断f 是否是Father类型的对象,返回的是boolean值,以下打印结果为true
boolean b = f instanceof Father;
System.out.println(b);
}
}
四.多态中的向上、下转型
Java中,父类引用指向子类对象,已经做了自动类型提升,将子类 类型提升为父类,这就是向上转型。但有时候,我们要用到子类中特有的方法,就需要向下转型。例:
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:56 2018/04/22
*/
public class Son extends Father{
//重写父类的方法
public void test_01() {
System.out.println("Son");
}
//子类中特有的方法
public void son(){
System.out.println("我是子类");
}
}
package com.xiao.variable;
/**
* @Author 笑笑
* @Date 19:58 2018/04/22
*/
public class Test {
public static void main(String[] args){
//父类引用指向子类对象
Father f = new Son();
//向下转型,要强制转换
Son s = (Son) f;
//子类对象调用子类特有的方法,打印结果为“我是子类”
s.son();
}
}