====
现在的代码结构设计的复杂起来了,为了后来人编写效率。
需要实验确定整个结构运行如同预期。
两个系的类如何兼容。两串类系如何兼容融合。
====
总结:
1. 仔细理解类和实例的区别。
在实例化时,会根据类的定义进行,类中的成员变量都会分配空间。
这里注意:
*父类的成员变量和子类的成员变量都是独自的独立的!!!也就是说子类的成员变量名字完全可以父类相同,没有关系。
*父类的方法与子类的方法,虽然不用分配空间,但是也是独立的。
2. 调用区别。
*当调用方法时,不管有没有向上转型,都是调用真实实例的方法。
*当调用实例变量时,如果有向上转型(比如parentClass),则调用上层的实例变量(parentClass的实例变量),而不是真实实例的实例变量。
这点区别是巨大的!!!也是一个大坑。
6. 如何规避上面2的坑?
1继承时,也最好不用相通的实例名字。
2既然使用了public和protected来方便底层类继承实例变量,那就不要再次定义一个自己的。这样保证使用的是一份。
为什么向上转型时,方法调用使用真实实例的,而成员变量则使用父类的?编译器的原因!
1实例变量可以重名,且属于自己的独立空间。
所以,可以独立引用到也必须独立引用,这样程序才是正确的。
但是,向上转型时,没有使用真实实例的成员变量,而是使用的父类的成员变量。编译器这么搞,其实是不科学的!!!
2方法,也是独立的,但不用分配空间。
方法调用时,永远使用的是“真实实例的方法”,这就是编译器的真实机制。
=
直接看实验代码:
class ParentClass { private String privateField = "父类变量--private"; /* friendly */String friendlyField = "父类变量--friendly"; protected String protectedField = "父类变量--protected"; public String publicField = "父类变量--public"; // private的变量无法直接访问,因此我们给他增加了一个访问方法 public String getPrivateFieldValue() { System.out.println("\tcall method: ParentClass.getPrivateFieldValue"); return privateField; } public String getProtectedFieldValue() { System.out.println("\tcall method: ParentClass.getProtectedFieldValue"); return protectedField; } } class SubClass extends ParentClass { private String privateField = "子类变量--private"; /* friendly */String friendlyField = "子类变量--friendly"; protected String protectedField = "子类变量--protected"; public String publicField = "子类变量--public"; // private的变量无法直接访问,因此我们给他增加了一个访问方法 public String getPrivateFieldValue() { System.out.println("\tcall method: SubClass.getPrivateFieldValue"); return privateField; } public String getProtectedFieldValue() { System.out.println("\tcall method: SubClass.getProtectedFieldValue"); return this.protectedField; } public String getProtectedFieldValue_bySuper() { return super.protectedField; } public String call_super_method_in_sub_class__call_super_method_getProtectedFieldValue() { System.out.println("\tcall mothed: SubClass.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue"); return super.getProtectedFieldValue(); } public String call_super_method_in_sub_class__call_super_method_getPrivateFieldValue() { System.out.println("\tcall mothed: SubClass.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue"); return super.getPrivateFieldValue(); } } class SubClass_notOverWrite extends ParentClass { private String privateField = "子类变量--private"; public SubClass_notOverWrite() { super.friendlyField = "子类变量--friendly"; this.protectedField = "子类变量--protected"; this.publicField = "子类变量--public"; } // private的变量无法直接访问,因此我们给他增加了一个访问方法 public String getPrivateFieldValue() { System.out.println("\tcall method: SubClass_notOverWrite.getPrivateFieldValue"); return privateField; } public String getProtectedFieldValue() { System.out.println("\tcall method: SubClass_notOverWrite.getProtectedFieldValue"); return this.protectedField; } public String getProtectedFieldValue_bySuper() { return super.protectedField; } public String call_super_method_in_sub_class__call_super_method_getProtectedFieldValue() { System.out.println("\tcall mothed: SubClass_notOverWrite.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue"); return super.getProtectedFieldValue(); } public String call_super_method_in_sub_class__call_super_method_getPrivateFieldValue() { System.out.println("\tcall mothed: SubClass_notOverWrite.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue"); return super.getPrivateFieldValue(); } } public class StudyExtends { public static void main(String[] args) { // 为了便于查阅,我们统一按照private、friendly、protected、public的顺序 // 输出下列三种情况中变量的值 // ParentClass类型,ParentClass对象 ParentClass realParentClass = new ParentClass(); System.out.println("ParentClass realParentClass = new ParentClass();"); System.out.println("realParentClass.getPrivateFieldValue()" + "==>>" + realParentClass.getPrivateFieldValue()); System.out.println("realParentClass.getProtectedFieldValue()" + "==>>" + realParentClass.getProtectedFieldValue()); System.out.println("realParentClass.friendlyField" + "==>>" + realParentClass.friendlyField); System.out.println("realParentClass.protectedField" + "==>>" + realParentClass.protectedField); System.out.println("realParentClass.publicField" + "==>>" + realParentClass.publicField); System.out.println(); // ParentClass类型,SubClass对象 ParentClass subClassUpcast2ParentClass = new SubClass(); System.out.println("ParentClass subClassUpcast2ParentClass = new SubClass();"); System.out.println("subClassUpcast2ParentClass.getPrivateFieldValue()" + "==>>" + subClassUpcast2ParentClass.getPrivateFieldValue()); System.out.println("subClassUpcast2ParentClass.getProtectedFieldValue()" + "==>>" + subClassUpcast2ParentClass.getProtectedFieldValue()); System.out.println("subClassUpcast2ParentClass.friendlyField" + "==>>" + subClassUpcast2ParentClass.friendlyField); System.out.println("subClassUpcast2ParentClass.protectedField" + "==>>" + subClassUpcast2ParentClass.protectedField); System.out.println("subClassUpcast2ParentClass.publicField" + "==>>" + subClassUpcast2ParentClass.publicField); System.out.println(); // SubClass类型,SubClass对象 SubClass realSubClass = new SubClass(); System.out.println("SubClass realSubClass = new SubClass();"); System.out.println("realSubClass.getPrivateFieldValue()" + "==>>" + realSubClass.getPrivateFieldValue()); System.out.println("realSubClass.getProtectedFieldValue()" + "==>>" + realSubClass.getProtectedFieldValue()); System.out.println("realSubClass.getProtectedFieldValue_bySuper()" + "==>>" + realSubClass.getProtectedFieldValue_bySuper()); System.out.println("realSubClass.friendlyField" + "==>>" + realSubClass.friendlyField); System.out.println("realSubClass.protectedField" + "==>>" + realSubClass.protectedField); System.out.println("realSubClass.publicField" + "==>>" + realSubClass.publicField); //++ System.out.println("realSubClass.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue" + "==>>" + realSubClass.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue()); System.out.println("realSubClass.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue" + "==>>" + realSubClass.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue()); System.out.println(); // ParentClass类型,SubClass对象 ParentClass subClassUpcast2ParentClass_notOverWrite = new SubClass_notOverWrite(); System.out.println("ParentClass subClassUpcast2ParentClass_notOverWrite = new SubClass_notOverWrite();"); System.out.println("subClassUpcast2ParentClass_notOverWrite.getPrivateFieldValue()" + "==>>" + subClassUpcast2ParentClass_notOverWrite.getPrivateFieldValue()); System.out.println("subClassUpcast2ParentClass_notOverWrite.getProtectedFieldValue()" + "==>>" + subClassUpcast2ParentClass_notOverWrite.getProtectedFieldValue()); System.out.println("subClassUpcast2ParentClass_notOverWrite.friendlyField" + "==>>" + subClassUpcast2ParentClass_notOverWrite.friendlyField); System.out.println("subClassUpcast2ParentClass_notOverWrite.protectedField" + "==>>" + subClassUpcast2ParentClass_notOverWrite.protectedField); System.out.println("subClassUpcast2ParentClass_notOverWrite.publicField" + "==>>" + subClassUpcast2ParentClass_notOverWrite.publicField); System.out.println(); // SubClass类型,SubClass对象 SubClass_notOverWrite realSubClass_notOverWrite = new SubClass_notOverWrite(); System.out.println("SubClass realSubClass_notOverWrite = new SubClass_notOverWrite();"); System.out.println("realSubClass_notOverWrite.getPrivateFieldValue()" + "==>>" + realSubClass_notOverWrite.getPrivateFieldValue()); System.out.println("realSubClass_notOverWrite.getProtectedFieldValue()" + "==>>" + realSubClass_notOverWrite.getProtectedFieldValue()); System.out.println("realSubClass_notOverWrite.getProtectedFieldValue_bySuper()" + "==>>" + realSubClass_notOverWrite.getProtectedFieldValue_bySuper()); System.out.println("realSubClass_notOverWrite.friendlyField" + "==>>" + realSubClass_notOverWrite.friendlyField); System.out.println("realSubClass_notOverWrite.protectedField" + "==>>" + realSubClass_notOverWrite.protectedField); System.out.println("realSubClass_notOverWrite.publicField" + "==>>" + realSubClass_notOverWrite.publicField); //++ System.out.println("realSubClass.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue" + "==>>" + realSubClass_notOverWrite.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue()); System.out.println("realSubClass.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue" + "==>>" + realSubClass_notOverWrite.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue()); } }
运行结果:
ParentClass realParentClass = new ParentClass();
call method: ParentClass.getPrivateFieldValue
realParentClass.getPrivateFieldValue()==>>父类变量--private
call method: ParentClass.getProtectedFieldValue
realParentClass.getProtectedFieldValue()==>>父类变量--protected
realParentClass.friendlyField==>>父类变量--friendly
realParentClass.protectedField==>>父类变量--protected
realParentClass.publicField==>>父类变量--public
ParentClass subClassUpcast2ParentClass = new SubClass();
call method: SubClass.getPrivateFieldValue
subClassUpcast2ParentClass.getPrivateFieldValue()==>>子类变量--private
call method: SubClass.getProtectedFieldValue
subClassUpcast2ParentClass.getProtectedFieldValue()==>>子类变量--protected
subClassUpcast2ParentClass.friendlyField==>>父类变量--friendly
subClassUpcast2ParentClass.protectedField==>>父类变量--protected
subClassUpcast2ParentClass.publicField==>>父类变量--public
SubClass realSubClass = new SubClass();
call method: SubClass.getPrivateFieldValue
realSubClass.getPrivateFieldValue()==>>子类变量--private
call method: SubClass.getProtectedFieldValue
realSubClass.getProtectedFieldValue()==>>子类变量--protected
realSubClass.getProtectedFieldValue_bySuper()==>>父类变量--protected
realSubClass.friendlyField==>>子类变量--friendly
realSubClass.protectedField==>>子类变量--protected
realSubClass.publicField==>>子类变量--public
call mothed: SubClass.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue
call method: ParentClass.getPrivateFieldValue
realSubClass.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue==>>父类变量--private
call mothed: SubClass.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue
call method: ParentClass.getProtectedFieldValue
realSubClass.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue==>>父类变量--protected
ParentClass subClassUpcast2ParentClass_notOverWrite = new SubClass_notOverWrite();
call method: SubClass_notOverWrite.getPrivateFieldValue
subClassUpcast2ParentClass_notOverWrite.getPrivateFieldValue()==>>子类变量--private
call method: SubClass_notOverWrite.getProtectedFieldValue
subClassUpcast2ParentClass_notOverWrite.getProtectedFieldValue()==>>子类变量--protected
subClassUpcast2ParentClass_notOverWrite.friendlyField==>>子类变量--friendly
subClassUpcast2ParentClass_notOverWrite.protectedField==>>子类变量--protected
subClassUpcast2ParentClass_notOverWrite.publicField==>>子类变量--public
SubClass realSubClass_notOverWrite = new SubClass_notOverWrite();
call method: SubClass_notOverWrite.getPrivateFieldValue
realSubClass_notOverWrite.getPrivateFieldValue()==>>子类变量--private
call method: SubClass_notOverWrite.getProtectedFieldValue
realSubClass_notOverWrite.getProtectedFieldValue()==>>子类变量--protected
realSubClass_notOverWrite.getProtectedFieldValue_bySuper()==>>子类变量--protected
realSubClass_notOverWrite.friendlyField==>>子类变量--friendly
realSubClass_notOverWrite.protectedField==>>子类变量--protected
realSubClass_notOverWrite.publicField==>>子类变量--public
call mothed: SubClass_notOverWrite.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue
call method: ParentClass.getPrivateFieldValue
realSubClass.call_super_method_in_sub_class__call_super_method_getPrivateFieldValue==>>父类变量--private
call mothed: SubClass_notOverWrite.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue
call method: ParentClass.getProtectedFieldValue
realSubClass.call_super_method_in_sub_class__call_super_method_getProtectedFieldValue==>>子类变量--protected
Process finished with exit code 0
参考:https://www.iteye.com/blog/gaolixu-363709 有改动和优化实验。
=
=
=
相关推荐
综上所述,"Groovy-朝花夕拾-mht.rar"提供的学习资源涵盖了Groovy语言的基本特性和高级用法,以及使用Groovy进行Web开发的Grails框架,通过MHT格式的文件,你可以全面地了解和学习Groovy编程及Grails应用开发。...
《朝花夕拾》是鲁迅先生的一部回忆性散文集,收录了鲁迅在不同时期创作的十篇散文。这部作品不仅是中国现代文学史上的经典,更是鲁迅个人思想与情感的重要载体。以下将详细解析其中的主要内容和主题思想。 1. **...
《朝花夕拾》是鲁迅先生的一部经典散文集,这些散文以作者的记忆为线索,生动地再现了作者童年的生活和成长经历。这本集子中收录的10篇文章,每篇都蕴含了鲁迅先生对传统文化、社会现象、人物命运等方面的深刻洞察与...
《朝花夕拾》是鲁迅先生于1926年创作的一部回忆性散文集,原名为《旧事重提》,其后改为现名,并首次发表于《莽原》半月刊上。鲁迅,作为中国现代文学的奠基人,其作品在小说、散文、诗歌和杂文等诸多体裁领域均有...
《朝花夕拾》在结集出版之前,曾以《旧事重提》为名在《莽原》杂志连载,这一过程见证了鲁迅文学创作的早期探索。作品中不仅有个人回忆的叙述,还有对社会现象的深刻洞察。鲁迅运用动物寓言的手法,在《狗·猫·鼠》...
《朝花夕拾》是鲁迅先生的一部散文集,收录了他回忆童年、少年和青年时期经历的文章。这部作品以其独特的艺术风格和深刻的思想内涵,成为了中国现代文学的经典之作。 在《朝花夕拾》中,我们可以看到鲁迅先生对童年...
《朝花夕拾》是鲁迅先生于1926年创作的一部回忆性散文集,共收录了十篇文章,包括《从百草园到三味书屋》、《阿长与<山海经>》等,这些文章反映了鲁迅先生的童年生活和成长历程,同时也揭示了封建社会的各种问题。...
鲁迅朝花夕拾名著读后感中学生作文5篇.docx
朝花夕拾阅读汇报课.ppt
从给定的文件标题、描述、标签以及部分内容中可以提炼出关于《朝花夕拾》这一名著的相关知识点。以下是对这些知识点的详细说明: ### 1. 了解《朝花夕拾》 《朝花夕拾》是鲁迅先生的一部回忆性散文集,共收录了十...
根据提供的文档信息,这里主要涉及的是鲁迅先生的散文集《朝花夕拾》以及不同读者对其的读后感。尽管标签部分标注了“安全管理”,但从上下文来看,这部分内容显然与《朝花夕拾》及其读后感有关,与IT或安全管理领域...
《朝花夕拾》是鲁迅先生的一部回忆性散文集,收录了他1926年创作的十篇文章。这部作品不仅描绘了鲁迅个人的成长历程,同时也揭示了晚清至民国初年中国社会的各种现象和问题。以下是根据提供的部分内容提炼出的知识点...
朝花夕拾鲁迅作品读书感受.pdf
《朝花夕拾》作为鲁迅先生的回忆性散文集,以其独特的文学价值和深刻的思想内涵,成为了中国现代文学史上不可或缺的一页。这部作品不仅承载着鲁迅对个人过往生活的深情回顾,而且反映出作者对于所处时代的敏锐观察和...
【朝花夕拾练习题答案】的文档涵盖了鲁迅先生及其代表作《朝花夕拾》的相关知识。以下是根据文档内容生成的知识点详细说明: 1. 鲁迅是中国现代伟大的文学家、思想家和革命家,原名周树人,字豫才,籍贯为浙江绍兴...
【标题】:关于《朝花夕拾》读后感5篇 【描述】:本文主要讨论了鲁迅先生的作品《朝花夕拾》中所反映出的童年记忆和生活感悟,并通过多个角度阐述了读者对于鲁迅散文集的独特见解。 【标签】:文学,回忆,鲁迅,...
在《朝花夕拾》中,鲁迅所抒发的人生感慨,如文中所说:“一个人做到只剩了回忆的时候,生涯也许总要算是无聊了罢,但有时竟会连回忆也没有”,这是对人生意义的深沉思考。同时,他对国家和民族命运的关注,通过对...
《朝花夕拾》作为中国现代文学巨匠鲁迅先生的一部经典散文集,长久以来吸引了无数读者与研究者的目光。通过对这部作品细致入微的分析,我们不仅能窥探到作者深邃的思想,更能体会到那个时代社会文化的脉动。这本著作...
《朝花夕拾》读书汇报会主持稿.doc
2021年朝花夕拾读后感1500优秀.pdf