java基础类库学习(一.1)Scanner/System/Runtime/Object/Objects

本文深入探讨Java程序的运行机制,包括JVM如何通过解释器找到并执行主方法,字节码文件的运行过程,以及如何通过Scanner类获取外部数据。同时,详细介绍了System类和Runtime类的功能,以及Object类的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

合格的java程序员,需要掌握java se中70%的类,也就是2800个类的熟练使用

jvm运行字节码程序的过程?程序是如何运行的?

一个类若想运行,则该类中一定包含主方法public static void main(String [] args){}

我们知道这是程序运行的入口,那么为什么只有这个才是程序运行的入口呢?

java程序运行:字节码文件经过解释器的解释运行在jvm虚拟机器上,jvm虚拟机需要找到程序运行的入口,解释器规定程序运行的入口是public static void main(String[] args){},即jvm虚拟机的解释程序在运行程序时,需要找到解释的入口才能让程序得以运行,

jvm通过解释器加载含有public static void main(String[] args){}方法的类,jvm负责执行此方法,因此为public,声明为static是因为jvm加载该类时并不会主动创建该类的对象,jvm通过该类来调用主方法,void无返回值,返回给jvm,参数string[] args是负责jvm如果想给此方法传参的接口

在jvm成功调用主方法后,程序得以运行,在运行的过程中,程序还是会加载类到内存中,如果需要创建对象,程序会为该对象分配堆内存,为一些方法中的局部变量分配栈内存,程序继续运行

获取文件/输入流中的数据的类Scanner?

那么在程序运行过程中如何获取文件/输入流中的数据的呢?

java为我们提供了一个类Scanner:用于在程序运行过程中获取外部数据

Scanner类是一个文本扫描器类,这个类可以扫描文件/输入流/字符串中的文本,解析出基本类型值和字符串值

1扫描输入流-----------Scanner获取键盘输入/标准输入

Scanner sc=new Scanner(System.in);//将输入流作为构造器的参数,System类直接调用其类变量输入流static InputStream in

Scanner提供的两个实例方法用于扫描标准输入

hasNextInt()/hasNext():判断是否还有下一个输入项(int/long/string)

nextXxx():获取下一个输入项默认情况下,

Scanner使用回车/空格/Tab作为输入项之间的间隔,默认使用的是空格作为输入项之间的间隔 sc.useDelimeter("\n");

2扫描文件--------------Scanner获取文件输入

Scanner sc=new Scanner(new File("xx.txt"));//将文件对象作为构造器参数 

代表当前java程序运行平台的类System?

system类是对当前java程序运行平台的一个抽象的类,提供了访问运行平台的方法。

1不允许System类创建实例,否则就会有很多的java程序运行平台,

因此System类中只有类变量和类方法,因此平日我们也是直接通过System类来调用的类变量

public final class System {
private static native void registerNatives();
static {
    registerNatives();
}
private System() {//构造器私有,只允许本类创建system的实例
}
public final static InputStream in = null;//system类变量:标准输入流
public final static PrintStream out = null;//system类变量:标准输出流
public final static PrintStream err = null;//system类变量:错误输出流

}

2java无法访问操作系统底层硬件设备,必须借助c语言来实现,因此native方法使用c语言来为java方法提供实现

实现步骤如下

(1)声明native方法,只有方法签名,没有方法实现,编译得到class文件

(2)javah 编译第一步生成的class文件,产生一个.h文件

(3)写一个.cpp文件实现native方法

(4)将.cpp文件编译成动态链接库文件

(5)在java中用System类的loadLibrary()方法/Runtime类的loadLibrary()放啊加载动态链接库文件,在java程序中就可以调用这个native方法了

3System提供了访问运行平台属性的方法。

getProperties()/getenv()/getProperty()访问当前java程序运行平台的系统属性和环境变量

public static Properties getProperties() {
    SecurityManager sm = getSecurityManager();
    if (sm != null) {
        sm.checkPropertiesAccess();
    }

    return props;
}

4System还提供调用了辅助当前平台进行垃圾回收和进行资源清理的线程的执行的方法

public static void gc() {
    Runtime.getRuntime().gc();
}
public static void runFinalization() {
    Runtime.getRuntime().runFinalization();
}

5System类还提供了获取当前运行平台的时间的方法

public static native long currentTimeMillis();
public static native long nanoTime();

代表java程序的运行环境Runntime类?

每一个java程序都有与之对应的Runtime实例,An application cannot create its own instance of this class.

可以通过Runtime类访问JVM的相关信息,处理器数量/内存信息

public class Runtime {
    private static Runtime currentRuntime = new Runtime();
public static Runtime getRuntime() {//外部程序访问当前运行环境实例的接口
    return currentRuntime;
}
private Runtime() {}//不允许外部程序创建Runntime实例
public native long freeMemory();//jvm的空闲内存
public native long totalMemory();
public native long maxMemory();
public native void gc();//系统垃圾回收的方法实现由c完成
private static native void runFinalization0();//清理系统资源的方法由c完成
public void exit(int status) {
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkExit(status);
    }
    Shutdown.exit(status);
}
public void loadLibrary(String libname) {//提供这些方法来加载文件和动态链接库
    loadLibrary0(Reflection.getCallerClass(), libname);
}
public void load(String filename) {
    load0(Reflection.getCallerClass(), filename);
}

}

所有类的父类?Object

Object是所有类,数组,枚举类的间接父类,当定义类时,如果没有显示extends,则该类默认继承Object类

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
public final native Class<?> getClass();//返回该对象运行时的类对象
public native int hashCode();
public boolean equals(Object obj) {
    return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;//实现自我克隆
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
  protected void finalize() throws Throwable { }//由垃圾回收器调用
}

任何类都是Object类的子类,因此子类实例可以调用/重写Object类的实例方法

又发现了一个标记接口--Cloneable,实现该接口的类的实例可以实行按自我克隆

public interface Cloneable {
}

自定义类实现克隆的方法

实现自己的clone方法,通过super.clone();得到该对象的副本,并返回该副本、、

public User clone(){

return (User)super.clone();

}

但是Object类方法实现的clone()都是浅克隆,即只会克隆对象的所有成员变量的值,并不会对引用类型变量的成员变量的值引用的独享进行克隆,克隆的只是地址值,开发者需要自己深克隆

操作对象的工具类Objects?

public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}
public static boolean deepEquals(Object a, Object b) {
    if (a == b)
        return true;
    else if (a == null || b == null)
        return false;
    else
        return Arrays.deepEquals0(a, b);
}
public static int hashCode(Object o) {
    return o != null ? o.hashCode() : 0;
}
public static String toString(Object o) {
    return String.valueOf(o);
}
public static String toString(Object o, String nullDefault) {
    return (o != null) ? o.toString() : nullDefault;
}
public static boolean isNull(Object obj) {
    return obj == null;
}
public static boolean nonNull(Object obj) {
    return obj != null;
}

}

这些工具方法大多是空指针安全的

 

 

、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值