`
王杲杲
  • 浏览: 44383 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java的一个基础又简单的知识点:by value

阅读更多

前几天,网上找了套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"这个对象的引用。

分享到:
评论
7 楼 akun_007 2007-04-19  
还是要平时注意对基础的积累啊,不看这两道题真不知道自己的基础这么薄弱,“值传递”、“引用传递”、“打印内存地址”等等,好像一下子全忘光了。
6 楼 王杲杲 2007-01-27  
哦。杲杲还是有很多基础概念不清晰。

char ch[]={'H','e','l','l','o'};
System.out.println(ch);
这里确实打印:Hello

但下面这句话
System.out.println(ch + " and World");
就是打印ch的内存地址+空格+" and World"了。

二楼、三楼的兄弟的批评让我发现了这个问题。多谢。
5 楼 王杲杲 2007-01-27  
二楼、三楼的兄弟不知道有木有试过。

public static void main(String[] args) {
        char ch[]={'H','e','l','l','o'};
        System.out.println(ch);
    }

看看这段代码究竟打印什么。
4 楼 王杲杲 2007-01-27  
看下面
3 楼 bocar 2007-01-26  
第二题,打印的应该还是"me"。因为change()方法中p = new Person("another one");把原来传进来的形参的reference改成了新的类Person("another one")。如果去掉了那句话,形参的reference还是传进来的那个,打印的结果就是"third one"了。
2 楼 bocar 2007-01-26  
恩,System.out.println(char[])打印的和普通类一样,是内存地址。
1 楼 pcdos 2007-01-26  
看起来lz基础也不好啊

四个答案一个都不对,System.out.println(char[])可不是把char[]组装成字符串打印出来

相关推荐

    《Java-面向对象程序设计基础》章:Java语法基础(与“方法”有关文档共49张).pptx

    《Java-面向对象程序设计基础》章:Java语法基础 ...这些知识点涵盖了 Java 语法基础的多个方面,包括 Java 的简介、语言特点、开发工具、数组、值传递和关键字 this、标识符、关键字、Java 基本数据类型等。

    Java经典面试题大全(带答案)

    - **解释**:一个Java程序如果想要被`java.exe`成功运行,必须包含一个主方法`public static void main(String[] args)`。J2SDK包含了Java API,而不仅仅是API本身。`Appletviewer`可以运行包含`main()`方法的程序...

    java最新面试宝典

    ### Java最新面试宝典知识点概览...通过以上总结,可以看出《Java最新面试宝典》覆盖了Java开发人员面试中可能遇到的各种知识点,不仅包括基础知识,还有高级主题,旨在帮助求职者全面准备面试,提高通过面试的成功率。

    华为java笔试面试题.doc

    本文档是一个华为 Java 笔试面试题的集合,涵盖了 Java 语言的基础知识、数据库知识和编程实践等方面。下面是从文件中提炼出的知识点: Java 基础知识 1. Java 是从 C++ 语言改进重新设计的。 2. Java 程序经编译...

    Java笔试题基础知识.pdf

    Java的参数传递方式是“按值调用”(call by value)或“按引用调用”(call by reference)。按值调用不会改变实际参数的值,而按引用调用则可以通过传递对象的引用改变对象的内容,但不会改变引用本身。 在类方法...

    软通动力Java笔试题.pdf

    本文档概括了Java笔试题,涵盖了Java的基础知识、Java集合框架、Spring框架、J2EE事务、Java多线程、UML类图等多个方面的知识点。 访问权限控制 在Java中,存在五种访问权限控制等级,从最宽松到最严格控制等级...

    Java上海汉得笔试题+答案解析

    根据题目要求,我们将从标题、描述以及部分内容中提取并详细阐述相关的IT知识点。 ### Java上海汉得笔试题+答案解析 #### 单项选择题分析 **题目一:** ```java public static void main(String[] args) { Long ...

    华为java面试题

    根据给定的华为Java面试题内容,我们可以提炼出一系列重要的Java知识点,并对这些知识点进行详细的解释和分析。 ### Java基础知识 #### 1. Java的起源 - **知识点**:Java语言的发展历史及其与C++的关系。 - **...

    09.Dictionary.A.hashing.Call-by-value

    知识点四:Call-by-value(值传递) Call-by-value是计算机编程中一种参数传递的方式,其含义是当函数调用时,实际参数的值被复制一份传递给函数的形式参数。在函数内部对形式参数的任何修改都不会影响实际参数。...

    JAVA期末复习

    - 类的数量:一个JAVA源文件可以定义多个类(class),每个类都会被编译成单独的`.class`文件。 - 接口:也被视为一种特殊的类,同样会被编译成`.class`文件。 - 主函数(main method):每个类都可以定义一个main...

    Java程序设计-java语言编程基础.doc

    本文主要涵盖了标识符、关键字、注释以及基本数据类型这四个核心知识点。 首先,标识符是Java编程中的基本元素,用于命名变量、方法、对象、类和接口。标识符的规则如下: 1. 标识符由字母、数字、下划线(_)和...

    华为java面试题.doc

    本文档总结了华为 Java 面试题,涵盖了 Java 基础知识、面向对象编程、多线程、异常处理等多方面的知识点。下面是对每个问题的详细解释和知识点总结: QUESTION NO: 1 public class Test1 { public static void ...

    java面试题

    综上所述,本文档涵盖了Java面试中常见的知识点,包括语言基础、面向对象编程特性、数据类型、控制结构等方面。这些问题不仅考察了应聘者的Java基础知识掌握程度,还涉及到了高级特性如抽象类、接口以及方法调用机制...

    华为Java笔试题.doc

    ### 华为Java笔试题知识点解析 #### 一、单项选择题知识点解析 **1. Java的起源** - **知识点**: Java的历史和发展。 - **解析**: Java语言最初是由Sun Microsystems公司的James Gosling等人于1995年设计的。它是...

    Java面试题和答案(英文版).doc

    ### Java面试题与知识点解析 ...以上就是从给定的文件中提取出的相关Java知识点及其详细解释。这些知识点涵盖了Java编程语言的核心概念和技术要点,对于准备Java面试或者深入学习Java的人来说都是非常有价值的。

    java 使用JNA连接海康的硬盘录像机

    Java 使用JNA连接海康硬盘录像机的知识点详解 在Java开发中,有时我们需要与操作系统底层的库进行交互,例如控制硬件设备或者调用特定的系统API。Java Native Access(JNA)提供了一种无需编写C/C++桥接代码就能...

    java学习参数传递 杨辉三角,大学java作业题

    例如,以下是一个简单的Java代码示例: ```java public class YangHuiTriangle { public static void printYangHui(int rows) { int[][] triangle = new int[rows][]; for (int i = 0; i ; i++) { triangle[i] ...

Global site tag (gtag.js) - Google Analytics