`
jxwnhj0717
  • 浏览: 6890 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java语言精粹之二:类型系统

阅读更多
Java是一门面向对象的语言,其中每个对象都是通过类型来创建的,而这些类型是由类和类所实现的接口决定的。实际上一个对象是多个类型的实例,于是有了多态类型系统的概念。

定义类型有三种方式:
1、 类:定义了对象内部的数据结构和一组操作数据的方法。类可以继承其他类,从而形成一棵树,树的根节点是Object。
2、 接口:声明了一组方法,描述自己能干什么。一个类可以实现多个接口。
3、 抽象类:介于类和接口之间,即可以像类一样定义数据结构和方法,也可以像接口一个仅声明一个方法。一个类只能继承一个抽象类。
只有类才可以实例化。

从历史上看,计算机语言引入类型系统,是为了让编译器(1)能确认相关对象需要分配多少空间。而在Java中类型系统有三个作用:
1、 确定分配多少空间(只有类才需要,因为只有类才能实例化)
2、 描述方法的参数、返回值、异常
3、 对方法的传入参数、传出返回值、声明异常做编译时检查
正是由于第三点,我们说Java是类型安全的。
注1:个人认为是运行时确定对象需要分配多少空间

接口提供了一种将抽象与实现分离的方式。抽象是指我(1)能干什么,实现是指我怎么干的。对于类库的使用者,只需要关注这个类库能干嘛,即它提供的接口,而不需要关系它是怎么实现这个功能的。举个例子,比如你向领导汇报工作,只需要告诉他你做了什么,接下来要做什么,而不需要告诉他每件事是怎么做的。当我们设计接口的时候需要注意,接口传递给人们的语义不能和具体的实现相关。由于接口和类的分离,使得我们可以分开考虑抽象的设计和类的实现,让我们的设计更加优良。
注1:指定类型的对象

而类就是指接口的实现,通常我们需要从接口中获得一些信息、数据,而这些都要由实现类来提供。那么类如何提供数据呢?要么自己有一份,要么从别的地方获取。也就是说类中可以定义一套相关的数据,方法就是操作这些数据,以返回给用户需要的结果;类也可以从父类中获取一些行为(继承),或者从其他类中获取一些行为(持有)来计算用户需要的结果。

Java类型系统中隐含的问题:
interface A {
  void hello();
}

interface B{
  void hello();
}

class C implements A, B {
  public void hello() {
    print(“hello world”);
  }
}

实现类C无法为接口A,B的hello()方法提供不同的实现。但是在实际开发中,只要你的方法命名注意的话,这种错误出现的概率基本为0。

Java类型系统中真实的问题:
首先区分一个概念,对象的编译时类型和运行时类型。
编译时类型:对象的全限定名
运行时类型:对象的类加载器 + 对象的编译时类型

由于类加载器的引入,一些看似正确的代码也会出错了,比如:
TypeA type = (TypeA) factory.createTypeA();
在运行时抛出ClassCastException异常。
其原因是factory在创建TypeA的时候使用了自定义的类加载器,而TypeA type中定义的TypeA是由系统类加载器加载的,自定义的类加载器在加载TypeA又不会委托给系统类加载器,于是:
TypeA type中TypeA的运行时类型为:SystemClassLoader + TypeA
factory.createTypeA() 中TypeA的运行时类型为:MyClassLoader + TypeA
两种类型不同,所以抛出ClassCastException异常。

作者思路:
1、 描述Java类型系统的组成:类,接口,抽象类,指出Java类型和其他语言的区别
2、 描述以前人们对接口的误解,强调接口的重要性
3、 对比类和接口,给出一个良好的设计准则
4、 描述类型系统潜在的问题和真实的问题

2
2
分享到:
评论

相关推荐

    java语言精粹

    ### Java语言精粹之异常处理 #### 引言 在《Java语言精粹》这本书中,作者Jim深入探讨了Java语言及其环境中的诸多亮点。其中一个关键主题是异常处理。异常处理是Java编程的一个核心概念,它对于确保程序的健壮性...

    疯狂java讲义精粹(第2版)

    这本书的核心目标是帮助读者深入理解Java语言的本质,提升编程技能,并掌握实际开发中的关键技术。以下是该书涵盖的一些关键知识点: 1. **Java基础**:讲解了Java的基本语法,包括数据类型、变量、运算符、流程...

    疯狂Java讲义精粹随书光盘

    通过《疯狂Java讲义精粹》的学习,读者不仅可以全面了解Java语言,还能提升编程技巧和解决问题的能力。对于初学者来说,这是一本很好的入门书籍;对于有一定经验的开发者,它也能提供有价值的参考和深化理解。

    Java案例精粹150例 高清完整版

    该压缩包包含了一份PDF文档,名为“Java案例精粹150例.pdf”,很可能包含了150个精心挑选的Java编程实例,涵盖了Java语言的核心特性、标准库的使用、面向对象编程原则以及常见的设计模式等众多知识点。以下是可能...

    JAVA编程精粹.rar

    《JAVA编程精粹》是Java开发领域的一部经典著作,旨在深入探讨Java语言的核心概念、最佳实践以及高级特性。此压缩包包含的主要内容是“编程精粹”这一CHM格式的电子书,它涵盖了广泛的Java编程知识,对于初学者和...

    java案例精粹150例

    《Java案例精粹150例》覆盖了Java的基础语法到高级特性,如变量、数据类型、运算符、控制结构、数组、字符串处理等。通过具体案例,读者可以加深对这些基础概念的理解,并学会如何在实际项目中灵活运用。例如,书中...

    【免积分】--疯狂java讲义光盘 第二版

    1. **Java语言基础**:从Java环境搭建开始,涵盖变量、数据类型、运算符、流程控制语句(如if、switch、for、while)、方法定义与调用等基础知识,帮助初学者建立坚实的语言基础。 2. **面向对象编程**:深入探讨类...

    疯狂java讲义第二版代码

    这本书深入浅出地讲解了Java语言的核心概念、语法以及面向对象编程思想,旨在帮助读者从初级到高级全面掌握Java技术。随书提供的"codes"压缩包文件包含了书中所有实例的源代码,是学习和理解书中知识点的重要辅助...

    Java案例精粹150例+源代码

    源代码的分析和调试也是提高编程能力的重要环节,通过查看和运行代码,可以加深对Java语言特性的理解。因此,"Java案例精粹150例+源代码"是一个极好的学习资源,无论你是初学者还是有经验的开发者,都能从中受益匪浅...

    Java案例精粹150例 张怀庆编 2005年.pdf

    根据提供的文件信息,我们可以推断出这是一本关于Java编程案例的书籍——《Java案例精粹150例》,作者是张怀庆,出版时间为2005年。虽然部分内容似乎与该书的主题不符(提到了MATLAB/Simulink/C++等其他编程语言以及...

    疯狂Java讲义第二版配套光盘

    《疯狂Java讲义第二版配套光盘》是一个包含有与《疯狂Java讲义》第二版教材相关的源码和设计文档的资源集合。这个压缩包旨在为读者提供实践和深入理解书中理论知识的辅助材料,帮助读者更好地掌握Java编程语言。 在...

    Java案例精粹150例

    在学习Java的过程中,读者需要理解Java语言的面向对象特性,了解如何利用Java进行多线程编程,掌握Java在文件输入输出、网络通信、数据库操作等方面的应用。同时,也要熟悉Java在企业级应用开发中的重要技术规范,...

Global site tag (gtag.js) - Google Analytics