`
lovelydog
  • 浏览: 91874 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java操作符易混淆点

    博客分类:
  • java
阅读更多

今天开始重新温习java,翻了翻java编程思想,看到操作符那里有一些考试面试经常遇到的又容易出错的地方,在这记录一下。

 

1. 赋值操作:在对一个对象进行赋值操作时,我们所操作的是对对象的引用。比如使用c=d,将对象d赋给对象c,这时c所指向的正式d之前所指向的内存,这时如果改变c或者d其中任何一个的值,另外一个的值也会变。

下面举个例子说明:

class A{
	int a;
}

public class Test{
	public static void main(String[] args){
		A c = new A();
		A d = new A();
		c.a = 10;
		d.a = 15;

		c = d;
		System.out.println("c.a = " + c.a + ", d.a = " + d.a);
		d.a = 20;
		System.out.println("c.a = " + c.a + ", d.a = " + d.a);
	}
}

 输出结果为:

c.a = 15, d.a = 15

c.a = 20, d.a = 20

可见当d的值改变时,c的值也会跟着改变,这说明这两个对象指向同一块儿内存。

 

2. 方法调用中的别名问题,比如将对象a作为参数传递给函数f,并在函数f中对对象a进行修改,那么实际修改的是a对象本身,因为传递给f的是a的一个引用,它和a指向的是同一块内存。

class A{
	int item;
}

public class Test{
	public static void main(String[] args){
		A a = new A();
		a.item = 10;
		f(a);
		System.out.println("a.item = " + a.item);
	}
	static void f(A obj){
		obj.item = 20;
	}
}

 输出结果为:

a.item = 20

 

3. equals 和 ==

==就是用来比较对象的引用,也就是说它只在乎两个对象是不是指向同一块内存,如果是的话,就返回true,否则即使两个对象的值相等,它也返回false

equals()的默认行为也是比较引用,但是它在jdk的许多类中都被覆盖过了(这些类有java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)),覆盖后的结果为,只要两个对象的类型一致、值一致,就返回true,否则返回false。

举个例子:

class A{
	int item;
}

public class Test{
	public static void main(String[] args){
		A a = new A();
		a.item = 10;
		A b = new A();
		b.item = 10;
		
		f(a, b);

		a = b;
		f(a, b);

		String s1 = new String("test");
		String s2 = new String("test");
		if(s1 == s2)
			System.out.println("s1 == s2");
		else if(s1.equals(s2))
			System.out.println("s1 equals s2");
	}

	static void f(A a, A b){
		if(a == b)
			System.out.println("a == b");
		else 
			System.out.println("a != b");

		if(a.equals(b))
			System.out.println("a equals b");
		else
			System.out.println("a is not equals b");
	}
}

 输出结果为:

 a != b

 a is not equals b

 a == b

 a equals b

 s1 equals s2

这充分说明了 == 和 equals都是比较对象的引用的,s1 equals s2说明了在String类里覆盖了equals方法,只要两个对象值一样,就返回true。

 

0
0
分享到:
评论

相关推荐

    java易混淆概念Anonymous Inner Class

    Java 易混淆概念 Anonymous Inner Class Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,Static Nested Class 和 Inner Class 的不同,&和&&的区别...

    使用Java混淆工具yguard

    ### 使用Java混淆工具yguard #### 一、引言 在软件开发领域,尤其是开源社区之外,保护知识产权是一项至关重要的任务。源代码作为软件的核心资产,一旦泄露将给开发者或公司带来不可估量的损失。因此,对于商业...

    Java平台 Java虚拟机 Java 应用编程接口

    1. 简单性:Java的语法接近C/C++,但移除了复杂和易混淆的特性,如操作符重载和多继承,且提供了自动垃圾回收机制。 2. 面向对象:Java支持类、接口和继承,虽然仅支持单继承,但接口可以多继承,同时支持动态绑定。...

    容易搞混的Java知识点

    `a == (x + y)`为`false`,因为`+`操作符创建了新的`StringBuilder`对象。 3. **`Override`(重写)**: 重写是子类对父类方法的一种覆盖。在`OverrideTest`类中,`Child`类覆盖了`Parent`类的`say2()`方法,所以`...

    java解惑 PDF版

    在Java编程中,开发者经常会遇到各种误区和混淆之处,这些问题可能涉及语言特性、算法逻辑、性能优化等多方面。...总体而言,理解并正确使用Java的基本操作符和数据类型是每一个Java开发者应当掌握的关键技能。

    java混淆器ProGuard4.7

    ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、...

    Allatori-7.1-java代码混淆-防止反编译

    Java代码混淆是软件开发中的一个重要环节,特别是在保护知识产权和防止恶意逆向工程分析时。Allatori是一款强大的Java代码混淆工具,版本7.1,专为防止反编译设计。通过这款工具,开发者能够对源代码进行混淆处理,...

    java源码:JS和CSS压缩混淆 JsCompressor.rar

    - **自定义实现**:若要从头构建一个压缩混淆工具,需要熟悉Java的I/O操作,字符串处理,以及正则表达式。对于变量混淆,可能需要实现一个算法来生成新的变量名。 4. **流程设计**: - **读取文件**:首先,程序...

    简述Java编程之关系操作符

    在Java编程语言中,关系操作符是用来比较两个变量或对象之间关系的关键元素。它们主要用于确定基本数据类型(如int、double等)以及对象之间的大小、相等性或不相等性。关系操作符包括`==`、`!=`、`>`、`、`>=`和`。...

    基于Java的源码-JS和CSS压缩混淆 JsCompressor.zip

    压缩可以通过删除空格、换行符和注释来减小文件大小,而混淆则会将变量名和函数名替换为更短的形式,进一步压缩代码。 这个Java源码实现的JS和CSS压缩混淆工具有以下几个核心功能: 1. **压缩**:压缩过程通常包括...

    IOS混淆完美运行版

    - 对于命令行版本,你需要在终端或命令提示符中输入指定的命令行参数,比如指定输入的Unity项目目录和输出混淆后的项目目录。 - 完成混淆后,用混淆后的项目替换原始项目,然后正常编译和打包应用。 4. **混淆的...

    南理工java课程设计课件

    Java与C/C++有诸多相似之处,比如变量声明、操作符和流控制,但也存在显著差异。Java没有C++中的内存泄漏问题,因为它具有自动垃圾回收机制,不支持全局变量、goto语句、头文件、宏定义和指针。Java的所有数据类型都...

    Kotlin新手基础学习之Elvis操作符

    Kotlin的设计目标之一就是消除Java中的空指针异常,而Elvis操作符正是这个目标的一个体现。在本文中,我们将深入探讨Elvis操作符的使用、特性和注意事项。 首先,Kotlin是一门静态类型的现代编程语言,它由...

    基于Java的实例开发源码-JS和CSS压缩混淆 JsCompressor.zip

    本文将深入探讨基于Java实现的JS和CSS压缩混淆工具——JsCompressor的相关知识点。 首先,我们理解一下JavaScript和CSS压缩的必要性。在网页开发中,未压缩的JS和CSS文件往往体积较大,包含了许多空格、注释和换行...

    Java中自增和自减操作符(++/--)的那些事

    Java中的自增和自减操作符(++/--)是编程中常见的语法元素,它们用于快速地增加或减少变量的值。这些操作符分为前置和后置两种形式,每种形式在不同情境下会有不同的效果。 1. 自增操作符(++) - 前置自增(++...

    java解惑(中文)

    在Java中,取余操作符 `%` 的行为可能会在处理负数时引起混淆。通常,当`i % 2`等于1时,我们认为`i`是奇数,但当`i`为负奇数时,`i % 2`实际上是-1而不是1。这是因为Java的取余操作符遵循这样一个恒等式:`(a / b) ...

    java课程复习资料word版

    6. 不支持操作符重载。 Java的标准库中有一个特殊的包`java.lang`,它会被自动导入,包含基础类和接口,如Object、String和System等。 Java应用程序(Application)通常以main()方法作为程序的入口点,而Java小...

    JAVA试题及答案(50道选择题)-java选择题及答案.pdf

    第11题中,"john"和"john"是相等的,但赋值操作符`=`与相等比较操作符`==`混淆了,所以C是错误的。第12题中,switch语句的执行会导致a最终为10,输出10。第13题的while循环会执行一次,因为i初始为10,经过内部的i++...

Global site tag (gtag.js) - Google Analytics