`
杭州猛男Cook.Mr
  • 浏览: 3686 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java编程思想-多态 深入理解

阅读更多

先看两段代码:

publicclass D extends C{

public D(){

System.out.println("D-init");

}

 

publicstaticvoid main(String []args){

C c = new D();

System.out.println(c.getClass().getName());

c.f2();//编译出错,无法访问到f2()

}

}

 

class C {

public C(){

System.out.println("C-init");

}

 

privatevoid f2(){

System.out.println("C-private-2");

}

}

 

===========================================================

publicclass D {

public D(){

System.out.println("D-init");

}

 

privatevoid f2(){

System.out.println("D-private-2");

}

 

publicstaticvoid main(String []args){

D d = new C();

System.out.println(d.getClass().getName());

d.f2();

}

}

 

class C extends D{

public C(){

System.out.println("C-init");

}

 

publicvoid f1(){

System.out.println("C-public");

}

 

}

 

output:

D-init

C-init

com.keyword._static.C

 

D-private-2

 

首先我们知道子类的对象可以赋值给父类的引用,这是多态的一个体现。

但是为什么我们在D d = new C();之后,可以访问到父类的私有函数?

理论上来说,我们new 的是子类,也就是在堆区开辟的是子类的空间,而D d 只是一个引用,指向该子类对象在堆区地址。但是根据private私有的特性,我们认为是说到底这个子类的对象仍旧无法访问到父类中的private属性,哪怕编译时不报错,运行时也会出错。但是这里却正常的运行了,也成功访问到了父类的private属性,所以提出一个问题,这是怎么做到的?

 

解决这个问题也许不是来的那么直观。

其实现在假设new D()也就是创建一个父类对象,所需内存空间为1MB,那么在创建其子类对象new C();所需的内存空间必然大于1MB,先假设是1.5MB。

为何会多出一些空间,因为从构造链可以看出,初始化一个子类实例,必然会先初始化其父类实习,那么这个new 的父类实例放在哪里,其实放在子类的堆区内存中,也就是说,子类对象所在的内存空间,不但包含自己的信息,也有其父类的信息,而且是每个子类对象独立享有各自父类对象实例。

而D d = new C();这部操作,进行一个向上转型,也就是窄化操作,说白点就是一个本身指在子类对象范围以及父类非private对象范围的堆区可移动指针,重新使他只能指在父类对象范围内。

那么,这种条件下,是否能访问到private属性,我个人认为取决于运行的外部环境了,我觉得是堆栈环境,不知道这么说是否恰当。

 

在第二份示例代码中,main函数放在父类中,也就是说入口在父类,比如说当前运行的环境是父类环境,D d = new C();这部操作后,移动指针,指向父类的内容区间, 加上外部环境,我将其理解成,在父类环境中访问父类私有属性,也就是在自己家用自己的私有物品。那自然是可以访问的。

而第一份示例代码中,main函数放在子类中,也就是外部环境不是父类,那么哪怕堆栈指针移动到了父类的内容区间,也是无法访问到父类的private的,这是由private本身性质所决定的。

 

 

  • 大小: 50 KB
0
1
分享到:
评论

相关推荐

    Java零基础-多态.md

    读者不仅能够理解多态的基本含义,还能掌握如何在实际编程中运用多态,提高代码的灵活性和可扩展性。 #### 多态的基本概念 多态是面向对象编程中的一个重要特性,它允许我们用一个通用的类(即父类)去表示其子类...

    Java编程思想--外文文献原文及译文(可编辑).doc

    总的来说,《Java编程思想》深入浅出地介绍了Java编程的核心理念,帮助读者理解并掌握面向对象编程的关键概念,以及Java语言的特性和优势。通过阅读本书,开发者不仅能学会编写Java代码,更能形成良好的面向对象思维...

    《java编程思想》_java编程思想_java编程思想_ThinkinginJava_mileefx_

    《Java编程思想》是Java程序员领域的一本经典之作,由Bruce Eckel撰写,以其深入浅出的讲解方式和丰富的实例闻名。这本书对于想要深入理解Java语言的人来说,是一份宝贵的资源。"Thinking in Java",直译为“思考...

    java编程思想参考答案

    《Java编程思想》是 Bruce Eckel 编著的一本经典Java教程,这本书深入浅出地讲解了Java语言的核心概念和编程技巧。书中的练习题旨在帮助读者巩固所学知识,提高编程技能。以下是对这些练习题及参考答案的详细解析: ...

    侯捷-java编程思想.pdf

    《侯捷-Java编程思想》是一本深受Java开发者喜爱的经典著作,尽管是繁体版本,但其中也包含英文内容,方便不同语言背景的读者理解。这本书深入浅出地讲解了Java编程的核心概念和技术,旨在帮助读者掌握Java编程的...

    实验4-多态与抽象类.doc

    ### 实验4-多态与抽象类 #### 实验目的: 1. **掌握抽象类**:理解抽象类的概念,学会...以上实验内容涵盖了Java中的抽象类、接口以及多态性的基本概念和使用方法,有助于深入理解面向对象编程的核心思想和技术细节。

    java编程思想第四版源代码.7z

    《Java编程思想》是 Bruce Eckel 的经典著作,第四版更是深入浅出地介绍了Java语言的核心概念和技术。这个压缩包包含的源代码是书中的示例程序,它们旨在帮助读者理解书中阐述的各种编程原理和实践。通过分析这些源...

    java编程思想(pdf格式)

    《Java编程思想》是Java开发领域的一本经典著作,它深入浅出地介绍了Java语言的核心概念和编程技术。这本书以其详尽的解释、丰富的实例和严谨的逻辑深受程序员喜爱。以下将围绕标题和描述中的知识点进行详细阐述: ...

    C++编程思想-英文版

    这本书全面、深入地介绍了C++语言,不仅覆盖了基础语法,还包括了高级特性和设计模式,旨在帮助读者理解C++的核心理念和编程思想。 1. **C++概述**:C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅...

    Java编程思想源代码及课后练习代码

    《Java编程思想》是一本由 Bruce Eckel 编著的经典Java教程,对于初学者和有经验的程序员来说,都是深入理解Java语言的重要参考书。这本书深入浅出地讲解了Java的核心概念,包括面向对象编程、泛型、并发、集合框架...

    Java 编程思想中文第三版(PDF)

    《Java编程思想》是Java开发领域的一本经典著作,由Bruce Eckel撰写,中文第三版则是针对中国读者的翻译版本,旨在帮助读者深入理解和掌握Java编程语言。这本书以清晰、简洁的语言介绍了Java的核心概念和技术,适合...

    Java编程思想练习题答案(代码)

    在Java编程领域,掌握《Java编程思想》是深入理解这门语言的重要步骤。这本书由Bruce Eckel撰写,被誉为Java学习者的经典之作。本资源包含了该书第四版的完整练习题答案,旨在帮助读者巩固和深化对书中理论的理解,...

    JAVA编程思想中文版.zip

    《JAVA编程思想》是 Bruce Eckel 的经典著作,中文版为国内Java开发者提供了深入理解Java语言的宝贵资源。这本书全面而深入地介绍了Java编程的核心概念和技术,是学习和提升Java编程技能的重要参考资料。 本书主要...

    Java编程思想参考答案代码及文档

    《Java编程思想》是 Bruce Eckel 的经典著作,它深入浅出地介绍了Java语言的核心概念和技术,对于初学者和有经验的程序员来说都是极好的学习资源。本压缩包包含两部分主要内容:Java编程思想的答案代码和英文版的...

    java编程思想详解

    Java编程思想是理解和使用Java语言的核心理念,它不仅仅是关于语言特性的简单堆砌,而是一种设计理念,强调的是设计、抽象和问题解决。Java的强大在于其面向对象的设计,它允许开发者以更加贴近现实世界的方式来构建...

    java 编程思想.txt

    根据提供的文件信息,我们可以深入探讨《Java编程思想》这一主题中的关键知识点,这些知识点主要集中在类、对象、封装性、继承、多态等核心概念上。 ### Java编程思想概述 《Java编程思想》这本书深入浅出地介绍了...

    侯捷-Java编程思想+第2版(繁体版)

    ### 侯捷-Java编程思想+第2版(繁体版)关键知识点解析 #### 一、书籍概览与评价 - **书籍名称**:本书名为《Thinking in Java》第二版,作者为Bruce Eckel,台湾译者为侯捷与王建兴。 - **书籍定位**:本书被广泛...

Global site tag (gtag.js) - Google Analytics