方法和类剖析

1.向方法传递对象:有两种向子例程传递参数的方法,一是传值调用,该方法把变量值复制到子例程的形式参数中,故对子例程参数的修改不会影响调用中的参数;二是引用调用,该方法传递给参数的是参数的引用,在子例程内部,该引用被用于访问调用中的实际参数,这就意味着对参数的修改会影响用于调用子例程的参数。
  a.在java中,当向一个方法传递一个简单类型的参数,如int或double时,传递的是值,因此无论接收变量发生什么事情都不会对方法以外产生影响。
  b.当向一个方法传递对象时,情况就大不一样了,因为对象是通过引用来传递的,当创建一个类类型的变量时,只能创建对对象的引用,故当向一个方法传递该引用时,接收它的参数与原来的变量会指向同一个对象,意味着向方法传递对象使用的是引用调用,修改方法内部的对象会影响作为参数的对象。
  c.java中不能直接使用引用来传递原语类型,但java定义了一系列在对象中封装原语类型的类,这些类型有Double、Float、Byte、Short、Integer、Long和Character,不仅可以通过引用来传递原语类型,而且还定义了几种可以操作这些值的方法。
2.返回对象:方法可以返回包含类类型在内的任何类型的数据,可以是java定义的,也可以是用户自己定义的;当一个方法返回对象时,对象将一直存在直到没有对它的引用为止,这时该对象就会被回收,故一个对象不会被销毁,因为方法会让它终止。
3.方法重载:在java中,同一个类的两个或多个方法可以共享一个名称,只要它们的参数声明不一样就可以,方法重载是java实现多态性的方法之一;其中一个重要限制是:每个被重载的方法的参数类型或数量必须不同,两个方法的返回类型不一样是不够的;当调用一个被重载的方法时,将执行参数与变量相匹配的方法;java提供的某些自动类型转换也可用于被重载的方法的参数,如void f(int i){},void f(double x),int i=10;double d=10.1;byte b=99;short s=10;float f=11.5f;则ob.f(i);ob.f(d);ob.f(b)转换为int型调用void f(int i),ob.f(s)将s转换为int调用void f(int i),ob.f(f)将f转换为double型调用void f(double x),但自动转换只在参数与变元之间不能直接匹配时使用;有一个术语“签名”应用于java时,指的是方法名及其参数列表,故在重载时,一个类中的两个方法不能具有相同的签名,注意的是签名不包括返回类型,因为java不使用签名进行重载解析。
4.重载构造函数:重载构造函数的每一个重载版本都会构造一个不同的对象,执行new时,它就根据指定的参数来调用合式的构造函数,通过重载一个类的构造函数可以为类的用户提供灵活的构造对象的方法;最常见的重载构造函数的原因就是允许一个对象初始化另一个对象,提供构造函数来使用一个对象初始化另一个对象的效率非常高。
5.递归:它是某一事物内部定义自己的过程,其关键在于执行调用其本身的一个语句;递归的主要优点在于比使用循环来实现某些类型的运算更清除、更简单;当编写递归方法时,必须在某处有一个条件语句来强迫方法在没有执行递归调用时返回。
6.static:通常只能通过类的对象来访问类成员,但类可以创建一个无需引用指定的实例就可以只让自己使用的成员,创建这样的成员只要在它声明之前添加关键词static;
  a.当一个成员被声明为static时,可以无需引用任何对象,而在创建该类的成员之前访问该成员;
  b.方法和变量都可以声明为static;在类以外使用static成员时,只需在点操作符之前指定其类名即可,不需创建对象;
  c.static变量由所有的类成员共享,通过一个实例修改它就意味着对所有的实例它都变化了,通过对象名或类名都可以访问static成员。
  d.static方法于普通方法之间的不同就是调用static方法不用创建任何对象,声明为static方法有几个限制:(1)、它只能调用其他static方法;(2)、它只能访问static数据;(3)、它没有this引用。
  e.有时在一个类创建对象之前,需要一些初始化类型,为了处理这些类型,java允许声明一个static代码块,static代码块在类第一次被加载时执行,故它是在使用类之前执行的。
7.嵌套类和内部类:嵌套类只被封装它的类所知,故嵌套类的作用域就局限在它的外层类当中,一个嵌套类有权访问被嵌入的类的成员,包括私有成员在内,但封装类无权访问嵌套类的成员;嵌套类有两种基本类型:有static前导修饰符和无static前导修饰符,非静态类型的嵌套类也称为内部类,它有权访问其外层类的所有变量和方法;静态嵌套类是一个使用静态修饰符的类,它只能直接访问封装类中的其他静态成员,要访问他的外层类成员,就必须通过对象引用来进行;另外,可以创建没有名称的内部类,称为匿名内部类,一个匿名内部类的对象在声明类时使用new实例化。
8.可变长度变元(varargs):以前,对于需要可变长度变元列表的方法才用两种处理方法,都不令人满意,一种是当变元的数目比较少,并且已知时,可以创建方法的重载版本,对每一个可能的方法创建一个,但其使用范围很有限;第二种是把变元保存在一个数组中,然后把该数组传递给方法,J2SE 5提供了一种新功能来简化需要可变长度变元的方法的创建过程,称为varargs;
  a.可变长度变元由三个句点指定,如static void vaTest(int ... v),其中int ... v就告诉编译器vaTest()方法可以带有零个或多个变元,而且把v隐式声明为一个int[]类型的数组;
  b.一个方法可以具有正常的参数和可变长度参数,但可变长度参数必须是方法声明的最后一个参数,如int doIt(int a,int b,double c,int ... vars){},注意只能有一个可变长度参数;
  c.重载varargs方法:可以重载带有可变长度变元的方法;重载varargs方法有两种方式,一种是可变长度参数的类型可以不同,这时java使用不同类型来确定调用哪一个重载的方法,其第二中方式是添加正常的参数,这时java同时使用变元数目和变元类型来确定调用哪一个方法。
   d.varargs可能产生歧义,发生某些预料不到的错误,如声明了static void vaTest(int ... v)和static void vaTest(boolean ... v),当调用一个vaTest();时,由于vararg参数可以为空,该调用会被翻译为是对vaTest(int ...)或者vaTest(boolean ... )的调用,两种都完全有效,从而产生了歧义。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值