1.API
API(Application Programming Interface),应⽤程序编程接⼝。Java API是⼀本程序员的”字 典”,是JDK提供给我们使⽤的类的说明⽂档。这些类将底层的代码实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使⽤即可。所以我们可以通过查询API的⽅式,来学习Java提供的类,并得知如何使⽤它们。
JDK
包结构
为了便于使⽤和维护,
JDK
类库按照包结构划分,不同功能的类划分在不同的包中;
2.Object类
此类存在于java.lang包下,java.lang.Object类是java语言中的根类,也就是所有类的父类。
根据
JDK
源代码及
Object
类的
API
⽂档,
Object
类当中包含的⽅法有
11
个。
其中只有一个无参构造方法,并且没有静态常量,所有方法必须通过对象来调用。
1.Class<?> getClass()
//get class() 可以获得对应的类的对象的字节码文件
public class GetClassDemo {
public static void main(String[] args) {
Student stu1 = new Student("小白",23);
Student stu2 = new Student("小青",21);
Class c1 = stu1.getClass();//获取对象的字节码文件
Class c2 = stu2.getClass();//Class是用来接收字节码文件的类型
System.out.println(stu1 == stu2);//false 因为是两块不一样的内存空间,所以地址值不会一样
System.out.println(c1 == c2);//true 这对比的是字节码文件一不一样 因为是同一个类 那肯定是一样的
}
}
public class Student {
int age;
String name;
public Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2. protected Object clone()
//clone()
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
CloneDemo demo = new CloneDemo();
demo.setA(2);
demo.setB(5);
//深克隆:复制对象
CloneDemo cloneDemo = (CloneDemo)demo.clone();//克隆demo对象
int a = cloneDemo.getA();
System.out.println(a);//2
System.out.println(demo == cloneDemo);//false 注意地址值还是不一样的
//浅克隆:复制引用
CloneDemo cloneDemo1 = demo;
System.out.println(cloneDemo1.getB());//5
}
}
//CloneNotSupportedException
//当调用 Object 类中的 clone 方法复制对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
//方法必须重写
//必须要实现Cloneable接口,否则会抛出CloneNotSupportedException - 不支持的克隆异常
public class CloneDemo implements Cloneable{//Cloneable接口 - 是一个空接口,目的就是为了标记是可克隆的
int a;
int b;
public CloneDemo(){}
public CloneDemo(int a,int b){
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
@Override
public int hashCode() {
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
return super.equals(obj);
}
@Override
public String toString() {
return super.toString();
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
3.protected void finalize()
- 内存溢出:在内存中没有存储的地方
- 内存泄漏:内存被没有用的对象占用。一个对象分配内存空间后,在使用结束时没有及时释放,导致一直都在占用内存,没有及时清除,使得实际的可使用内存在减少。
- java存在垃圾回收机制 - gc :定时清理内存中的垃圾
注意:java原则上是不存在内存溢出和泄漏问题的。
//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
// 子类重写 finalize 方法,以配置系统资源或执行其他清除。
public class FinalizeDemo {
public static void main(String[] args) throws Throwable {
Student stu = new Student();
//对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。
stu.setAge(2);
stu.finalize();//调用方法 抛出异常
System.gc();
//垃圾回收:定时清理内存中的垃圾
//1.垃圾: 没有引用的对象,被定成垃圾
//2.可以手动调用 System.gc
System.out.println(stu.getAge());
}
}
public class Student {
int age;
String name;
public Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override//子类重写
protected void finalize() throws Throwable {
super.finalize();
System.out.println("hhhhh");
}
}
4.String toString()
返回该对象的字符串表示。
Java
语⾔中很多地⽅会默认调⽤对象的
toString
⽅法:
1、"" +
对象:⾃动调⽤对象的
toString
⽅法
2、System.out.print
(对象):直接调⽤
toString
⽅法
toString
⽅法返回该对象的字符串表示,其实该字符串内容就是对象的类型
+@+
内存地址值。
public class toStringDemo {
public static void main(String[] args) {
Student stu = new Student("lulu",25);
System.out.println(stu);//day13Api01.d_toString.Student@75412c2f
System.out.println(stu.toString());//day13Api01.d_toString.Student@75412c2f
//重写后:Studnet{name='lulu', age=25}
int[] arr = {1,2,4};
System.out.println(arr);
//[I@282ba1e
/*
* [ :表示数组
* I :表示数据类型
* @282ba1e : 16进制表示地址值
* */
}
public class Student {
int age;
String name;
public Student(){}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void