




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAVA面试题解惑系列(三)变量(属性)的覆盖( H; b4 L$ i+ Q作者:臧圩人(zangweiren)5 p/ V9 o2 网址:# e7 B% u; J6 g* D- z+ b+ B. SA, L1 t转载请注明出处!6 : N* v+ u9 g9 F6 D$ E9 |7 q; m, |! dY, s1 u我们来看看这么一道题:Java代码class ParentClass 3 5 C2 ? _ 3 C% V: I public int i = 10; & G, d: & * m; Lpublic class SubClass extends ParentClass & P) F3 z6 o/ B: v% J; r. e& |4 H; p public int i = 30; public static void main(String args) 7 M( t4 j! M2 d* H4 P ParentClass parentClass = new SubClass(); SubClass subClass = new SubClass(); % + M/ L0 S( d% s$ , G System.out.println(parentClass.i + subClass.i); # ( g9 d X5 v1 S 0 A1 控制台的输出结果是多少呢?20?40?还是60?# T! s! z, W/ |6 N/ d p F7 t. + N# H U8 p; s变量,或者叫做类的属性,在继承的情况下,如果父类和子类存在同名的变量会出现什么情况呢?这就是这道题要考查的知识点变量(属性)的覆盖。% v1 l( - : c这个问题虽然简单,但是情况却比较复杂。因为我们不仅要考虑变量、静态变量和常量三种情况,还要考虑private、friendly(即不加访问修饰符)、protected和public四种访问权限下对属性的不同影响。我们先从普通变量说起。依照我们的惯例,先来看一段代码:/ l# z% E9 ) - R# BJava代码- q, R$ o: 9 h( s& 5 g, 5 aclass ParentClass 3 % N/ I* $ Qm; d$ q private String privateField = 父类变量-private; 6 w& * ?. N$ |- b C /* friendly */String friendlyField = 父类变量-friendly; protected String protectedField = 父类变量-protected; $ Z; o! r5 n5 g2 1 H# Y: G% J+ |* b public String publicField = 父类变量-public; / private的变量无法直接访问,因此我们给他增加了一个访问方法 public String getPrivateFieldValue() return privateField; , R. r; T- T# i* z8 w$ I# T$ L - T/ q2 3 X5 l2 P public class SubClass extends ParentClass & pY$ O. A% x- O; ) % z private String privateField = 子类变量-private; 7 _- . c* V, 6 Z7 r6 q$ n b/ # # r /* friendly */String friendlyField = 子类变量-friendly; + r& Z3 w$ i, L& E F. t& l+ 7 s9 tD! y/ y6 J( k protected String protectedField = 子类变量-protected; ! M B1 E7 R/ r7 f( d# h/ q. K. M! public String publicField = 子类变量-public; r+ n7 g M, L7 R / private的变量无法直接访问,因此我们给他增加了一个访问方法 ) t: D7 b v8 X9 ! L public String getPrivateFieldValue() return privateField; . J- ! , VZ6 S! : X/ e4 s/ 9 G7 o9 S# e3 p M7 public static void main(String args) / 为了便于查阅,我们统一按照private、friendly、protected、public的顺序 , Q( f a6 3 i( U4 x / 输出下列三种情况中变量的值 & . , T/ B: 2 Y4 U8 1 i / ParentClass类型,ParentClass对象 YE( C4 P, - ?. a( N ParentClass parentClass = new ParentClass(); System.out.println(ParentClass parentClass = new ParentClass();); System.out.println(parentClass.getPrivateFieldValue(); ! p( X) h6 k7 V System.out.println(parentClass.friendlyField); System.out.println(parentCtectedField); , , V; W: J7 N System.out.println(parentClass.publicField); - w! u) zk4 z$ i4 x$ ! y. Q% n- |. W. h1 sh System.out.println(); # , K/ n/ v9 g_- s Y / ParentClass类型,SubClass对象 l! L2 w& & ?# S% l0 z- _ ParentClass subClass = new SubClass(); System.out.println(ParentClass subClass = new SubClass();); System.out.println(subClass.getPrivateFieldValue(); 1 B/ Q4 H6 P* : W6 R2 g3 m System.out.println(subClass.friendlyField); : g6 d! O. u9 e- . h4 - O System.out.println(subCtectedField); System.out.println(subClass.publicField); System.out.println(); p) |* l- z$ / n; Q, E; I: n / SubClass类型,SubClass对象 + t/ K% l7 y: ) Y- Z8 C SubClass subClazz = new SubClass(); - B4 P+ u3 w( Z. r5 2 K e! w! g System.out.println(SubClass subClazz = new SubClass();); System.out.println(subClazz.getPrivateFieldValue(); + / T& $ v6 w L, u3 u* r) F) n System.out.println(subClazz.friendlyField); System.out.println(subCtectedField); ) n e; g; S0 _0 B% p& q% k System.out.println(subClazz.publicField); 9 p?t% s3 M1 y0 j这段代码的运行结果如下:0 ?$ H8 s: q7 y1 K8 n1、ParentClass parentClass = new ParentClass();2、父类变量-private( I) I8 v* # W6 k3 e; 7 h. j3、父类变量-friendly|0 A, F# l B 6 z0 D% Y4、父类变量-protected5、父类变量-public6、7、ParentClass subClass = new SubClass();# Y* g7 O8 h5 e+ t8、子类变量-private2 o2 A3 q& m3 u5 M I8 F0 a r9、父类变量-friendly3 v b5 w% V. m) d10、父类变量-protected11、父类变量-public12、13、SubClass subClazz = new SubClass();2 0 N; U* z9 k M Q- 14、子类变量-private; F* d* J6 f9 m/ D f1 u15、子类变量-friendly16、子类变量-protected. D* y1 V* g2 R$ o. WQ, K( 17、子类变量-public* u7 x8 H; Y6 L& A9 p& s( u3 h9 c8 N* k9 B7 ! 9 U从上面的结果中可以看出,private的变量与其它三种访问权限变量的不同,这是由于方法的重写(override)而引起的。关于重写知识的回顾留给以后的章节,这里我们来看一下其它三种访问权限下变量的覆盖情况。分析上面的输出结果就会发现,变量的值取决于我们定义的变量的类型,而不是创建的对象的类型。在上面的例子中,同名的变量访问权限也是相同的,那么对于名称相同但是访问权限不同的变量,情况又会怎样呢?事实胜于雄辩,我们继续来做测试。由于private变量的特殊性,在接下来的实验中我们都把它排除在外,不予考虑。由于上面的例子已经说明了,当变量类型是父类(ParentClass)时,不管我们创建的对象是父类(ParentClass)的还是子类(SubClass)的,都不存在属性覆盖的问题,因此接下来我们也只考虑变量类型和创建对象都是子类(SubClass)的情况。Java代码2 N) s4 y/ G3 cv0 H. . kclass ParentClass ! B# x9 |% ; c5 L& I& d /* friendly */String field = 父类变量; ; 4 g N n) C5 0 ! d: U d 6 A0 k6 6 G$ U8 Opublic class SubClass extends ParentClass protected String field = 子类变量; 2 * : u& W% R& f2 K+ q# z2 F; H public static void main(String args) SubClass subClass = new SubClass(); System.out.println(subClass.field); ; pM9 O+ t6 x9 T, E: , T1 / |! o: M- e, g: D运行结果:1 r. F- a; b0 9 7 v& c0 j1、子类变量0 u6 z: s1 N; H+ J: Q( t% H1 C, 5 Z3 m) C$ EJava代码+ L0 H H( e6 ?9 j W% Dclass ParentClass + s) P. I8 & B, + C; S public String field = 父类变量; $ n ; X! p4 h; V , O& m7 N o+ m2 s$ O3 c* O% , S, q6 ) Gpublic class SubClass extends ParentClass 9 & v3 c& G; X, E X2 V$ F protected String field = 子类变量; 2 w: a2 g; O QD$ PQ0 k. u. V3 y* b- v9 C5 h6 A7 # o public static void main(String args) ; e E7 s; |9 S( k. cc SubClass subClass = new SubClass(); System.out.println(subClass.field); 8 h- M- $ 0 ?0 Q+ 7 u. e$ h- Y J! E3 q运行结果:& f: M h& + O8 u7 O1、子类变量, u7 6 Q * l5 |# $ j上面两段不同的代码,输出结果确是相同的。事实上,我们可以将父类和子类属性前的访问修饰符在friendly、protected和public之间任意切换,得到的结果都是相同的。也就是说访问修饰符并不影响属性的覆盖,关于这一点大家可以自行编写测试代码验证。1 n8 c# V+ P- f0 t% j8 m对于静态变量和常量又会怎样呢?我们继续来看:Java代码, z9 n- ) Z9 D+ ?* c! P. p: V, uclass ParentClass public static String staticField = 父类静态变量; . l) G7 D8 s0 |- D8 L3 o public final String finalField = 父类常量; - x t$ P, b( e0 y7 L. p( Z- J2 R public static final String staticFinalField = 父类静态常量; # e8 E2 w% w. Y 7 c; O m V+ C) b2 w* e% H+ f6 public class SubClass extends ParentClass public static String staticField = 子类静态变量; 8 u7 l/ ) p1 g( T public final String finalField = 子类常量; public static final String staticFinalField = 子类静态常量; : ( H# I8 |5 B m public static void main(String args) SubClass subClass = new SubClass(); System.out.println(SubClass.staticField); System.out.println(subClass.finalField); System
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 解析卷冀教版8年级下册期末试题【研优卷】附答案详解
- 2025年在线教育平台互动教学工具应用与用户满意度分析报告
- 2025年工业互联网平台雾计算协同机制与工业互联网平台数据治理技术标准化报告
- 解析卷人教版(五四制)6年级数学下册期末试题附参考答案详解(模拟题)
- 2025至2030年中国白芷行业市场深度分析及投资策略咨询报告
- 华东师大版7年级下册期末试题及完整答案详解【有一套】
- 会员注册协议需要明确条款
- 国企企业面试题库附答案详解(轻巧夺冠)
- 解析卷-青岛版9年级数学下册期末试题【各地真题】附答案详解
- 考点解析-黑龙江省尚志市中考数学真题分类(丰富的图形世界)汇编专项训练试题
- 全国2017年4月自学考试00149国际贸易理论与实务试题答案
- 2023年农村留守女童性侵状况综合调查报告
- 空压机验证方案(拟定)
- 客户报修记录表
- 肉的分割与分级课件
- 电液伺服控制阀和比例阀课件
- 教育培训机构保密协议范本
- 《西方史学史》课件第一章
- 中学英语校本课程教材(Word)
- 甲醇溶液浓度密度对照表
- 维生系统专项施工方案(可编辑)
评论
0/150
提交评论