`
fantaxy025025
  • 浏览: 1311294 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

朝花夕拾:java-向上转型中变量覆盖要小心使用_继承过程中Java子类父类属性的覆盖问题

阅读更多

====

现在的代码结构设计的复杂起来了,为了后来人编写效率。

需要实验确定整个结构运行如同预期。

 

两个系的类如何兼容。两串类系如何兼容融合。

====

总结:

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-朝花夕拾-mht.rar"提供的学习资源涵盖了Groovy语言的基本特性和高级用法,以及使用Groovy进行Web开发的Grails框架,通过MHT格式的文件,你可以全面地了解和学习Groovy编程及Grails应用开发。...

    朝花夕拾练习题100.pdf

    《朝花夕拾》是鲁迅先生的一部散文集,收录了他早年的生活回忆和一些社会现象的思考。这本书不仅展现了鲁迅的个人成长历程,也反映了晚清至民国初期的社会风貌。以下是对部分练习题涉及知识点的详细解读: 1. 鲁迅...

    名著导读《朝花夕拾》ppt课件_1PPT课件.pptx

    《朝花夕拾》是鲁迅先生的一部回忆性散文集,收录了鲁迅在不同时期创作的十篇散文。这部作品不仅是中国现代文学史上的经典,更是鲁迅个人思想与情感的重要载体。以下将详细解析其中的主要内容和主题思想。 1. **...

    《朝花夕拾》名著试题答案.pdf

    《朝花夕拾》是鲁迅先生的一部经典散文集,这些散文以作者的记忆为线索,生动地再现了作者童年的生活和成长经历。这本集子中收录的10篇文章,每篇都蕴含了鲁迅先生对传统文化、社会现象、人物命运等方面的深刻洞察与...

    名著导读《朝花夕拾》ppt课件PPT课件.pptx

    《朝花夕拾》是鲁迅先生的一部回忆性散文集,原名为《旧事重提》。这部作品创作于1926年,是鲁迅在文坛地位稳固后的创作,最初发表在《莽原》半月刊上,后集结出版时改名为《朝花夕拾》。鲁迅是中国现代文学的奠基人...

    鲁迅《朝花夕拾》中考名著习题及答案.doc

    《朝花夕拾》是鲁迅先生的一部散文集,收录了他回忆童年、少年和青年时期经历的文章。这部作品以其独特的艺术风格和深刻的思想内涵,成为了中国现代文学的经典之作。 在《朝花夕拾》中,我们可以看到鲁迅先生对童年...

    朝花夕拾考题+全部答案.docx

    《朝花夕拾》是鲁迅先生于1926年创作的一部回忆性散文集,共收录了十篇文章,包括《从百草园到三味书屋》、《阿长与<山海经>》等,这些文章反映了鲁迅先生的童年生活和成长历程,同时也揭示了封建社会的各种问题。...

    鲁迅朝花夕拾名著读后感中学生作文5篇.docx

    鲁迅朝花夕拾名著读后感中学生作文5篇.docx

    朝花夕拾阅读汇报课.ppt

    朝花夕拾阅读汇报课.ppt

    名著导读:《朝花夕拾》_精美学习课件ppt

    从给定的文件标题、描述、标签以及部分内容中可以提炼出关于《朝花夕拾》这一名著的相关知识点。以下是对这些知识点的详细说明: ### 1. 了解《朝花夕拾》 《朝花夕拾》是鲁迅先生的一部回忆性散文集,共收录了十...

    读后感500字-鲁迅《朝花夕拾》读后感范文500字8篇_朝花夕拾》读后感范文大全.docx

    根据提供的文档信息,这里主要涉及的是鲁迅先生的散文集《朝花夕拾》以及不同读者对其的读后感。尽管标签部分标注了“安全管理”,但从上下文来看,这部分内容显然与《朝花夕拾》及其读后感有关,与IT或安全管理领域...

    朝花夕拾考题全部答案.doc

    《朝花夕拾》是鲁迅先生的一部回忆性散文集,收录了他1926年创作的十篇文章。这部作品不仅描绘了鲁迅个人的成长历程,同时也揭示了晚清至民国初年中国社会的各种现象和问题。以下是根据提供的部分内容提炼出的知识点...

    朝花夕拾鲁迅作品读书感受.pdf

    朝花夕拾鲁迅作品读书感受.pdf

    《朝花夕拾》名著阅读试题收集.pdf

    在《朝花夕拾》中,鲁迅先生使用了许多文学技巧,例如描绘性描写、联想、contrast等,来表达自己的思想和情感。这些技巧能够帮助我们更好地理解鲁迅先生的思想和感情,并提高我们的文学鉴赏能力。 此外,《朝花夕拾...

    朝花夕拾练习题答案.doc

    【朝花夕拾练习题答案】的文档涵盖了鲁迅先生及其代表作《朝花夕拾》的相关知识。以下是根据文档内容生成的知识点详细说明: 1. 鲁迅是中国现代伟大的文学家、思想家和革命家,原名周树人,字豫才,籍贯为浙江绍兴...

    关于朝花夕拾读后感5篇___.docx

    【标题】:关于《朝花夕拾》读后感5篇 【描述】:本文主要讨论了鲁迅先生的作品《朝花夕拾》中所反映出的童年记忆和生活感悟,并通过多个角度阐述了读者对于鲁迅散文集的独特见解。 【标签】:文学,回忆,鲁迅,...

    中同学名著朝花夕拾读书心得5篇_朝花夕拾读后感.docx

    《朝花夕拾》是鲁迅先生的一部散文集,收录了他回忆童年、少年和青年时期生活的十篇文章。这些文章以其细腻的笔触,展现了鲁迅先生个人的成长经历和内心世界,同时也反映了当时中国社会的风貌和文化背景。通过阅读...

    《朝花夕拾》读书汇报会主持稿.doc

    《朝花夕拾》读书汇报会主持稿.doc

    2021年朝花夕拾读后感1500优秀.pdf

    2021年朝花夕拾读后感1500优秀.pdf

    朝花夕拾读后感300字10篇.docx

    根据提供的文档内容,这里主要涉及的是对鲁迅作品《朝花夕拾》的读后感。下面将对几个关键点进行深入分析: ### 1. 鲁迅及其作品的重要性 鲁迅(1881年9月25日—1936年10月19日),原名周树人,是中国现代文学的...

Global site tag (gtag.js) - Google Analytics