`

java初学细节(二)

    博客分类:
  • java
阅读更多

      上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。

      至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。

 

      问题四:final关键字到底修饰了什么?

 

      final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。

 

      引用本身的不变:

      final StringBuffer a=new StringBuffer("immutable");

      final StringBuffer b=new StringBuffer("not immutable");

      a=b;//编译期错误

 

      引用指向的对象不变:

      final StringBuffer a=new StringBuffer("immutable");

      a.append(" broken!"); //编译通过

 

      可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

 

      理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。

 

      问题五:到底要怎么样初始化!

 

      本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。

      1. 类的属性,或者叫值域

      2. 方法里的局部变量

      3. 方法的参数

 

      对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。

 

      int类型变量默认初始值为0

      float类型变量默认初始值为0.0f

      double类型变量默认初始值为0.0

      boolean类型变量默认初始值为false

      char类型变量默认初始值为0(ASCII码)

      long类型变量默认初始值为0

      所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。

 

      对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化, static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。

 

      对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!

 

      其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。

 

      问题六:instanceof是什么东东?

 

      instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:

 

      String s = "I AM an Object!";

      boolean isObject = s instanceof Object;

 

      我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。

      instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:

 

      public class Bill

      public class PhoneBill extends Bill

      public class GasBill extends Bill

 

      在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:

 

      public double calculate(Bill bill) {

           if (bill instanceof PhoneBill)

           if (bill instanceof GasBill)

           ...

      }

      这样就可以用一个方法处理两种子类。

 

      然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:

 

      public double calculate(PhoneBill bill)

 

      public double calculate(GasBill bill)

 

      所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。

分享到:
评论

相关推荐

    java初学者必备基础教材

    Java初学者必备基础教材主要涵盖了Java语言的核心概念和基本元素,是学习编程的入门路径。以下将详细解析这些知识点: 1. **Java语言与面向对象的程序设计**:Java是一种面向对象的语言,这意味着它强调通过类和...

    java初学的一些小例子

    "java初学的一些小例子"这个主题,显然旨在帮助新手们通过实际操作来学习Java的核心概念。 首先,让我们深入了解一下Java的基础知识。Java程序设计语言由Sun Microsystems(现为Oracle公司)于1995年推出,其设计...

    java初学者学习源代码

    这个"java初学者学习源代码"集合提供了一些简单的运行代码示例,帮助初学者通过实践来学习。 1. **基本语法与数据类型**:Java有八种基本数据类型,包括整型(byte, short, int, long)、浮点型(float, double)、...

    java初学好文档

    这个名为“java初学好文档”的资源,显然是为了帮助新手系统地学习Java基础知识。本文将深入解析Java的基础语法,帮助你理解并掌握这个强大的编程工具。 1. **变量与数据类型** Java有八种基本数据类型:整型...

    java初学源代码

    Java初学源代码是针对那些刚开始接触编程,特别是对Java语言感兴趣的初学者设计的资源集合。这个压缩包可能包含了各种简单的Java程序实例,用于演示基本语法、数据类型、控制结构、类与对象等核心概念。通过这些源...

    Java初学者指南

    ### Java初学者指南知识点梳理 #### 一、Java概述与发展历程 - **定义与特性**:Java是一种广泛使用的面向对象的编程语言,以其跨平台性(Write Once, Run Anywhere, WORA)著称。 - **发展历史**: - 由Sun ...

    一个牛人给java初学者的建议

    ### Java初学者指南:从零开始到项目实战 #### 一、Java简介与特性 Java是一种广泛使用的高级编程语言,自1995年由Sun Microsystems公司发布以来,因其跨平台性和安全性等特点,迅速成为了企业级应用开发的重要...

    对于JAVA初学者必须要看的学习方法

    ### JAVA初学者必看的学习方法 对于初学者来说,在学习JAVA的过程中可能会遇到各种各样的问题,这不仅仅是因为JAVA本身的复杂性,还因为学习路径的选择、方法的掌握等多方面因素。下面将根据提供的部分信息,深入...

    JAVA初学者入门基础文档

    Java初学者入门基础文档是一份全面的教程,旨在帮助新手快速掌握Java编程语言的基本概念和技能。这份资料共分为15个章节,每个章节都深入浅出地讲解了Java编程的关键知识点,并通过实例来加深理解。 第1章:Java...

    java基础练习题初学者可使用

    本资源"java基础练习题初学者可使用"旨在帮助Java初学者巩固和提升他们的基础知识。以下是一些核心知识点的详细说明,这些知识点通常会出现在这些练习题中: 1. **基本数据类型**:Java有八种基本数据类型,包括...

    java初学者必读实践

    "Java初学者必读实践"这个资源,据说是2009年的最新版,专为初学者设计,提供了丰富的学习材料,帮助你从零开始掌握Java编程。 Java语言的基础部分主要包括以下几个核心知识点: 1. **基本语法**:Java的程序结构...

    java 初学者该怎么学

    ### Java初学者学习指南 Java,作为一门广泛应用的编程语言,其强大与灵活性吸引着无数初学者踏入这一领域。然而,对于初次接触Java的人来说,如何有效地学习并掌握这门语言,是一个值得深入探讨的话题。以下将从...

    java初学者福音

    【Java初学者福音】 在Java学习的初期,掌握一些核心概念和最佳实践是至关重要的。以下将详述几个关键知识点,帮助你扎实基础,避免常见错误。 1. 面向对象的设计法则: 面向对象编程(OOP)是Java的核心。一些...

    JAVA初学者基础过程强烈推荐

    ### JAVA初学者基础过程强烈推荐 #### 知识点概览 1. **JAVA语言简介与特点** 2. **JAVA的面向对象特性** 3. **JAVA的封装性** 4. **JAVA与C/C++的区别** 5. **JAVA的内存管理和安全性** 6. **JAVA的跨平台特性** 7...

    较适合JAVA初学者,面试者看的题目汇总

    【JAVA题目汇总】是针对初学者和找工作的程序员设计的一系列基础知识点的集合,涵盖了JAVA编程的核心概念。以下是对这些知识点的详细解释: 1. **面向对象的特征**: - **抽象**:抽象是将复杂的实体简化为关键...

    java 初学入门--think in java

    Java初学入门——《Think in Java》精要 在编程世界中,Java是一种广泛应用的面向对象的编程语言,尤其在企业级应用开发中占据主导地位。对于初学者来说,掌握Java的基本概念和语法是至关重要的。《Think in Java》...

    java初学者 推箱子练习

    本练习旨在让Java初学者通过编写推箱子游戏的程序,深入理解和应用面向对象的思想。 面向对象编程(Object-Oriented Programming,简称OOP)是现代软件开发中的核心编程范式。它的主要特征包括封装、继承和多态。在...

    java初学者忠告

    ### Java初学者忠告:构建坚实编程基础的关键 在IT行业迅速发展的今天,Java作为一门广泛应用的编程语言,吸引了大量初学者的关注与热爱。对于Java初学者而言,掌握正确的学习方法与心态至关重要。以下是从“java...

    java初学者完整代码+注释9

    本资源"java初学者完整代码+注释9"是一份专为Java新手设计的学习资料,涵盖了21个课程的内容,帮助初学者从零开始构建扎实的Java基础。 在Java的学习过程中,了解基本语法和概念至关重要。这包括: 1. **变量和...

Global site tag (gtag.js) - Google Analytics