JVAM内存模型
Object对象及它的方法
Object类是所有类的父类,我们的类没有extends Object,它都会默认继承Object
Object判有几个方法,所有的类都会继承这些方法,有需要的时候可以重写这些方法
-
toString()
如果一个对象直接用于显示,它默认区调用toString(),把返回内容显示出来。
对象toString()方法默认返回类的全限定名再加上对象的d,这个信息没有太大参考价值,所以我们常常重写类的toString()方法,返回属性的值
@Override public String toString() { return "Student{" + "num=" + num + ", name='" + name + '\'' + '}'; }
-
equals() 和hashCode()
hash是一种算法,根据一定的内容生成一个hash code值,用于判断两个内容是否一样
equals()方法判断两个对象是否内容相等,它依赖hashCode()方法
@Override
public boolean equals(Object o) {
//首先对比地址是否相同
if (this == o) return true;
//要比较对象是不是null,是null不用相等
//getClass() != o.getClass() 判断两个类是不是同一个类创建的,如果不是肯定不相等
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return num == student.num && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(num, name);
}
测试代码
Student student = new Student();
student.setName("张三");
student.setNum(10086);
System.out.println(student);
Student student1 = new Student();
student1.setName("张三");
student1.setNum(10086);
System.out.println(student1);
//对象用 == 比较,比较的是它的地址
System.out.println(student == student1);
//用equals判断两个对象,equals方法返回true则两者相等
System.out.println(student.equals(student1));
== 与 equals
基本类型判断是否相等用 ==
引用(对象)类型用==判断,只是判断对象的地址,如果相等,说明是指向堆中的同一个对象
逻辑上判断两个对象是否相等,需要用equals方法,往往需要重写equals
注意:字符串的字面量赋值时不会生成对象,而是存放在常量池,常量池中的字符串可以共享
short s = 65;
int i = 5;
char c = 'A';
//基本类型用==比较,它是比较的值,和类型美哦有关系
System.out.println(s == i);
System.out.println(i == c);
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2); //false
System.out.println(str1.equals(str2));
String str3 = "xyz";
String str4 = "xyz";
//字面量赋值的字符串保存在常量池,并不会创建一个对象
System.out.println(str3 == str4);
System.out.println(str3.equals(str4));
getClass()
返回类的class类型对象
每一个类加载到方法区时都会生成一个calss类型的对象,这个对象负责访问类的字节码
finalize()
gc(垃圾回收器)回收对象之前会调用的一个方法
notify及wait等方法
这些方法是多线程时要使用的
final()
flag意思是最终的,它也是修饰符,它可以修饰类、成员变量、方法
-
修饰属性
- 修饰成员变量时要赋值,static final修饰的成员变量就是常量
- 修饰局部变量,可以先定义再赋值
- 不管时修饰哪一种变量,只能被赋值一次,再也不能被修改
public class Parent { public static final float pi = 3.14f; public static int count; private int num; //final 的成员变量必须要初始化 //final的变量不能再被赋值(值初始化后不能再改变) public final int flag = 0; public static void area(float r){ System.out.println(pi * r *r); } public int getNum() { final int i; i = 2; System.out.println(i); System.out.println(flag); return num; }
-
修饰方法
final修饰的方法不能被重写
public final void test(){
}
-
修饰类
final修饰的类不能被继承
public final class Parent{ }
+ 修饰方法
final修饰的方法不能被重写
```java
public final void test(){
}
-
修饰类
final修饰的类不能被继承
public final class Parent{ }