Java容易搞错的知识点 2011年08月17日 21:14:25
以下几个知识点是非常容易搞混的Java知识点。大家不准开编译器,并且先不看答案(我在代码和答案之间空了三行,足够你挡住下面的答案),要是能全部答对,那Java基础是挺牢固的。如果答对了,还能分析出具体原因,那算你NB。近段时间有参加一些公司的面试,做了一些基础题,发现总有掌握得不好的地方。今天一并总结了这些问题,希望对大家有所帮助。如果大家认为还有其它易混淆的地方,也可以在评论里发出来,大家一起讨论。
一、关于Switch
代码:
结果:
2
3
4
分析:
少了break;所以2以下的case和default都执行了一遍。
二、Equals和==运算符
代码:
结果:
x+y equals z:true
a == z:false
x == hello:true
a == helloworld:true
a == x+y:false
分析:
1.String.equals()方法比较的是字符串的内容,所以(x + y).equals(z)为true.
2.“==”比较的是 String 实例的引用,很明显 a 和z 并不是同一个 String 实例,所以(a == z)为false.
3.根据常量池的知识,容易得知(x == "hello")和(a == "hello" + "world")都为true.
(常量池指的是在编译期被确定并被保存在已编译的.class 文件中的一些数据。它包含了
关于方法、类、接口等,当然还有字符串常量的信息。也就是所谓的持久代。)
4.那么(a == (x + y))为什么是false呢?这点暂点有点不大清楚。初步认为是x+y是引用相加,不能放入常量池。
三、Override覆盖
代码:
结果:
parent static say
child say
分析:
1.我们创建了一个Parent类的实例。变量 p 的数据类型为 Parent 类 但是它仍旧是 Child 类的一个实例。因为Child类覆盖了Parent类的方法say2(),所以p.say2()调用为子类的方法。
2.为什么p.say()却是调用父类Parent的方法呢?因为Java中规定“实例方法被覆盖,静态方法被隐藏”.
关于Override的一些规则:
用子类的静态方法隐藏父类中同样标识的实例方法是不合法的,编译器将会报错;
用子类的实例方法覆盖父类中同样标识的静态方法也是不合法的,编译器同样会报错;
带关键字 final的方法(静态和实例方法)都不能被覆盖;
实例方法能够被覆盖;
抽象方法必须在具体类中被覆盖。
四、Java强类型
代码:
结果: 7.0
分析:
Java 是强类型的 strongly type,它支持8 种基本数据类型。通过对这些基本数据类型用法的严格检查 Java 编译器能够及时地在开发过程中捕捉到许多简单细微的错误。基本数据类型的转换可以隐性地发生,所以转换时会有精度损失。由于1/4和3/4发生隐性类型转换,精度损失,不会生成0.25和0.75,所以有分号的数都为0。
五、假构造函数
代码:
结果:
The value of c :0
分析:
public void Constructor()并不是一个真正的构造函数,而是一个方法。所以c的值为默认值0.
六、提前引用
代码:
结果:
first = 0
分析:
由于在初始化second之前test方法就访问了它,那么方法得到的是second的默认值,即 0。 因此输出结果first= 0,而不是2。假如你使用方法调用来初始化静态变量,那么你必须保证 这些方法并不依赖于在它们之后声明的其它静态变量。静态变量以及静态初始化块是在类被加载进 JVM 时执行初始化操作的。Java 语言规范8.5节指出“静态初始化块和静态变量是按照其在代码中出现的顺序依次执行初始化操作的,而不能在类变量声明出现之前就引用它”。
七、对象引用
代码:
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a,b);
System.out.println(a + "," +b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y =x;
}
}
结果:
AB,B
调用operate()的时候
x指向a存储实例的地址
y指向b存储实例的地址
x.append(y);使得a指向的内容变为"AB"
y=x;使得y指向x存储实例的地址(注意b指向的实例地址没有变)
所有在输出System.out.println(a + "," + b)时,实际的输出结果是 AB,B
java中方法传参数确实都是传值
当参数是对象引用时仅可以改变引用对象的内部状态,但对参数对象重新赋值是没有意义
所以x.append(y)改变了a指向StringBuffer对象的内容//ok
y=x,将b重新指向其他地址//failur
原文:http://page.renren.com/600882494/note/751310837
分享到:
相关推荐
在Java编程语言中,有一些知识点非常容易混淆,特别是在面试中常常被问到。以下是这些知识点的详细解释: 1. **Switch 语句**: 在Java中,Switch语句用于基于不同的条件执行不同的代码块。在给定的示例中,`...
以下就是针对标题"java解惑(罗列了95个容易让你迷惑的java知识点)"中提及的一些关键知识点的详细解释。 1. **Java内存模型**:Java内存模型(JMM)规定了线程如何共享和访问数据,包括主内存、工作内存以及内存间的...
以下是根据提供的文件信息,深入解析Java初学者容易混淆的知识点: ### 1. main()方法的语法格式 `public static void main(String[] args)`是Java应用程序的入口点。这里的`public`表示方法可被任何类访问,`...
### Java基础知识点详解 #### 一、Java语言的历史与地位 - **计算机语言的历史:** - **第一代语言(机器语言)**:基于0和1的二进制代码,直接与硬件交互,例如早期的打孔机。 - **第二代语言(汇编语言)**:...
本篇文章将深入探讨在Java学习过程中的一些关键知识点和容易混淆的概念。 基础篇: 1. JDK常用的包:Java Development Kit (JDK) 包含了Java运行环境和开发工具,其中核心的几个包如`java.lang`, `java.util`, `...
以下是一些重要的Java知识点,包括访问限定符、变量修饰符、嵌套类、变长参数、继承以及访问控制。 1. 访问限定符:Java提供了`public`、`private`和`protected`三种访问级别。`public`的成员可以在任何地方被访问...
个人在学习java时记录的小知识点,比较适合初学者!大多是一些容易忽略的知识点。
Java面试中的分布式和微服务知识点是现代企业招聘Java开发人员时常常关注的重点。本文将深入探讨Dubbo这一流行的Java微服务框架,以及与其相关的技术概念。 **Dubbo是什么?** Dubbo是由阿里巴巴开源的高性能Java ...
### Java2课本知识点详解 #### 第一章:Java的特点与版本分类 Java,作为一种由Sun Microsystems公司在1995年推出的程序设计语言,以其独特的特性在软件开发领域占据了一席之地。其主要特点包括: - **简单性**:...
"很容易弄错的Java面试题"通常涉及那些看似简单实则暗藏陷阱的问题,这些问题能够检验候选人在实际编程中的严谨性和对细节的把握。下面,我们将深入探讨一些经典的Java面试题及其背后的原理。 1. **对象的相等性**...
JAVA-web基础知识点 以下是对给定文件信息的详细解释和知识点总结: 1. 符合 j2ee 标准的 web-app 的目录结构 在 J2EE 标准中,web 应用程序的目录结构是固定的。其中,WEB-INF 目录是 web 应用程序的核心目录,...
### Java编写中容易搞错的一些东西 #### 1. `instanceof`操作符的理解 - **定义**: `instanceof`是Java中的一个关键字,用来测试一个对象是否属于某个类或接口。 - **特点**: - 实现了某接口的类的对象也是该接口...
java实战开发重要知识点,让你了解开发的常用方法,容易产生错误的地方
java的基础知识总结,对基本的知识点,容易错的知识点进行总结。文档中写有很多的案例。
JAVA 面试基础知识点总结 JAVA 是一种广泛使用的编程语言,具有平台无关性、安全性、面向对象、分布式和健壮性等特点。在面试中,了解 JAVA 的基础知识点非常重要。本文将从 JAVA 的历史、版本、特点、开发环境、...
以下是一些Java编程中的常见陷阱和理解误区,我们将会深入探讨这些知识点,帮助你避免在开发过程中走弯路。 1. **变量作用域**:Java中的变量有其特定的作用域,一旦变量在某个范围内定义,它的生命周期就限制在这...
#### 知识点详解: `String`和`StringBuffer`都是用于处理字符串的类,但它们之间存在显著差异。 - **String**:它是不可变的对象,一旦创建,其内容就不能更改。当尝试修改`String`对象时,实际上会创建一个新的`...