zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java基础知识:多态

2023-09-27 14:22:12 时间

一. 多态

1.在Java中,多态体现在两个方面:由方法重载实现的静态多态性(静态多态)和方法重写实现的动态多态性(运行时多态)

2.多态的体现:父类的引用指向了子类对象,父类的引用也可以接收自己的子类对象。

3.多态的前提:类与类之间要么继承,要么实现,同时存在一个前提:重写。

4.多态的弊端:只能使用父类的引用访问父类成员。

5.多态的特点:

Anima a=new cat();

在多态中,非静态成员函数,成员函数在多态调用时,编译看左边,运行看右边。

在多态中,静态成员函数,无论编译和运行,都看左边。

在多态中,成员变量的特点,无论编译和运行,都参考左边。

案例说明:

A类:
public class A {
    static int k=8;
    int m=8;
    public void liu(){
        System.out.println("我是A");
    }
    public static void fang(){
        System.out.println("我是A fang");
    }

}

B类:

public class B extends A
{
    static int k=3;
    int m=5;
    public void liu(){
        System.out.println("我是B liu");
    }
    public void jian(){
        System.out.println("我是 b jian");
    }
    public static  void fang(){
        System.out.println("我是 b fang");
    }
}

Test类:

public class Test {
    public static void main(String args[]){
      A a=new B();
       System.out.println("m:"+a.m+"===k:"+a.k);
        B b=new B();
        System.out.println("m:"+b.m+"===k:"+b.k);

}

}

结果为:

m:8===k:8
m:5===k:3

结论为:在多态中,成员变量(静态或者非静态)的特点,无论编译和运行,都参考左边。

Test类:

public class Test {
    public static void main(String args[]){
      A a=new B();
        System.out.println("liu():");
        a.liu();//liu为非静态成员函数,显示右边,即子类的函数
        System.out.println("=======");
        a.fang();//fang为静态成员函数,显示左边,即父类中的函数
        System.out.println("=======");
        //a.jian();//报错,jian方法没有在A中定义。
        B b=new B();
        b.jian();
        System.out.println("bijiao:"+a+"===="+b);


    }
}

结果为:

liu():
我是B liu
=======
我是A fang
=======
我是 b jian
bijiao:com.stylefeng.guns.modular.handler.B@2a3046da====com.stylefeng.guns.modular.handler.B@2a098129

Process finished with exit code 0

结论为:liu()方法为非静态成员函数,fang()为静态成员函数,

在多态中,非静态成员函数,成员函数在多态调用时,编译看左边,运行看右边。看a.liu()

在多态中,静态成员函数,无论编译和运行,都看左边。看a.fang()

A a=new B();a的hash值和 B b=new B();的b的hash值时不同的,不是同一个对象。

二  子类和父类的变量获取

父类:
public class Fu {
    int m=4;
}

子类:

public class Zi extends Fu
{int m=5;
public void show(){
    System.out.println("父类:"+super.m+"子类:"+this.m);
}
}

调用:

public class Test {
public static void main(String args[]){
Zi z=new Zi();
z.show();
}
}

结果:

父类:4子类:5

Process finished with exit code 0
结论:

子、父类中的变量:1.如果子类出现与父类相同名字的非私有变量,子类要访问本类的变量用this,子类要访问父类中的变量用super。