1.1 System类的使用
说System类一定会首先想到两个方法:
(1)输出:System.out.println();
(2)数组拷贝:System.arraycopy();
完整定义:public static void arraycopy(Object src,int srcPos, Object dest,int destPos, int length)
在System类中定义有当前日期取得方法:public static long currentTimeMillis()
范例:利用此方法实现操作花费时间的统计:
package day2;
public class TestDemo {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
Thread.sleep(2000);
long end = System.currentTimeMillis();
System.out.println("计算花费的时间:" + (end - start));
}
}
计算花费的时间:2000(不一定特别准)
但是在System类中定义有这样的一个方法:public static void gc(),但是这个方法并不是实现的新的方法,而是继续调用了Runtime类中的gc()方法。
在新对象实例化的时候可以利用构造方法进行相应的处理操作,但是在某一个对象回收之后,那么改如何在回收前给他一些处理的机会呢?在Object类中提供一下对象回收前的释放操作:
方法:protected void finalize() throws Throwable;
注:此处可以抛出Error或Exception,但是不管抛出谁,最终都一定要被回收。
范例:观察对象回收
package day2;
class Person{
public Person(){
System.out.println("嘤嘤嘤。。。王老二出生了!");
}
protected void finalize() throws Throwable{
System.out.println("咳咳咳。。。王老二该挂了!");
throw new Exception("王老二还想再活500年");
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
Person person = new Person();
person = null;
System.gc();
}
}
嘤嘤嘤。。。王老二出生了!
咳咳咳。。。王老二该挂了!
注:“王老二还想再活500年” 没有打印,因为: Throwable,不管抛出什么,最终都一定要被回收
面试题:请解释final、finally、finalize的区别
(1)final:定义不能够被继承的父类,不能够被子类所覆写的方法、定义常量;
(2)finally:是异常处理中进行异常处理的统一出口;
(3)finalize:是Object类的一个方法(protected void finalize()throws Throwable)是在对象回收前进行收尾操作。
总结:
(1) 在System类中定义有当前日期取得方法:public static long currentTimeMillis();
(2)gc()方法永远只有一个方法,在Runtime类中定义的。
1.2 对象克隆的操作实现
对象克隆知道是就是复制对象,在Object类中提供有一个对象克隆的操作方法:
方法:protected Object clone() throws CloneNotSupportedException
(1)由于所有类的对象都有可能出现克隆的情况,所以此方法的返回值是Object;
(2)protected只能够在同一包或者不同包的子类中访问;
(3)克隆方法中会抛出一个异常,如果要克隆所在的类中没有实现Cloneable接口, 覆盖clone方法的子类会抛出此异常以指示实例无法克隆。
但是在JDK API文档中打开Cloneable接口之后会发现,在这个接口里面没有定义任何的操作方法,因为他是一个标识接口,表示一种能力。
范例:实现克隆的操作
package day2;
class Person implements Cloneable{//表示此类对象可以克隆
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "姓名 :" + this.name + ",年龄:" + this.age;
}
public void setAge(int age){
this.age = age;
}
//在Object中clone()是protected修饰,所以子类不能直接使用,需要重写改方法,并调用父类方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class TestDemo {
public static void main(String[] args) throws Exception {
Person person1 = new Person("王铭",10);
Person person2 = (Person)person1.clone();
System.out.println(person1);
person2.setAge(20);
System.out.println(person2);
}
}
姓名 :王铭,年龄:10
姓名 :王铭,年龄:20
对象克隆的关键在于Cloneable接口的使用。
面试题:public,private,默认,protected的区别,继承方法与访问权限
public:表示所有其他类都可以访问。
protected:当前类或子类可以访问,同时相同包内的其他类也可以访问protected成员;
default :默认(没有修饰符):表示本包内可以使用
private:表示的是在本类内可以使用;
访问范围:
private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问.
protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问
public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问
注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数
父类与其直接子类的访问关系如上,无论是哪种继承方式(private继承、protected继承、public继承)。
对于三种继承关系的不同:
public继承:public继承后,从父类继承来的函数属性不变(private、public、protected属性不变,)。
private继承:private继承后,从父类继承来的函数属性都变为private
protected继承:protected继承后,从父类继承过来的函数,public、protected属性变为protected,private还是private。
总结:
(1)标识接口最大特征在于表示一种能力,而不会定义方法;
(2)protected权限。



