您的位置:首页 > 编程语言 > Java开发

java系统学习(七) --------多态

2015-09-01 18:05 519 查看



多态的产生

程序员在开发过程中,需要在代码中编写很多方法。在具体编写时,有许多方法要实现的功能基本差不多。例如现实开发中可能会出现下列代码:

void   print1(int x)//带有一个参数的方法
{
System.out.println(2*x);
}
void print2(int x,int y)   //带有两个参数的方法
{
System.out.println(2*x+y);
}
上面的例子中,其实两个方法所实现的功能基本一样,只不过参数的形式不同。如果所有的方法都像上面的实例一样,那么整个程序中会出现很多的方法名。对于程序员来说,在调用方法时,会很容易出错。多态可以解决这种情况。

多态的概念

多态就是拥有多种形态。多态主要是指拥有相同的形式,但不同的参数实现不同的功能。一个类可以拥有多个构造函数,这些构造函数使用相同的名称,

但是参数类型与个数却不同,这就是多态的一种形式。

使用多态

方法多态一定要遵守两个规则

1.方法名称一定要一样。

2.传入的参数类型一定要不一样。

public class student  //创建一个学生类
{
//创建成员变量
int x;
int y;
int z;
void print(int x)  //创建了一个print方法
{
System.out.println(2*x);

}
void print(int x,int y)   //创建了一个带两个整型参数的print方法
{
System.out.println(2x+Y);
}

void print(int x, int y, int z)//创建了带3个整型参数的print方法
{
System.out.println(2*x+Y*z);
}


重载和覆盖的实例对比

重载是多态的一种,它需要遵守方法名一样,传入的参数类型或者个数不一样。

而覆盖 是子类对父类方法的覆盖,需要 方法名和 参数类型 个数都一样。

传值引用和传址引用

传值引用主要是针对基本数据类型而言。所谓传值引用就是在进行变量的传递过程中,传递的是变量实际的值,即变量实际值的复制。由于一个变量值不会影响另一个变量值的改变,所以操作后的结果不会影响原来的值。

public class  test2
{
public static void main(String[] args)
{
int a=10;    //创建成员变量a
int b=a;       //创建成员变量b
System.out.println("在重新给a赋值前a的值"+a+" "+"b的值"+b);
a=30;      //为变量a重新赋值
System.out.println("在重新给a赋值后a的值"+a+" "+"b的值"+b);
}
}


结果:

在重新给a赋值前a的值 10 b的值是10

在重新给a贼值后a的值 30 b的值是10

从上面的程序段可以看出,.‘a'值的改变并没有对“b”的值产生任何影响,这就是传值引用的特点。

传址引用主要是针对对象操作,它传递的是一个对象句柄的复制。也就形成了多个变量操作一个对象的局面,任何一个针对句柄操作的变量,都会影响到其他的变量。

public class test3
{
int x=2;    //创建成员变量
public static void main(String[] args)  //主方法
{
test3 t=new test3();   //创建对象t
test3 t1=t;                  //把对象t赋值给t1
System.out.println("测试前的数据:");
System.out.println("输出两个数据值:");
System.out.println("t.x="+t.x);
System.out.println("t1.x="+t1.x);
System.out.println("测试后的数据:");
t .x=3;                                                      //设置对象t的x变量为3
System.out.println("输出两个数据值:");
System.out.println("t.x="+t.x);
System.out.println("t1.x="+t1.x);
}
}


结果:

测试前的数据:

输出两个数据值

t.x=2;

t1.x=2;

测试后的数据

输出两个数据值

t.x=3;

t1.x=3;

上面的程序段可以看出, "t.x”的值发生变化,"t1.x”的值也紧随着改变,这就是传址引用的特点

绑定

绑定就是对象方法的调用,准确地说,就是对象句柄与方法的绑定。绑定分为静态绑定和动态绑定。

静态绑定

当声明一个方法为“private" , "static" , "final" ,或者声明一个构造函数时,编译器清楚地知道是调用哪个方法,不存在与实际类型不匹配的现象,这就称为静态绑定。静态绑定不存在多态的问题。

动态绑定

动态绑定只用在程序运行的过程中,其会根据程序传递的参数不同,而调用不同的方法,这种绑定只有在程序运行期间才会发生,即动态绑定有着不确定性。动态绑定存在多态的问题。

常见问题

动态和静态编译是什么

答:允许对对象进行不同的操作,但具体的操作却取决于对象的类型。 程序在编译的时候,什么函数对哪个对象执行什么操作都已经确定,这就称做静态编译。多态是动态编译,动态编译就是在程序执行的过程中,根据不同对象类型有不同的绑定,其通过一个方法接口,实现多个不同的实现过程。这依赖于编译时编译器对同一个方法不同参数的

识别。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: