今天开始重新温习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。
分享到:
相关推荐
Java 易混淆概念 Anonymous Inner Class Java编程语言中存在一些易混淆的概念,今天我们将探讨 Anonymous Inner Class、final、finally、finalize 的区别,Static Nested Class 和 Inner Class 的不同,&和&&的区别...
### 使用Java混淆工具yguard #### 一、引言 在软件开发领域,尤其是开源社区之外,保护知识产权是一项至关重要的任务。源代码作为软件的核心资产,一旦泄露将给开发者或公司带来不可估量的损失。因此,对于商业...
1. 简单性:Java的语法接近C/C++,但移除了复杂和易混淆的特性,如操作符重载和多继承,且提供了自动垃圾回收机制。 2. 面向对象:Java支持类、接口和继承,虽然仅支持单继承,但接口可以多继承,同时支持动态绑定。...
`a == (x + y)`为`false`,因为`+`操作符创建了新的`StringBuilder`对象。 3. **`Override`(重写)**: 重写是子类对父类方法的一种覆盖。在`OverrideTest`类中,`Child`类覆盖了`Parent`类的`say2()`方法,所以`...
在Java编程中,开发者经常会遇到各种误区和混淆之处,这些问题可能涉及语言特性、算法逻辑、性能优化等多方面。...总体而言,理解并正确使用Java的基本操作符和数据类型是每一个Java开发者应当掌握的关键技能。
ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、...
Java代码混淆是软件开发中的一个重要环节,特别是在保护知识产权和防止恶意逆向工程分析时。Allatori是一款强大的Java代码混淆工具,版本7.1,专为防止反编译设计。通过这款工具,开发者能够对源代码进行混淆处理,...
- **自定义实现**:若要从头构建一个压缩混淆工具,需要熟悉Java的I/O操作,字符串处理,以及正则表达式。对于变量混淆,可能需要实现一个算法来生成新的变量名。 4. **流程设计**: - **读取文件**:首先,程序...
在Java编程语言中,关系操作符是用来比较两个变量或对象之间关系的关键元素。它们主要用于确定基本数据类型(如int、double等)以及对象之间的大小、相等性或不相等性。关系操作符包括`==`、`!=`、`>`、`、`>=`和`。...
压缩可以通过删除空格、换行符和注释来减小文件大小,而混淆则会将变量名和函数名替换为更短的形式,进一步压缩代码。 这个Java源码实现的JS和CSS压缩混淆工具有以下几个核心功能: 1. **压缩**:压缩过程通常包括...
- 对于命令行版本,你需要在终端或命令提示符中输入指定的命令行参数,比如指定输入的Unity项目目录和输出混淆后的项目目录。 - 完成混淆后,用混淆后的项目替换原始项目,然后正常编译和打包应用。 4. **混淆的...
Java与C/C++有诸多相似之处,比如变量声明、操作符和流控制,但也存在显著差异。Java没有C++中的内存泄漏问题,因为它具有自动垃圾回收机制,不支持全局变量、goto语句、头文件、宏定义和指针。Java的所有数据类型都...
Kotlin的设计目标之一就是消除Java中的空指针异常,而Elvis操作符正是这个目标的一个体现。在本文中,我们将深入探讨Elvis操作符的使用、特性和注意事项。 首先,Kotlin是一门静态类型的现代编程语言,它由...
本文将深入探讨基于Java实现的JS和CSS压缩混淆工具——JsCompressor的相关知识点。 首先,我们理解一下JavaScript和CSS压缩的必要性。在网页开发中,未压缩的JS和CSS文件往往体积较大,包含了许多空格、注释和换行...
Java中的自增和自减操作符(++/--)是编程中常见的语法元素,它们用于快速地增加或减少变量的值。这些操作符分为前置和后置两种形式,每种形式在不同情境下会有不同的效果。 1. 自增操作符(++) - 前置自增(++...
在Java中,取余操作符 `%` 的行为可能会在处理负数时引起混淆。通常,当`i % 2`等于1时,我们认为`i`是奇数,但当`i`为负奇数时,`i % 2`实际上是-1而不是1。这是因为Java的取余操作符遵循这样一个恒等式:`(a / b) ...
6. 不支持操作符重载。 Java的标准库中有一个特殊的包`java.lang`,它会被自动导入,包含基础类和接口,如Object、String和System等。 Java应用程序(Application)通常以main()方法作为程序的入口点,而Java小...
第11题中,"john"和"john"是相等的,但赋值操作符`=`与相等比较操作符`==`混淆了,所以C是错误的。第12题中,switch语句的执行会导致a最终为10,输出10。第13题的while循环会执行一次,因为i初始为10,经过内部的i++...