传值引用主要是针对基本数据类型而言。所谓传值引用,就是在进行变量的传递过程中,传递的是变量的实际的值,是一个新的拷贝,一个变量值不会影响另一个变量值得改变。
eg:
public class fun1
{
public static void main(String[] args)
{
int a=5;
int b=a;
System.out.println("在重新给a赋值前a的值:"+a+" "+"b的值:"+b);
a=20;
System.out.println("在重新给a赋值后a的值:"+a+" "+"b的值:"+b);
}
}
传址引用主要是针对对象操作,它传递的是一个对象句柄的拷贝。也就形成了多个变量操作一个对象的局面,任何一个针对句柄操作的变量,都会影响到其他变量。
eg:
public class fun2
{
int x=2;
public static void main(String[] args)
{
fun2 f=new fun2();
fun2 f1=f;
System.out.println("测试前的数据:");
System.out.println("输出两个数据值:");
System.out.println("f.x="+f.x);
System.out.println("f1.x="+f1.x);
System.out.println("测试后的数据:");
f.x=19;
System.out.println("输出两个数据值:");
System.out.println("f.x="+f.x);
System.out.println("f1.x="+f1.x);
}
}
绑定
在Java中,绑定就是对象方法的调用。准确地说,就是对象句柄与方法的绑定。绑定分为静态绑定和动态绑定。
当声明一个方法为private\static\final,或者声明一个构造器时,编译器清楚地知道是调用哪个方法,不存在与实际类型不匹配的现象,这就是静态绑定。静态绑定不存在多态问题。
动态绑定只用于程序运行的过程中,其会根据程序传递的参数不同,而调用不同的方法,这种绑定只有在程序运行期间才会发生,即动态绑定有着不确定性。动态绑定存在多态的问题。
超类
Java语言是一门面向对象的程序设计语言,其类库中所有的类都从Object类中继承而来,即Object类是java类库中所有类的父类。
有时,可以使用Object类型得变量,来代表任何类型的对象。
将子类实例赋给父类变量时,系统会自动完成转换;但将父类实例赋给子类变量时,必须进行类型转换。
通用编程
任何类型的实例都可以使用Object这个超类的变量来替代,因为Object类是所有类的父类。根据多态的原理,可以使用父类的类型代替子类,但是不能用子类的类型代替父类,因为父类中有的方法函数,子类中都有,而子类中的方法函数,父类中不一定都有。
动态和静态编译
允许对对象进行不同的操作,但具体的操作却取决于对象的类型。
程序在编译的时候,什么函数对哪个对象执行什么样的操作都已经确定,换句话说称作静态编译。多态是动态编译,动态编译就是在程序执行的过程中,根据不同对象类型有不同的绑定,其通过一个方法接口,实现多个不同的实现过程。这就依赖于编译时编译器对同一个方法不同参数的识别。
绑定与多态的联系
将方法的调用连接到方法本身被称为绑定。当绑定发生在程序运行之前,被称作前绑定(earlybinding),而在程序运行的时候,根据对象的类型来决定绑定方法被称为后绑定,也叫运行时绑定(run-time binding)或动态绑定(dynamic binding).
Java的所有方法都采用后绑定,通常情况下,人们常常会将多态性同java的那些非面向对象的特性混淆。需要特别注意的是“不是后绑定的,就不是多态性”,不用考虑是不是该采用后绑定,这一切都是自动的。
多态与重载的区别
重载是在一个类里,名字相同但参数不同的方法。多态是为了避免在父类里大量重载,而引起代码臃肿且难于维护的解决方案。多态表现形式:重载和覆盖。