Java零基础进阶篇之面向对象-Object类

本篇文章讲解的知识点主要围绕面向对象中的Object类,废话不多说,只分享Java相关的干货!

  1. Object 类是所有 Java 类的根基类
  2. 如果在类的声明中未使用 extends 关键字指明其基类,则默认基类为 Object
如:
public class User {
………..
}
相当于
public class User extends Object {
………..
}
toString()
返回该对象的字符串表示。通常 toString 方法会返回一个“以文本方式表示”此对象的字符串,Object 类的 toString 方法返回一个字符串,该字符串由类名加标记 @ 和此对象哈希码的无符号十六进制表示组成,Object toString 源代码如下:
getClass().getName() + '@' + Integer.toHexString(hashCode())
在进行 String 与其它类型数据的连接操作时,如:
System.out.println(student); ,它自动调用该对象的 toString() 方法
【代码示例】
public class ToStringTest01 {

public static void main(String[] args) 
{ int i = 100; 
System.out.println(100);

Person person = new Person(); 
person.id = 200;
person.name = "张三";

//会输出Person@757aef
//因为它调用了Object 中的toString 方法
//输出的格式不友好,无法看懂
System.out.println(person);


}
}

//class Person extends Object { //和以下写法等同class Person{

int id;


String name;

}
【代码示例】,覆盖 Person 中的 toString 方法
 
public class ToStringTest02 {

public static void main(String[] args) { Person person = new Person(); person.id = 200;
person.name = "张三";

//System.out.println(person.toString());

//输出结果为:{id=200, name=张三}
//因为println 方法没有带Person 参数的
//而Person 是Object,所以他会调用println(Object x)方法
//这样就是产生object 对其子类Person 的指向,而在Person 中
//覆盖了父类Object 的toString 方法,所以运行时会动态绑定
//Person 中的toString 方法,所以将会按照我们的需求进行输出
System.out.println(person);



}
}

//class Person extends Object { //和以下写法等同class Person{

int id;


String name;

public String toString() {
return "{id=" + id + ", name=" + name + "}";
}
}

finalize
垃圾回收器( Garbage Collection ),也叫 GC ,垃圾回收器主要有以下特点:
  • 当对象不再被程序使用时,垃圾回收器将会将其回收
  • 垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他,尽快回收资源(System.gc Runtime.getRuntime().gc()
  • 垃圾回收器在回收某个对象的时候,首先会调用该对象的 finalize 方法
  • GC 主要针对堆内存
  • 单例模式的缺点
当垃圾收集器将要收集某个垃圾对象时将会调用 finalize ,建议不要使用此方法,因为此方法的运行时间不确定,如果执行此方法出现错误,程序不会报告,仍然继续运行
public class FinalizeTest01 {

public static void main(String[] args) { Person person = new Person(); person.id = 1000;
person.name = "张三";


//将person 设置为null 表示,person 不再执行堆中的对象
//那么此时堆中的对象就是垃圾对象
//垃圾收集(GC)就会收集此对象
//GC 不会马上收集,收集时间不确定
//但是我们可以告诉 GC,马上来收集垃圾,但也不确定,会马上来
//也许不会来person = null;

//通知垃圾收集器,来收集垃圾System.gc();
/* try {
Thread.sleep(5000);
}catch(Exception e) {
}
*/
}


}


class Person{


int id;


String name;

//此方法垃圾收集器会调用
public void finalize() throws Throwable 
{ System.out.println("Person.finalize()");
  }
}
== equals 方法
  • 等号“==
等号可以比较基本类型和引用类型, 等号比较的是值 特别是比较引用类型,比较的是引用的内存地址
 
public class EqualsTest01 {


public static void main(String[] args) { int a = 100;
int b = 100;

//可以成功比较
//采用等号比较基本它比较的就是具体的值System.out.println((a == b)?"a==b":"a!=b");

Person p1 = new Person(); p1.id = 1001;
p1.name = "张三";


Person p2 = new Person(); p2.id = 1001;
p2.name="张三";

//输出为p1!=p2
//采用等号比较引用类型比较的是引用类型的地址(地址也是值)
//这个是不符合我们的比较需求的
//我们比较的应该是对象的具体属性,如:id 相等,或id 和name 相等
System.out.println((p1 == p2)?"p1==p2":"p1!=p2");


Person p3 = p1;


//输出为p1==p3
//因为 p1 和 p3 指向的是一个对象,所以地址一样
//所以采用等号比较引用类型比较的是地址System.out.println((p1 == p3)?"p1==p3":"p1!=p3");

String s1 = "abc"; String s2 = "abc";
//输出s1==s2
System.out.println((s1==s2)?"s1==s2":"s11=s2");


}
}


class Person{


int id;


String name;
}

Java零基础进阶篇之面向对象-Object类_第1张图片

  • 采用equals 比较两个对象是否相等
public class EqualsTest02 {

public static void main(String[] args) { String s1 = "abc";
String s2 = "abc";
// 输 出 s1==s2 System.out.println((s1==s2)?"s1==s2":"s1=s2");

String s3 = new String("abc"); String s4 = new String("abc");
System.out.println((s3==s4)?"s3==s4":"s3!=s4");

//输出s3 等于s4,所以确定string 的equals 比较的是具体的内容
System.out.println(s3.equals(s4)? "s3 等于s4": "s3 不等于s4");

Person p1 = new Person(); p1.id = 1001;
p1.name = "张三";

Person p2 = new Person();
p2.id = 1001;
p2.name="张三";

//输出:p1 不等于 p2
//因为它默认调用的是Object 的equals 方法
//而Object 的equals 方法默认比较的就是地址,Object 的equals 方法代码
如下:
//	public boolean equals(Object obj) {
//	return (this == obj);
//	}
//如果不准备调用父类的equals 方法,那么必须覆盖父类的equals 方法
行为
System.out.println(p1.equals(p2)? "p1 等于p2": "p1 不等于p2");

}
}

class Person{

int id;


String name;
}
在进一步完善
public class EqualsTest03 {

public static void main(String[] args) { Person p1 = new Person();
p1.id = 1001;
p1.name = "张三";

Person p2 = new Person(); p2.id = 1001;
p2.name="张三";


System.out.println(p1.equals(p2)? "p1 等于p2": "p1 不等于p2");

}
}


class Person{


int id;


String name;

//覆盖父类的方法
//加入我们自己的比较规则  public boolean equals(Object obj) {
if (this == obj) {
return true;
}
//确定比较类型为person
//同一类型,才具有可比性if (obj instanceof Person) {
//强制转换,必须实现知道该类型是什么
Person p = (Person)obj;
//如果id 相等就认为相等
if (this.id == p.id) { return true;
}
}
return false;
}


}
以上输出完全正确,因为执行了我们自定义的 equals 方法,按照我们的规则进行比较的,注意instanceof 的使用,注意强制转换的概念。将父类转换成子类叫做“ 向下转型 (造型)”,向下造型是不安全的。“ 向上转型 (造型)”是安全,子类转换成父类,如:将 Student 转成 Person,如 Dog 转成动物。

 

以上就是Object类相关的知识点了,配套视频教程,正在学习Java的同学们一定要持续关注哦~~

Java零基础进阶视频教程

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(Java学习资料,纯干货,Java学习视频教程,字符串,java,jvm,编程语言,object)