栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java基础类库——System类的使用、对象克隆的操作实现(三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java基础类库——System类的使用、对象克隆的操作实现(三)

System类的使用、对象克隆的操作实现

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权限。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/831837.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号