====
现在的代码结构设计的复杂起来了,为了后来人编写效率。
需要实验确定整个结构运行如同预期。
两个系的类如何兼容。两串类系如何兼容融合。
====
总结:
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. 鲁迅...
《朝花夕拾》是鲁迅先生的一部回忆性散文集,收录了鲁迅在不同时期创作的十篇散文。这部作品不仅是中国现代文学史上的经典,更是鲁迅个人思想与情感的重要载体。以下将详细解析其中的主要内容和主题思想。 1. **...
《朝花夕拾》是鲁迅先生的一部经典散文集,这些散文以作者的记忆为线索,生动地再现了作者童年的生活和成长经历。这本集子中收录的10篇文章,每篇都蕴含了鲁迅先生对传统文化、社会现象、人物命运等方面的深刻洞察与...
《朝花夕拾》是鲁迅先生的一部回忆性散文集,原名为《旧事重提》。这部作品创作于1926年,是鲁迅在文坛地位稳固后的创作,最初发表在《莽原》半月刊上,后集结出版时改名为《朝花夕拾》。鲁迅是中国现代文学的奠基人...
《朝花夕拾》是鲁迅先生的一部散文集,收录了他回忆童年、少年和青年时期经历的文章。这部作品以其独特的艺术风格和深刻的思想内涵,成为了中国现代文学的经典之作。 在《朝花夕拾》中,我们可以看到鲁迅先生对童年...
《朝花夕拾》是鲁迅先生于1926年创作的一部回忆性散文集,共收录了十篇文章,包括《从百草园到三味书屋》、《阿长与<山海经>》等,这些文章反映了鲁迅先生的童年生活和成长历程,同时也揭示了封建社会的各种问题。...
鲁迅朝花夕拾名著读后感中学生作文5篇.docx
朝花夕拾阅读汇报课.ppt
从给定的文件标题、描述、标签以及部分内容中可以提炼出关于《朝花夕拾》这一名著的相关知识点。以下是对这些知识点的详细说明: ### 1. 了解《朝花夕拾》 《朝花夕拾》是鲁迅先生的一部回忆性散文集,共收录了十...
根据提供的文档信息,这里主要涉及的是鲁迅先生的散文集《朝花夕拾》以及不同读者对其的读后感。尽管标签部分标注了“安全管理”,但从上下文来看,这部分内容显然与《朝花夕拾》及其读后感有关,与IT或安全管理领域...
《朝花夕拾》是鲁迅先生的一部回忆性散文集,收录了他1926年创作的十篇文章。这部作品不仅描绘了鲁迅个人的成长历程,同时也揭示了晚清至民国初年中国社会的各种现象和问题。以下是根据提供的部分内容提炼出的知识点...
朝花夕拾鲁迅作品读书感受.pdf
在《朝花夕拾》中,鲁迅先生使用了许多文学技巧,例如描绘性描写、联想、contrast等,来表达自己的思想和情感。这些技巧能够帮助我们更好地理解鲁迅先生的思想和感情,并提高我们的文学鉴赏能力。 此外,《朝花夕拾...
【朝花夕拾练习题答案】的文档涵盖了鲁迅先生及其代表作《朝花夕拾》的相关知识。以下是根据文档内容生成的知识点详细说明: 1. 鲁迅是中国现代伟大的文学家、思想家和革命家,原名周树人,字豫才,籍贯为浙江绍兴...
【标题】:关于《朝花夕拾》读后感5篇 【描述】:本文主要讨论了鲁迅先生的作品《朝花夕拾》中所反映出的童年记忆和生活感悟,并通过多个角度阐述了读者对于鲁迅散文集的独特见解。 【标签】:文学,回忆,鲁迅,...
《朝花夕拾》是鲁迅先生的一部散文集,收录了他回忆童年、少年和青年时期生活的十篇文章。这些文章以其细腻的笔触,展现了鲁迅先生个人的成长经历和内心世界,同时也反映了当时中国社会的风貌和文化背景。通过阅读...
《朝花夕拾》读书汇报会主持稿.doc
2021年朝花夕拾读后感1500优秀.pdf
根据提供的文档内容,这里主要涉及的是对鲁迅作品《朝花夕拾》的读后感。下面将对几个关键点进行深入分析: ### 1. 鲁迅及其作品的重要性 鲁迅(1881年9月25日—1936年10月19日),原名周树人,是中国现代文学的...