2011-5-18的笔记

   上课日忙,昨天没看。明天、后天有空,应该都会写。话说这章很恶劣,都是关于引用类型是什么,指向的对象是什么,其调用方法(静态方法和非静态)、访问成员变量时遵循的规则什么,绕来绕去。

2011-05-18
1、引用的比较。引用的本质是地址,指向对象。比较(指用==和!=比较)就是看两个引用是否指向同一对象。表面上是任何引用都可以比较,但java是聪明的,两个没有任何联系的对象的比较是没有任何意义的。所以,java规定:
(1)相同类型的引用可以比较;
(2)不同类型的引用,其中一个类型(引用类型)必须派生自另一个。
2、重写方法的调用问题。为突出其与成员变量的不同,引前天9的设定稍作修改:


 类A的子类A_son重写了A的方法aMember(),测试类中,引用a类型为A,指向A_son的对象。按照前天理论,系统应当默认地调用引用类型的方法,打印A。事实却是打印了“A_son”,因为方法的掉用是按对象类型的,与成员变量的访问按引用类型是不同的。
3、重写规则。要声明的是,重写基于继承,不能继承方法则不能重写之,不必遵循重写规则。
(1)若返回类型为基本数据类型,则重写后的方法返回类型不能变;若放回类型为对象的引用,则重写后的返回类型必须相同或其派生。这里要注意的是,String不是基本数据类,即返回类型为String的方法被重写后,遵循的是第二类型。如上述2,将父类A中的方法返回类型改为Object(String派生自Object),编译是通过的。
(2)访问级别不能缩小,可以扩大。即protected型的方法可重写成public型方法但不能重写成private
(3)不能重写final、static型方法。
(4)方法名、参数列表(包含参数个数和每个参数的类型)必须相同。如果名同,参数列表却不同,则是子类继承类父类方法后,再对这个方法重载。
4、上面已说,非静态方法是不能重写的。但子类可通过“重写”父类静态方法的形式将其隐藏掉。为说明此问题,改2的设定如下(只是把父类和子类的方法变为静态)


 首先,编译时可通过的,“重写”成功,但这次打印的结果却是“A”。这说明,“重写”并非真正的重写,而应称之为隐藏,即将子类中实际是存在两个同名、同参数列表的方法,但为了“和谐”,忍心将父类的静态方法和谐掉。要把这个被和谐的方法给调用出来,是有特定方法的,先不提。这里为什么会打印“A”呢?可以这样理解,静态方法可以看作是成员变量了(静态已经有成员变量的性质在里面),遵循的是成员变量访问的默认规则(参考2011-5-16的9)。于是,这个特定方法就出来了:声明引用,类型是父类(指向的对象可以是父类的也可以是子类),在通过这个引用调用被和谐的方法。如果要调用子类的“重写”后的方法呢?这个容易,声明一个指向子类的引用(引用类型必须是子类),再调用。
5、重写时,super.<被重写方法名>只能在子类内使用,结果是调用被重写的方法。
6、重载规则。重载比重写稍微简单一点,但也不简单到哪里去。重载是在同一类中的,限制词可任意改,不同的主要是参数列表。因此调用被重载方法还是重载方法,是看调用时是什么参数列表。不同参数个数的好说,比较困难的是相同参数个数,要依靠参数类型来加以区别。分如下3中情况:
(1)参数是基本数据类型。设定,两个方法①A(int a,int b )和②A(double a,double b),再设a、b、c、d前两个是int型,后两是double型,下面是调用时的实际情况:
                                I、A(a,b)调用①;II、A(c,d)调用②;III、A(a,c)调用②
I、II好说,III则说明,a会自动升格为为double型,调用②。实际上,系统的寻找方法规则是:首先寻找直接匹配的方法,无则对参数升格后在匹配方法(降格是不允许的)
(2)参数是引用类型。因为引用类型不像基本数据类型,不存在升降格之说,却存在子类之说。设定:A_son_son extends A_son extends A,以及它们各自的引用类型为a,as,ass。再设两个方法①B(A x)②;B(A_son x),下面又是实际运行情况:
                                I、B(a)调用①;II、B(as)调用②;III、B(ass)调用②
I、II好说,III则说明,虽然A和A_son都能兼容A_son_son型引用,但系统会找最能兼容的去匹配(最能兼容:“隔代数”最小)
(3)基本数据类型与引用型混合的,各自遵循自己的升降格规则。
7、final方法可继承。final与abstract含义相反,不能同时修饰某个类或者方法。
8、抽象方法只能在抽象类中,无方法体,说明abstract不能与private并列修饰(private表明只能在本类中使用,而抽象类本身是无实际用途的,只能被扩展)






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值