Scanner类
Scanner类是获取键盘输入,他的构造器还可以接收文件、输入流、字符串作为数据源。
Scanner主要提供了两个方法来扫描输入。
1、hasNextXxx():是否有下一个输入项,该方法是一个阻塞方法,会一直等待键盘输入的数 据,该方法还判断是否有下一个输入项,返回值是boolean类型的值;因此它会一直放回true。
2、nextXxx();获取下一个输入项。
还有一个方法:useDelimiter(String str)该方法可以把一个转义字符作为分割符。
Scanner还提供了两个方法来读取一行
boolean hasNextLine();返回源中是否还有下一行。
String nextLine();返回输入的源中的下一行字符串。
系统相关的类:System
System类代表当前java程序的运行平台。
System类中访问环境变量和系统属性。
如下代码:
public class SystemTest
{
public static void main(String[]args)
{
Map<String, String> env = System.getenv();//获取系统所有的环境变量。以key-value键值对保存。
for(String name : env.keySet())
{
System.out.println(name + "------>" + env.get(name));
}
System.out.println(System.getenv("JAVA_HOME"));//获取指定环境变量的值。
Properties prop = System.getProperties();
}
}
System类还可以获取当前系统的时间:currentTimeMillis(),返回的是long型整数。
System的in,err,out,分别代表了键盘输入,错误输出,和标准输出。并提供**setIn(),setErr(),setOut()**方法来改变系统的标准输入,错误输出流和标准输出流。
System类还提供了一个方法:identityHashCode(Object obj),该方法返回指定对象的精确hashCode值,也就是根据对象的地址计算得到的hashCode值。
接下来是Runtime类和Java9的ProcessHandle这个类。
Runtime类代表Java程序运行时环境。
Runtime类有几个方法,
Runtime runtime = Runtime.getRuntime();该方法可以获取java关联的运行时对象。
Runtime类还有一个功能----他可以直接单独启动一个进程来运行操作系统的命令。
如下:
public class RuntimeTest
{
public static void main(String[]args) throws Throwable
{
// Runtime rt = Runtime.getRuntime();
// System.out.println("处理器的数量: " + rt.availableProcessors());
// System.out.println("空闲内存数: " + rt.freeMemory());
// System.out.println("总内存数: " + rt.totalMemory());
// System.out.println("可用最大内存数: " + rt.maxMemory());
Runtime rt = Runtime.getRuntime();
rt.exec("C:\\Windows\\write.exe");//单独打开一个进程,打开系统write这个软件。
}
}
Object类
该类是所有类的子类,如果一个类没有显示继承指定父类,则会默认继承Object类。所以任何对象都可以调用Object的方法。object有几个常见的方法,如下:
boolean equals(Object obj):判断一个对象和另一个对象是否为一个对象,判断的依据是根据 HashCode的地址值来判断的,所以如果重新改方法时最好也重写HashCode的方法。
Class<?> getClass():返回该对象的运行时类。
int HashCode():返回对象的hashCode值。
String toString():返回改对象的描述信息,一般都重现改方法,返回自己对象的详细信息。
clone方法:
克隆调用该方法的对象。
实现自我克隆需要以下几个步骤:
1,自定义类需要实现Cloneable接口,该接口只是一个标记性接口,没有定义任何方法
2,自定义实现自己的clone()方法。
3,实现clone()方法时通过super.clone();
关于克隆后的对象需要注意的是:
class Address
{
String detaile;
public Address(String detaile)
{
this.detaile = detaile;
}
}
class User implements Cloneable
{
int age;
Address address;
public User(int age)
{
this.age = age;
address = new Address("广州天河");
}
public User Clone() throws Exception
{
return (User)super.clone();
}
}
public class ObjectTest
{
public static void main(String[]args) throws Exception
{
User us = new User(29);
User us1 = us.Clone();//对象克隆后返回的对象是原有对象的副本。
System.out.println(us.equals(us1));//所以这里输出false;
System.out.println(us.address == us1.address);
//需要注意的是如果克隆对象有实例变量是引用类型,Clone方法只是简单的复制了引用变量而已,其实实例对象还是一个。
}
}
例如:Person p = new Person();
Person p1 = p;
这种形式只是拷贝了引用变量而已它们都指向同一个实例对象。
用Clone方法是真正意义上的对象克隆。
当一个克隆对象中有一个引用类型的变量时,那么就要对那一个引用类型的变量进行克隆。如果要实现深度克隆那就要自己进行递归克隆。
Objects工具类的用法:
Objects.requireNonNull()该方法主要来对方法形参进行输入校验。
public Foo(Bar bar, Baz baz)
{
this.bar = Objects.requireNonNull(bar, “bar must not be null”);
this.baz = Objects.requireNonNull(baz, “baz must not be null”);
}