前几天,网上找了套java题目,给项目组成员做了一次考试,意图是让大家知道很多基础概念还不一定清楚,于是应该good good study,day day up。
考试之后,有同事问起一个“by value”知识点相关的题目:
Given the following code:
public class Test{
public static void main(String args[])
{
String str=new String(World);
char ch[]={'H','e','l','l','o'};
change(str,ch);
//System.out.println(str + " and " + ch);
//这里,根据二楼、三楼兄弟指出的问题修改了题目。(多谢指正)
System.out.print(str + " and ");
System.out.println(ch);
}
public static void change(String str, char ch[])
{
str="Changed"; ch[0]='C';
}
}
What is the result after execution?
A. World and Hello
B. World and Cello
C. Changed and Hello
D. Changed and Cello
其他同事回信解释,涉及到“final class”和“不变类”两个概念。看来非常基础的概念也不是所有人都清楚,此次我把我回信的内容放在博客中,做个备份。可能会对非常非常初学的初学者有用。
String类是final的没错,这只是说明它不能够被其他类extends。跟这里的题目是没有关系的。
同时,String是不变类。没有任何一个语句可以在已经生成的String对象上做改变。比如"CC"是一个String对象,不可能有语句把"CC"的,比方说,第二个字符由"C"改成,比方说,"A";"CC"自从它被初始化,就永远是"CC","CA"是另一个对象。是不是不变类,跟这里的题目也没关系。
再比如另一段代码:
public static void main(String[] args) {
Person p = new Person("me");
change(p);
System.out.print(p.getName());//应该打印什么?
}
public static void change(Person p) {
p = new Person("another one");
p.setName("third one");
}
class Person {
private String name;
Person(String aName) {
name = aName;
}
void setName(String aName) {//可以看出,Person不是不变类。
name = aName;
}
String getName() {
return name;
}
}
原来的题目中,change方法体中,str="Change";这句话是把str这个原本指向"World"对象的String类引用,指向了另一个对象"Change"。
而main方法体中,调用change方法时候,JVM新做了一个str对象的拷贝、发往change方法、作为入参,就像int类型参数一样(这一点大家容易理解吧);change函数体内将入参str的值改变(指向另一个对象),不会影响到main方法中的str对象的值,即它的指向。
这里,by value的意思,不知道大家真正理解了没有。
str的value是对"World"这个对象的引用。
分享到:
- 2007-01-24 17:05
- 浏览 3562
- 评论(7)
- 论坛回复 / 浏览 (7 / 7027)
- 查看更多
相关推荐
《Java-面向对象程序设计基础》章:Java语法基础 ...这些知识点涵盖了 Java 语法基础的多个方面,包括 Java 的简介、语言特点、开发工具、数组、值传递和关键字 this、标识符、关键字、Java 基本数据类型等。
- **解释**:一个Java程序如果想要被`java.exe`成功运行,必须包含一个主方法`public static void main(String[] args)`。J2SDK包含了Java API,而不仅仅是API本身。`Appletviewer`可以运行包含`main()`方法的程序...
### Java最新面试宝典知识点概览...通过以上总结,可以看出《Java最新面试宝典》覆盖了Java开发人员面试中可能遇到的各种知识点,不仅包括基础知识,还有高级主题,旨在帮助求职者全面准备面试,提高通过面试的成功率。
本文档是一个华为 Java 笔试面试题的集合,涵盖了 Java 语言的基础知识、数据库知识和编程实践等方面。下面是从文件中提炼出的知识点: Java 基础知识 1. Java 是从 C++ 语言改进重新设计的。 2. Java 程序经编译...
Java的参数传递方式是“按值调用”(call by value)或“按引用调用”(call by reference)。按值调用不会改变实际参数的值,而按引用调用则可以通过传递对象的引用改变对象的内容,但不会改变引用本身。 在类方法...
本文档概括了Java笔试题,涵盖了Java的基础知识、Java集合框架、Spring框架、J2EE事务、Java多线程、UML类图等多个方面的知识点。 访问权限控制 在Java中,存在五种访问权限控制等级,从最宽松到最严格控制等级...
根据题目要求,我们将从标题、描述以及部分内容中提取并详细阐述相关的IT知识点。 ### Java上海汉得笔试题+答案解析 #### 单项选择题分析 **题目一:** ```java public static void main(String[] args) { Long ...
根据给定的华为Java面试题内容,我们可以提炼出一系列重要的Java知识点,并对这些知识点进行详细的解释和分析。 ### Java基础知识 #### 1. Java的起源 - **知识点**:Java语言的发展历史及其与C++的关系。 - **...
知识点四:Call-by-value(值传递) Call-by-value是计算机编程中一种参数传递的方式,其含义是当函数调用时,实际参数的值被复制一份传递给函数的形式参数。在函数内部对形式参数的任何修改都不会影响实际参数。...
- 类的数量:一个JAVA源文件可以定义多个类(class),每个类都会被编译成单独的`.class`文件。 - 接口:也被视为一种特殊的类,同样会被编译成`.class`文件。 - 主函数(main method):每个类都可以定义一个main...
本文主要涵盖了标识符、关键字、注释以及基本数据类型这四个核心知识点。 首先,标识符是Java编程中的基本元素,用于命名变量、方法、对象、类和接口。标识符的规则如下: 1. 标识符由字母、数字、下划线(_)和...
本文档总结了华为 Java 面试题,涵盖了 Java 基础知识、面向对象编程、多线程、异常处理等多方面的知识点。下面是对每个问题的详细解释和知识点总结: QUESTION NO: 1 public class Test1 { public static void ...
综上所述,本文档涵盖了Java面试中常见的知识点,包括语言基础、面向对象编程特性、数据类型、控制结构等方面。这些问题不仅考察了应聘者的Java基础知识掌握程度,还涉及到了高级特性如抽象类、接口以及方法调用机制...
### 华为Java笔试题知识点解析 #### 一、单项选择题知识点解析 **1. Java的起源** - **知识点**: Java的历史和发展。 - **解析**: Java语言最初是由Sun Microsystems公司的James Gosling等人于1995年设计的。它是...
### Java面试题与知识点解析 ...以上就是从给定的文件中提取出的相关Java知识点及其详细解释。这些知识点涵盖了Java编程语言的核心概念和技术要点,对于准备Java面试或者深入学习Java的人来说都是非常有价值的。
Java 使用JNA连接海康硬盘录像机的知识点详解 在Java开发中,有时我们需要与操作系统底层的库进行交互,例如控制硬件设备或者调用特定的系统API。Java Native Access(JNA)提供了一种无需编写C/C++桥接代码就能...
例如,以下是一个简单的Java代码示例: ```java public class YangHuiTriangle { public static void printYangHui(int rows) { int[][] triangle = new int[rows][]; for (int i = 0; i ; i++) { triangle[i] ...