java特性和优势
- 简单性
- 面向对象
- 可移植性
- 高性能
- 分布式
- 动态性
- 多线程
- 安全性
- 健壮性
java程序运行机制
- 解释型
- 编译型
源码文件(.java 文件) -->Java编译器 – >字节码文件(.class文件)-- >类加载器 – >字节码校验器 – > 解释器 --> 操作系统平台
1. == 和 equals的区别
-
对于object类来说没有区别,这一点可以从object类中的equals方法源代码中体现
public boolean equals(Object obj) { return (this == obj); }
源码中可以看到equals的本质就是 ==,而 == 对于基本数据类型比较内容,对于引用数据类型自然是引用地址。
-
object类是所有类的父类,即所有的类对象都可以调用equals方法,但不是所有的类中的equals方法都和 == 没有区别,毕竟object类中的equals方法没有被final修饰(被final修饰的方法不能被重写),是可以被子类重写的,对于字符串对象在使用equals和 == 返回结果不同,正是因为String,Integer等类重写了equal方法,我们来看String中的equals方法源码
public boolean equals(Object anObject) { // a.equals(b),a为调用方 // 1.判断地址是否一致,一致则相同 if (this == anObject) { return true; } // 2.判断b是不是String类,不是直接返回false if (anObject instanceof String) { // 3.将b转型为String类 String anotherString = (String)anObject; // a的长度 int n = value.length; // 4.a和b的长度相同继续比较,不同不需要比较了 if (n == anotherString.value.length) { // 5.a和b转换成字符数组 char v1[] = value; char v2[] = anotherString.value; int i = 0; // 6.挨个字符比较是否相同 while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } // 2.b不是string类直接返回false return false; }
可以看出来String重写equals方法,是通过上面的6个步骤最终从比较地址值,变为比较内容的。
彩蛋(对于上面红色字体加下划线标注的内容小扩展)
final–表示最终的,体现在java中
1.被final修饰的类不能被继承,表示最终的类,没有子类。
2.被final修饰的方法不能被重写,子类默认继承父类的方法,但不能去重写父类的方法。
3.被final修饰的变量表示常量,常量不可以修改 。注:使用static final关键字联合声明的变量称为全局常量;
此外还有一个特殊的例子
public static void main(String[] args) {
// 如果使用final修饰一个对象引用,他的值是可以被改变的,但地址引用是不变的
final User user = new User("xiaoming", 18);
System.out.println(user.getAge()); // 18
user.setAge(15);
System.out.println(user.getAge()); // 15
user = new User("xiaoming", 18); // 这里的user是编译报错的,显然不能更改他的引用
}