1.程序与用户交互

(1)运行一个Java程序的时候要给它提供一个main方法入口,这边分析一下这个main方法的签名
public static void main(String[] args);
public修饰符:因为Java类给JVM调用的,所以要使用public修饰符暴露这个方法
static修饰符:JVM调用主方法的时候不会先创建该主类的对象,而是直接通过该类来调用主方法的,所以使用static修饰。
void返回值:因为主方法是JVM调用的,所以该方法的返回值返回给JVM没有任何意义。
字符串数组形参:根据方法调用的规则,谁调用该方法,谁负责为形参赋值。所以是JVM赋值的,那到底是赋什么值呢,可以看下面一个例子

package cn.lsl;

public class ArgsTest {
public static void main(String[] args) {
System.out.println(args.length);
for(String arg : args){
System.out.println(arg);
}
}
}

上面程序只是输出一个0,这说明args数组是一个长度为0的空数组。

而如果改成用命令来运行该程序
java ArgsTest aa bb
将输出

运行Java程序时在类名后紧跟一个或多个字符串,多个字符串之间用空格隔开,JVM就会把这些字符串依次赋值给args元素
如果一个参数本身包含空格,则这个参数应该用双引号括起来

(2)使用Scanner获取键盘输入
使用Scanner类可以很方便地获取用户的键盘输入
Scanner主要提供了两个方法用来扫描输入
1)hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果需要判断是否包含下一个字符串,则可以省略Xxx。
2)nextXxx():获取下一个输入项。Xxx的含义与前一个方法中的Xxx相同。

package cn.lsl;

import java.util.Scanner;

public class ScannerDemo {
public static void main(String[] args) {
//System.in代表标准输入,就是键盘输入
Scanner sc = new Scanner(System.in);
//sc.useDelimiter("\n");
while(sc.hasNext()){
System.out.println("键盘输入的内容是:" + sc.next());
}
}
}

默认情况下,Scanner使用空白作为多个输入项之间的分隔符。如果希望改变Scanner的分隔符(不适用空白作为分隔符),
例如程序需要每次读取一行,不管这一行中是否包含空格,Scanner都把它当成一个输入项。这是可以使用sc.useDelimiter("\n");把Scanner的分隔符设置成回车符。

获取基本类型类型的输入项

package cn.lsl;

import java.util.Scanner;

public class ScannerLongDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextLong()){
System.out.println("键盘输入内容为:" + sc.nextLong());
}
}
}

Scanner提供两个简单的方法来逐行读取
boolean hasNextLine():返回输入源中是否还有下一行
String nextLine():返回输入源中下一行的字符串

package cn.lsl;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner; public class ScannerFileDemo {
public static void main(String[] args) throws FileNotFoundException {
Scanner sc = new Scanner(new File("src/cn/lsl/ScannerDemo.java"));
System.out.println("ScannerDemo.java文件的内容如下:");
while(sc.hasNextLine()){
System.out.println(sc.nextLine());
}
}
}

使用BufferedReader获取键盘输入
1)BufferedReader是Java IO流中一个字符、包装流,它必须建立在另一个字符流的基础之上。但标准输入:System.in是字节流,程序需要使用转换流InputStreamReader将其包装成字符流。
2)获取了BufferedReader对象之后,可以调用该对象的readLine()方法来逐行读取键盘输入,每次用户的键盘输入都被BufferedReader当成String对象。与Scanner不同的是,BufferedReader不能读取基本类型输入项,它总是读取String对象。

package cn.lsl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class BufferReaderDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine())!=null){
System.out.println("键盘输入的是:" + line);
}
}
}

2.System类
System类代表当前Java程序的运行平台,程序不能创建System类的对象。
一些方法:
getenv :
public static Map<String,String> getenv(),返回一个不能修改的当前系统环境的字符串映射视图
public static String getenv(String name),获取指定的环境变量值
public static Properties getProperties(),确定当前的系统属性
public static String getProperty(String key),获取指定键指示的系统属性

package cn.lsl;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Properties; public class SystemTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
//获取系统的所有环境变量
Map<String, String> env = System.getenv();
for(String name : env.keySet()){
System.out.println(name + "----->" + env.get(name));
}
System.out.println("-------------------------");
//获取指定环境变量的值
System.out.println(System.getenv("JAVA_HOME"));
System.out.println("-------------------------");
//获取所有的系统属性
Properties props = System.getProperties();
//将所有系统属性保存到props.txt文件中
props.store(new FileOutputStream("props.txt"), "System Properties");
System.out.println(System.getProperty("os.name"));
}
}

上面程序通过System类的getenv()、getProperties()、getProperty等方法来访问程序所在平台的环境变量和系统属性。

public static int identityHashCode(Object x),该方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到hashCode值。当某个类的hashCode()方法被重写以后,该类实例的hashCode()方法就不能唯一标识该对象,但是通过identityHashCode(Object x)方法返回的hashCode值,依然是根据该对象的地址计算得到的hashCode值。所以,两个对象的identityHashCode值相同,则两个对象绝对是同一个对象。

package cn.lsl;

public class IdentityHashCodeTest {
public static void main(String[] args) {
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1.hashCode() + "----" + s2.hashCode());
System.out.println(System.identityHashCode(s1) + "------" + System.identityHashCode(s2));
String s3 = "java";
String s4 = "java";
System.out.println(System.identityHashCode(s3) + "------" + System.identityHashCode(s4));
}
}

3.Runtime类
Runtime类代表Java程序的运行环境,每个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时环境相连。应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。
Runtime类代表Java程序的运行时环境,可以访问JVM的相关信息,如处理器数量,内存信息等

package cn.lsl;

public class RuntimeDemo {
public static void main(String[] args) {
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类还可以直接单独启动一个进程来运行操作系统的命令。

package cn.lsl;

import java.io.IOException;

public class ExecTest {
public static void main(String[] args) throws IOException {
Runtime rt = Runtime.getRuntime();
rt.exec("notepad.exe");
}
}

4.Object类
(1)Object类是所有类的父类,Java允许把任何类型的对象赋值给Object类型的变量。定义一个类的时候没有使用extends关键字显示指定他的父类,则该类默认继承Object父类。
(2)Java中提供一个protected修饰的clone()方法,该方法用于实现“克隆”,就是得到一个当前对象的副本,而且二者之间完全隔离。由于Object类提供的clone()方法使用了protected修饰,因此该方法只能被子类重写或调用。
自定义类实现克隆的步骤:
1.自定义类实现Cloneable接口。这是一个标记性的接口,接口里面没有定义任何方法。
2.自定义类实现自己clone()方法。
3.实现clone()方法时通过调用super.clone();调用Object实现clone()方法来得到该对象的副本,并返回该副本。

package cn.lsl;

class Address{
String detail;
public Address(String detail){
this.detail = detail;
}
} class User implements Cloneable{
int age;
Address address;
public User(int age){
this.age = age;
address = new Address("福建");
}
public User clone() throws CloneNotSupportedException{
return (User) super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User u1 = new User(20);
User u2 = u1.clone();
System.out.println(u1 == u2);
System.out.println(u1.address == u2.address);
}
}

对象实现“克隆”的时候,克隆出来的对象是原对象的副本,所以System.out.println(u1 == u2);返回的是false;
Object类提供的Clone机制只对对象里各实例变量进行“简单复制”,如果实例变量的类型是引用类型,Clone机制也只是简单点的复制这个引用变量,这样原有对象的引用类型的实例与克隆对象的引用类型的实例变量依然指向内存中同一个实例,即System.out.println(u1.address == u2.address);返回true
(Object类的clone()方法只克隆该对象的所有Field值,不会对引用类型的Field所引用的对象进行克隆)

5.Objects类(Java 7 新增的)
Java 7 新增的Objects工具类,它提供了一些工具方法来操作对象,这些工具方法大多是“空指针”安全的。

package cn.lsl;

import java.util.Objects;

public class ObjectsTest {
static ObjectsTest obj;
public static void main(String[] args) {
//输出一个null对象的hashCode值,输出0
System.out.println(Objects.hashCode(obj));
//输出一个null对象的toString,输出null
System.out.println(Objects.toString(obj));
//要求obj不能为null,如果为null将引发空指针异常
System.out.println(Objects.requireNonNull(obj, "obj参数不能是null"));
}
}

requireNonNull()方法,传入参数不为null时,该方法返回参数本身;否则将引起空指针异常,该方法主要用来对方法形参进行输出校验,
例如:

public Foo(Bar bar){
//校验bar参数,如果bar参数为null将引发异常;否则this.bar被赋值为bar参数
this.bar = Objects.requireNonNull(bar);
}

Java笔记:与系统交互、系统相关的类,Object类的更多相关文章

  1. Java的常用类——Object类、String类

    Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...

  2. Java中特殊的类——Object类

    Java中特殊的类--Object类 1.Object类的概述 Object类是java默认提供的类.Java中除了Object类,所有的类都是有继承关系的.默认会继承Object类,即所有的对象都可 ...

  3. Java基础之Java常用类--Object类,字符串相关类,包装类,日期相关类,数字相关类

    Java是一种面向对象的语言,也就是将万事万物可以描述为对象,特点如下: 1.面向对象是常见的一种思考习惯,符合人们的思考习惯.2.面向对象的出现,将复杂的事情简单化.3.面向对象的出现,将之前过程中 ...

  4. 别样JAVA学习(五)继承上(1.0)Object类equals()

    上一节继承下(一)我们进行抽象类.接口以及多态的学习. 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是 ...

  5. Java常用类-Object类

    一.java.lang.Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Obj ...

  6. C# - 系统类 - Object类

    Object类 ns:System 此类是所有.NET Framework中的类的基类 Type类就派生自Object类 C#提供了object关键字来表示一个类实例的类型 而无需使用Object作为 ...

  7. Java笔记(十八)同步和协作工具类

    同步和协作工具类 一.读写锁ReentrantReadWriteLock ReadWriteLock接口的定义为: public interface ReadWriteLock { Lock read ...

  8. 别样JAVA学习(五)继承上(1.1)Object类toString()

    接下来说完equals以后,我们学习接下来的toString(), Java又觉得全部对象不光具有比較性, 还能使对象变成字符串被打印. 出现 曾经前面显示的是数组.如今显示的是这个对象所属的类. 紧 ...

  9. Java基础知识强化26(1):Object类之Object类的概述

    1.Object类 类Object是类层次结构的根类,每个类都使用 Object作为超类.所有对象(包括数组)都实现这个类的方法 每个类直接或者间接继承自Object类   2.Object类无参构造 ...

  10. java学习记录笔记--继承,super,Object类

    继承: Java中的继承是单继承的. 1.子类拥有父类的全部属性和方法. 可是属性和方法的修饰符不能使private. 2.能够复用父类的代码. 方法的重写须要满足的条件: a.返回值类型 b.方法名 ...

随机推荐

  1. 【百度地图API】——国内首款团购网站的地图插件

    原文:[百度地图API]--国内首款团购网站的地图插件 摘要: 本文介绍了一款应用在团购网站上的地图插件,适用于目前非常流行的团购网站.使用这款地图插件,无需任何编程技术,你就把商家的位置轻松地标注在 ...

  2. 【百度地图API1.1】修改文本标注的样式

    原文:[百度地图API1.1]修改文本标注的样式 百度地图API1.0中文本标注的样式写法为: label.getDom().style.borderColor = "#808080&quo ...

  3. MVC验证05-自定义验证规则、验证2个属性值不等

    原文:MVC验证05-自定义验证规则.验证2个属性值不等 本文体验2个属性值不等.即当一个属性输入值,另外一个属性输入的值不能和第一个属性值相等.相关文章包括: MVC验证01-基础.远程验证   M ...

  4. Web API-属性路由

    路由(Routing)就是Web API如何将一个URI匹配到一个action的过程.Web API 2 支持一个新的路由方式-属性路由(attribute routing).顾名思义,属性路由使用标 ...

  5. CSS下背景属性background的使用方法

    背景颜色(background-color) CSS可以用纯色来作为背景,也可以将背景设置为透明,background相当于xhtml中的bgcolor. 它的两个值: transparent(默认值 ...

  6. 使用Row_Number()分页优化

    记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题   最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且 ...

  7. HTTP2协议之HPACK--之头部压缩规范介绍

    接下来打算把HTTP2协议的头部压缩算法给翻译下,敬请等候. HPACK - Header Compression for HTTP/2 HPACK:HTTP/2头部压缩 概要说明 这个规范定义了HP ...

  8. 一个用MFC实现Com聚合样本

    ComATLATLMFCMFC MFCIUnknownMFCCCmdTargetComMFCCom MFCCOM 1. 1.1 #pragma once typedef long HRESULT; / ...

  9. 【SSRS】入门篇(一) -- 创建SSRS项目

    原文:[SSRS]入门篇(一) -- 创建SSRS项目 在本篇中,您将学习如何在 SQL Server Data Tools (SSDT) 中创建报表服务器项目. 报表服务器项目用于创建在报表服务器中 ...

  10. C#使用Thrift简介,C#客户端和Java服务端相互交互

    C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...