一、什么是多态?
什么是多态?所谓多态就是引用变量指向的具体类型和通过该引用变量调用的方法在编译时并不确定,而是在程序运行期间才确定。具体体现是父类引用指向子类对象,或者是接口引用指向了接口实现类的对象
多态的存在有3个条件:1)要有继承 2)要有重写3)父类引用指向子类对象
二、多态的使用规则
2.1、继承类
2.2、实现接口
2.1、继承类
1、继承普通类
2、继承抽象类
结论一:多态情况下,子父类存在同名的成员时,同名普通方法b()访问子类,其余都是访问父类成员(同名静态属性a、同名非静态属性b、同名静态方法a())
代码:
public abstract class AbstractFather {
static int a = 10;
int b = 20;
public static void a() {
System.out.println("父类静态");
}
public void b() {
System.out.println("父类非静态");
}
}
public class SonOfAF extends AbstractFather{
static int a = 1;
int b = 2;
public static void a() {
System.out.println("子类静态");
}
public void b() {
System.out.println("子类非静态");
}
}
public class Father {
static int a = 10;
int b = 20;
public static void a() {
System.out.println("父类静态");
}
public void b() {
System.out.println("父类非静态");
}
}
public class Son extends Father{
static int a = 1;
int b = 2;
public static void a() {
System.out.println("子类静态");
}
public void b() {
System.out.println("子类非静态");
}
}
public class Test {
public static void main(String[] args) {
AbstractFather father = new SonOfAF();
father.a();
father.b();
System.out.println(father.a);
System.out.println(father.b);
Father father = new Son();
father.a();
father.b();
System.out.println(father.a);
System.out.println(father.b);
}
}
2.2、实现接口
接口中的属性默认由public static final修饰,由于是final修饰,所以必须赋初值;
接口中的方法默认由public abstract修饰
java8以后,允许在接口里定义默认方法和静态方法,如下图:
将第7行注释掉,我们运行一下看看结果如何
结论二:与结论一一致,实现类和接口存在同名的成员时,同名普通方法a()访问的是实现类,其余访问的是接口成员(同名属性a和同名静态方法b())
代码:
public class Implem implements Intf{
int a = 1;
//发现只需要实现a()方法,因为只有a()是抽象方法
@Override
public void a() {
System.out.println("实现类");
}
public static void b() {
System.out.println("实现类静态方法");
}
}
public interface Intf {
int a = 10;
void a();
static void b() {
System.out.println("接口静态方法");
}
default void c() {
System.out.println("默认方法");
}
}
public class Test {
public static void main(String[] args) {
Intf intf = new Implem();
intf.a();
// intf.b();//为什么不能调用b()?因为一个类可以实现多个接口。如果2个接口具有相同的 static 方法,则它们都将被继承,编译器不知道该调用哪个
Intf.b();//但可以用接口类名调用静态方法
intf.c();
System.out.println(intf.a);
}
}