-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
Java中的Object类和其他常见类总结
一、Object类
1、它是所有类默认的直接或者间接的父类, 不必显式的表示出来;
2、该类中定义了所有类都具备的方法;
3、Object中的equals()方法:因为Object类中是比较两个对象的内存地址值,意义不大;所以可以通过
覆盖Object类的equals()方法,建立自己定义类特有比较内容;利用多态的机制实现比较。
例子:ObjectDemo.java
class Demo //默认extends Object
{
private int num;
Demo(int num)
{
this.num = num;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Demo))
return false;
Demo d = (Demo)obj;
return this.num == d.num;
}
/*
public boolean compare(Demo d)
{
return this.num==d.num;
}
*/
}
class Person //默认extends Object
{
}
public class ObjectDemo
{
public static void main(String[] args)
{
Demo d1 = new Demo(4);
Demo d2 = new Demo(7);
System.out.println(d1.equals(d2));
Person p = new Person();
System.out.println(d1.equals(p));
}
}
4、Object中的getClass()方法:
返回创建此类的类Class的对象
例子:ObjectDemo1.java
class Demo {//默认extends Object
private int num;
Demo(int num)
{
this.num = num;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Demo))
return false;
Demo d = (Demo)obj;
return this.num == d.num;
}
}
class Person {//默认extends Object
}
public class ObjectDemo1 {
public static void main(String[] args)
{
Demo d1 = new Demo(4);
Class c = d1.getClass();
System.out.println(c.getName());
}
}
//结果:Demo
5、Object中的toString()方法:返回对象的名称@ 哈希值字符串,意义不大,所以可以通过
覆盖Object中的toString()方法,返回自己想要输出的内容。
例子:ObjectDemo2.java
class Demo {//默认extends Object
private int num;
Demo(int num)
{
this.num = num;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Demo))
return false;
Demo d = (Demo)obj;
return this.num == d.num;
}
public String toString(){
return "Demo:"+num;
}
}
class Person {//默认extends Object
}
public class ObjectDemo2{
public static void main(String[] args)
{
Demo d1 = new Demo(4);
System.out.println(d1.toString());
Demo d2 = new Demo(7);
System.out.println(d2.toString());
}
}
//结果:
二、Class类
1、Class 没有公共构造方法。
2、Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。
3、Class对象被加载到方法区和栈区,用 Class 对象创建属于某个类的全部“常规”或“普通”对象。
4、利用Class对象的forName(String className)方法和newInstance()f方法实现java中反射的机制。
例子:ClassDemo.java
class Person{
public void showInfo(){
System.out.println("information");
}
}
public class ClassDemo {
public static void main(String[] args)
{
try{
Class c = Class.forName("Person");
Person p = (Person)c.newInstance();
p.showInfo();
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("Class study!");
}
}
}
三、System类
它包含了很多系统级的属性和控制方法,该类位于Java API的java.lang包中。
1、特点:
(1)由于System类的构造方法时private的,所以无法创建该类的对象,也就是无法实例化;
(2)它内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用;
2、成员变量
(1)out:标准输出流,默认显式器上的控制台;
例如:System.out.println("Test out");
该行代码的作用是在控制台上长输出一行 Test out;
(2)err:标准错误输出流,默认显式器上的控制台;
例如:System.err.println("Test err");
该行代码的作用是在控制台上长输出一行 Test err;
(3)in:标准输入流,默认键盘。
例如:System.in.read();
该行代码的作用是从输入流中读取一行;
此外,还可以使用System类中的成员方法setIn(InputStream)、setOut(PrintStream)和setErr(PrintStream),
改变标准输入流等对应的设备,例如可以将标准输出流输出的信息输出到文件内部,从而形成日志文件等。
3、成员方法
(1)、arraycopy方法
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
该方法的作用是数组拷贝,也就是将一个数组中的内容复制到另外一个数组中的指定位置,由于该方法是native方法,
所以性能上比使用循环高效。
例如:利用它可以实现删除数组中元素的功能,
int[] old = {1,2,3,4,5};
int[] new = new int[a.length-1];
System.arraycopy(a,0,b,0,2);
System.arraycopy(a,3,b,2,2);
该代码的作用是将数组old中,从下标为0开始,复制old[0]和old[1]到数组new从下标0开始的位置,总共复制2个;然后,
数组old中,从下标为3开始,复制old[3]和old[4]到数组new从下标2开始的位置,总共复制2个,
这样经过复制以后数组a中的值不发生变化,而数组b中的值将变成{1,2,4,5},就可以删除a[2]。
(2)、currentTimeMillis方法
public static long currentTimeMillis()
该方法的作用是返回当前的计算机时间,当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
是一个长整型的数字,该数字就是以差值表达的当前时间。
例如:可以用它计算程序运行的时间
public static long runTime()
{
long start = System. currentTimeMillis();
for(int i = 0;i < 1000;i++){
System.out.print(i);
}
long end = System. currentTimeMillis();
return end – start;
}
使用这种方式可以测试不同算法的程序的执行效率高低,也可以用于后期线程控制时的精确延时实现。
(3)exit方法
public static void exit(int status)
该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。一般在图形界面编程中实现程序的
退出功能等。
(4)gc方法
public static void gc()
该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
一般很少使用。
(6)getProperties()方法
获取当前的系统属性。返回值为Properties类的对象,因为Properties是Hashtable的子类,那么可以
通过map的方法取出该集合中的元素。
例如:获取JVM启动时的所有系统属性
{
Properties prop = System.getProperties();
for(Object obj : prop.keySet())
{
String value = (String)prop.get(obj);
System.out.println(obj+"::"+value);
}
}
将会输出所有与JVM相关的信息。
(7)setPropery()方法
public static String setProperty(String key,String value)
设置指定键指示的系统属性。可以利用它在系统中自定义一些特有的数据。
例如:
System.setProperty("mykey","myvalue");
(8)getProperty方法
public static String getProperty(String key)
a、该方法的作用是获得系统中属性名为key的属性对应的值。例如java.version表示Java 运行时环境版本,os.version表示操作
系统的版本,os.name表示操作系统的名称等;在Java API的System的getProperties()方法中有详细描述;
例如:
String osName = System.getProperty("os.name");
String javaVersion = System.getProperty("java.version");
System.out.println("当前操作系统是:" + osName);
System.out.println("当前JVM的版本是:" + javaVersion);
使用该方法可以获得很多系统级的参数以及对应的值。
b、可以利用它在JVM启动时动态的加载一些属性信息,如
String v = System.getProperty("test");
System.out.println("v="+v);
命令行:java -Dtest-haha class文件名
结果:v=haha
可以在非安装版的tomcat服务器启动时手动添加一些系统信息。
import java.util.*;
class SystemDemo
{
public static void main(String[] args)
{
Properties pp = System.getProperties();
//获取JVM的所有属性信息
/*
for(Object obj:pp.keySet()){
String infoValue = (String)pp.get(obj);
System.out.println(obj+"::"+infoValue);
}
*/
//获取JVM的特定的属性信息
String osName = System.getProperty("os.name");
System.out.println("osName= "+osName);
//设置自定义的一些系统属性信息
System.setProperty("MyProperty","MyInfomation");
String myProperty = System.getProperty("MyProperty");
System.out.println("myProperty= "+myProperty);
//当JVM启动时,动态加载一些信息
//java -Dtest=haha xxx
String myInfo = System.getProperty("myinfo");
System.out.println("myInfo= "+myInfo);
}
}
四、Runtime类
1、特点
(1)该类没有提供构造函数,所以不能建立它的对象;
(2)它是一个与JVM运行时环境有关的Singleton(单例设计模式)类;
2、getRuntime()方法
(1)取得当前JVM的运行时环境,这也是在Java中唯一一个得到运行时环境的方法;
(2)也就是只能通过Runtime.getRuntime()获得Runtime类的对象;
3、exit()方法
Runtime中的exit方法是退出当前JVM的方法;因为我看到System类中的exit实际上也是通过调用 Runtime.exit()来退出JVM的,
Java对Runtime返回值的一般规则,0代表正常退出,非0代表异常中止,这只是Java的规则,在各个操作系统中总会发生一些小的混淆。
4、exec() 方法
在单独的进程中执行指定的字符串命令
public Process exec(String command) throws IOException
public Process exec(String command,String[] envp) throws IOException
这个方法中 cmdArray 是一个执行的命令和参数的字符串数组,数组的第一个元素是要执行的命令往后依次都是命令的参数,
envp 我个人感觉应该和 C 中的 execve 中的环境变量是一样的, envp 中使用的是 name=value 的方式。
//RuntimeDemo.java
//it was used to test Runtime class.
class RuntimeDemo{
public static void main(String[] args)
{
try{
Runtime rt = Runtime.getRuntime();
//Process pc = rt.exec("notepad SystemDemo.java");
String[] envp = {"SystemDemo.java"};
Process pc = rt.exec("notepad",envp);
}catch(Exception e){
e.printStackTrace();
}
}
}
五、Date类
类 Date 表示特定的瞬间,精确到毫秒。
1、创建一个日期对象:使用系统的当前日期和时间创建一个日期对象并返回一个长整数;
2、日期数据的定制格式:使用类java.text.SimpleDateFormat完成日期数据的格式定制;
此外,还可以通过Date(long date)分配 Date 对象并初始化此对象,以表示自从标准基准时间以来的指定毫秒数。
//DateDemo.java
import java.util.*;
import java.text.*;
class DateDemo
{
public static void main(String[] args)
{
Date date = new Date();
System.out.println(date.getTime());
//将模式封装到SimpleDateformat对象中。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
Date date1 = new Date();
//调用format方法让模式格式化指定Date对象
String time = sdf.format(date1);
System.out.println("time="+time);
long lt = System.currentTimeMillis();
Date date2 = new Date(lt);
System.out.println("lt= "+lt);
}
}
六、Calendar类
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,
并为操作日历字段(例如获得下星期的日期)提供了一些方法。
1、Calendar类的字段,如YEAR、MONTH、DAY_OF_WEEK和DAY_OF_MONTH等;
2、getInstance()方法:获取一个Calendar类的对象。
3、get(int field)方法:返回给定日历字段的值。
import java.text.*;
import java.util.*;
class CalendarDemo1 {
public static void main(String[] args)
{
Calendar c = Calendar.getInstance();
/*
String[] months = { "一月","二月","三月","四月"
,"五月","六月","七月","八月"
,"九月","十月","十一月","十二月"
};
String[] weeks = { "","星期日","星期一","星期二",
"星期三","星期四","星期五","星期六",
};
*/
String[] months = new DateFormatSymbols().getShortMonths();
String[] weeks = new DateFormatSymbols().getShortWeekdays();
int monthIndex = c.get(Calendar.MONTH);
int dayIndex = c.get(Calendar.DAY_OF_WEEK);
System.out.println(c.get(Calendar.YEAR)+"年");
System.out.println((c.get(Calendar.MONTH)+1)+"月");
//System.out.println(months[monthIndex]);
System.out.println(c.get(Calendar.DAY_OF_MONTH)+"日");
//System.out.println("星期"+(c.get(Calendar.DAY_OF_WEEK)-1));
System.out.println(weeks[dayIndex]);
}
}
4、set()重载方法:
public void set(int field,int value)
public final void set(int year,int month,int date)
将给定的日历字段设置为给定值。
5、add()方法
public abstract void add(int field,int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。
import java.text.*;
import java.util.*;
class CalendarDemo2 {
public static void calendarPrintf(Calendar c){
String[] months = new DateFormatSymbols().getShortMonths();
String[] weeks = new DateFormatSymbols().getShortWeekdays();
int monthIndex = c.get(Calendar.MONTH);
int dayIndex = c.get(Calendar.DAY_OF_WEEK);
System.out.println(c.get(Calendar.YEAR)+"年");
System.out.println((c.get(Calendar.MONTH)+1)+"月");
//System.out.println(months[monthIndex]);
System.out.println(c.get(Calendar.DAY_OF_MONTH)+"日");
//System.out.println("星期"+(c.get(Calendar.DAY_OF_WEEK)-1));
System.out.println(weeks[dayIndex]);
}
public static void main(String[] args)
{
Calendar c = Calendar.getInstance();
//c.set(2018,2,23);
calendarPrintf(c);
System.out.println("---------------------");
Calendar c1 = Calendar.getInstance();
c1.add(Calendar.DAY_OF_MONTH,30);
calendarPrintf(c1);
}
}
七、Math类和Random类
1、Math 类包含用于执行基本数学运算的方法,常用方法
(1)ceil方法返回大于指定的数据(参数)的最小整数
public static double ceil(double a);
(2)floor方法返回小于指定的数据(参数)的最大整数
public static double floor(double a);
(3)round方法四舍五入
public static long round(double a);
(4)pow方法求值 a的b次方
public static double pow(double a,double b);
class MathDemo{
public static void main(String[] args)
{
//ceil返回大于指定数据的最小整数。
double d = Math.ceil(12.45);
System.out.println(d);
//floor返回小于指定数据的最大整数。
double d1 = Math.floor(12.45);
System.out.println(d1);
//四舍五入
double d2 = Math.round(12.45);
double d3 = Math.round(12.54);
System.out.println("d2= "+d2+","+"d3= "+d3);
//次方运算
double d4 = Math.pow(2,3);
System.out.println("d4="+d4);
}
}
2、Math类的random方法
返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。
public static double random();
3、Random类:此类的实例用于生成伪随机数流。
nextInt方法返回一个伪随机数,它是取自此随机数生成器序列的、
在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
public int nextInt(int n);
import java.util.*;
class RandomDemo{
public static void main(String[] args)
{
//利用Math类的random方法
for(int i=0;i<10;i++){
int d = (int)(Math.random()*10)+1;
System.out.println(d);
}
System.out.println("--------------------------");
//利用Random类的nextInt方法
Random rd = new Random();
for(int i=0;i<10;i++){
int d1 = rd.nextInt(10);
System.out.println(d1);
}
}
}
<pre class="java" name="code">/*
练习。给定一个小数。
保留该小数的后两位。
选作。可以考虑,保留时进行四舍五入。
*/
class MathDemo1{
public static void saveTwo(double d,int scale,boolean isRound){
double base = Math.pow(10,scale);
double num = isRound?Math.round(d*base)/base:((int)(d*base))/base;
System.out.println("num="+num);
}
public static void main(String[] args){
//方法1
double d = 12.3456;
double d1 = d*100;
System.out.println("d1="+d1);
d1 = d1+0.5;
double d2 = (int)d1;
System.out.println("d2="+d2);
double d3 = d2/100;
System.out.println("d3="+d3);
System.out.println("---------------------------");
//方法2
saveTwo(12.3456,2,true);//12.34
}
}