问题五:到底要怎么样初始化!
本问题讨论变量的初始化,所以先来看一下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类型的数据。举个例子:
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精华积累每个初学者都应该搞懂的问题 在学习Java的过程中,有许多基础知识是每位初学者都需要掌握的。本文将从给定的文件标题、描述、标签以及部分内容中提炼出几个重要的知识点进行详细解读,帮助大家更好...
每个学Java的人都应该搞懂。当然,如果只是学Java玩玩就无所谓了。如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列。
### 每个JAVA初学者都应该搞懂的问题详解 #### 问题一:我声明了什么! 在Java中,当我们执行 `String s = "HelloWorld!";` 这样的语句时,实际上是在做两件事情:一是声明了一个类型为String的引用变量`s`,二是...
这个名为“每个JAVA初学者都应该搞懂的问题”的压缩包文件,显然是为那些刚开始学习Java的人准备的一份详细教程。让我们来探讨一下其中可能包含的知识点。 首先,我们看到一个名为“每个JAVA初学者都应该搞懂的问题...
【标题】: "每个Java初学者都应该搞懂的六个问题" 【描述】: 本文针对Java初学者,列出了六个核心问题,旨在帮助他们更好地理解和掌握Java编程的基础知识。 【标签】: "1" 【正文】: 对于Java初学者来说,理解和...
`,尽管`a`和`b`看起来都应该指向相同的内容,但`==`运算符将返回`false`,因为它们实际上分别指向内存中不同位置的两个独立的字符串对象。这里,`==`比较的是引用而非对象的实际内容。 为了比较对象的内容是否相等...
Java初学者在学习过程中会遇到很多关键概念,以下六个问题是每个Java学习者都应该掌握的。 1. **对象与引用的理解** - 在Java中,声明`String s = "Hello world!";`实际上是声明了一个名为`s`的引用变量,它指向了...
### 每个学Java的人都应该搞懂的关键概念 在Java编程的学习旅程中,有若干核心概念是每位学习者必须掌握的。本文将基于提供的部分信息深入解析这些关键知识点,帮助初学者更好地理解并运用Java。 #### Java中的...
Java 是一种广泛使用的编程语言,尤其适合初学者学习。在这个系列中,我们将深入探讨几个关键的概念,这些都是每个Java新手必须理解...对于每个初学者来说,深入掌握这些概念将有助于更好地理解和编写高效的Java代码。
### 每个学Java的人都应该搞懂的问题 在学习Java的过程中,会遇到许多经典问题,这些问题不仅是初学者常犯的错误来源,也是深入理解Java语言特性的重要途径。本文将针对给定文件中的几个核心问题进行详细解析,帮助...
"一天搞懂深度学习"这个主题涵盖了深度学习的基础概念、核心模型以及实际应用,旨在帮助初学者快速理解和掌握这一技术。 首先,我们来探讨深度学习的基本概念。深度学习的核心是神经网络,它由一系列的层(如输入层...
李宏毅教授的教程也提供了深度学习的基本技术概览,这不仅帮助初学者入门,也为已经有一定基础的研究者提供了进阶的思路和方法。 综上所述,李宏毅教授的《一天搞懂深度学习》是一本适合不同层次读者的书籍。它不仅...
《一天搞懂深度学习》是台湾大学李宏毅教授的知名公开课,这门课程以其深入浅出的讲解和丰富的实例深受学习者喜爱,是初学者踏入深度学习领域的理想选择。李宏毅教授的课程覆盖了深度学习的基础理论、重要模型以及...