`

每个初学者都应该搞懂的问题2

 
阅读更多

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

本问题讨论变量的初始化,所以先来看一下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块里才有初始化语句,编译部通过。如果在catchfinally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!

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

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

Strings = "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精华积累每个初学者都应该搞懂的问题.txt

    ### Java精华积累每个初学者都应该搞懂的问题 在学习Java的过程中,有许多基础知识是每位初学者都需要掌握的。本文将从给定的文件标题、描述、标签以及部分内容中提炼出几个重要的知识点进行详细解读,帮助大家更好...

    Java精华积累每个初学者都应该搞懂的问题

    每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。

    每个JAVA初学者都应该搞懂的问题!

    ### 每个JAVA初学者都应该搞懂的问题详解 #### 问题一:我声明了什么! 在Java中,当我们执行 `String s = "HelloWorld!";` 这样的语句时,实际上是在做两件事情:一是声明了一个类型为String的引用变量`s`,二是...

    每个JAVA初学者都应该搞懂的问题.rar

    这个名为“每个JAVA初学者都应该搞懂的问题”的压缩包文件,显然是为那些刚开始学习Java的人准备的一份详细教程。让我们来探讨一下其中可能包含的知识点。 首先,我们看到一个名为“每个JAVA初学者都应该搞懂的问题...

    每个Java初学者都应该搞懂的六个问题

    【标题】: "每个Java初学者都应该搞懂的六个问题" 【描述】: 本文针对Java初学者,列出了六个核心问题,旨在帮助他们更好地理解和掌握Java编程的基础知识。 【标签】: "1" 【正文】: 对于Java初学者来说,理解和...

    【经典推荐】每个初学者都应该搞懂的问题!

    `,尽管`a`和`b`看起来都应该指向相同的内容,但`==`运算符将返回`false`,因为它们实际上分别指向内存中不同位置的两个独立的字符串对象。这里,`==`比较的是引用而非对象的实际内容。 为了比较对象的内容是否相等...

    java初学者应该搞懂的六个问题

    Java初学者在学习过程中会遇到很多关键概念,以下六个问题是每个Java学习者都应该掌握的。 1. **对象与引用的理解** - 在Java中,声明`String s = "Hello world!";`实际上是声明了一个名为`s`的引用变量,它指向了...

    每个学Java的人都应该搞懂

    ### 每个学Java的人都应该搞懂的关键概念 在Java编程的学习旅程中,有若干核心概念是每位学习者必须掌握的。本文将基于提供的部分信息深入解析这些关键知识点,帮助初学者更好地理解并运用Java。 #### Java中的...

    java 每个新手都要搞懂弄明白的

    Java 是一种广泛使用的编程语言,尤其适合初学者学习。在这个系列中,我们将深入探讨几个关键的概念,这些都是每个Java新手必须理解...对于每个初学者来说,深入掌握这些概念将有助于更好地理解和编写高效的Java代码。

    每个学Java的人都应该搞懂的问题

    ### 每个学Java的人都应该搞懂的问题 在学习Java的过程中,会遇到许多经典问题,这些问题不仅是初学者常犯的错误来源,也是深入理解Java语言特性的重要途径。本文将针对给定文件中的几个核心问题进行详细解析,帮助...

    一天搞懂深度学习

    "一天搞懂深度学习"这个主题涵盖了深度学习的基础概念、核心模型以及实际应用,旨在帮助初学者快速理解和掌握这一技术。 首先,我们来探讨深度学习的基本概念。深度学习的核心是神经网络,它由一系列的层(如输入层...

    一天搞懂深度學習

    李宏毅教授的教程也提供了深度学习的基本技术概览,这不仅帮助初学者入门,也为已经有一定基础的研究者提供了进阶的思路和方法。 综上所述,李宏毅教授的《一天搞懂深度学习》是一本适合不同层次读者的书籍。它不仅...

    台大李宏毅一天搞懂深度学习公开课课件(ppt)下

    《一天搞懂深度学习》是台湾大学李宏毅教授的知名公开课,这门课程以其深入浅出的讲解和丰富的实例深受学习者喜爱,是初学者踏入深度学习领域的理想选择。李宏毅教授的课程覆盖了深度学习的基础理论、重要模型以及...

Global site tag (gtag.js) - Google Analytics