目录
Object类
该类中主要有以下方法:
- toString()
- getClass()
- equals()
- clone()
- finalize(
其中toString(),getClass(),equals是其中最重要的方法。
Object类中的getClass(),notify(),notifyAll(),wait()等方法被定义为final类型,因此不能重写。
1、clone() 方法
protected native Object clone() throws CloneNotSupportedException1 ;
使用new操作符创建一个对象
使用clone方法复制一个对象
clone与copy的区别
Shallow Clone与Deep Clone
这个时候我们就需要进行deep Clone了,对那些非基本类型的域进行特殊的处理,hireDay。我们可以重新定义Clone方法,对hireDay做特殊处理,如下
class Employee implements Cloneable {
public Object clone() throws CloneNotSupportedException {
Employee cloned = (Employee) super.clone();
cloned.hireDay = (Date) hireDay.clone()
return cloned;
}
}
2、toString()方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。
该方法用得比较多,一般子类都有覆盖。
public static void main(String[] args){
Object o1 = new Object();
System.out.println(o1.toString());
}
3、getClass()方法
public final native Class<?> 1 getClass();
返回次Object的运行时类类型。
不可重写,要调用的话,一般和getName()联合使用,如getClass().getName();
public static void main(String[] args) {
Object o = new Object();
System.out.println(o.getClass());
//class java.lang.Object
}
4、finalize()方法
protected void finalize() throws Throwable { }
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
关于垃圾回收有三点:
1、对象可能不被垃圾回收
2、垃圾回收并不等于“析构”。
3、垃圾回收只与内存有关
finalize()的用途:
无论对象是如何创建的,垃圾回收器都会负责释放对象占据的所有内存。
5、equals()方法
public boolean equals(Object obj) {
return (this == obj);
}
Object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,
即便是内容完全相等的两块不同的内存对象,也返回false。如果是同一块内存,则object中的equals方法返回true,如果是不同的内存,则返回false
查看String类源码equals方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
6、hashCode()方法
public native 1 int hashCode();
返回该对象的哈希码值。该方法用于哈希查找,可以减少在查找中使用equals的次数,重写了equals方法一般都要重写hashCode方法
7、 wait()方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。
wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,
如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
8 notify()方法
public final native 1 void notify();
该方法唤醒在该对象上等待的某个线程。
public final native void notifyAll();
该方法唤醒在该对象上等待的所有线程。
包装类
1、包装类介绍
虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性、没有方法可调用。 沿用它们只是为了迎合人类根深蒂固的习惯,并的确能简单、有效地进行常规数据处理。
基本数据类型 | 对应的包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
基本类型和对应的包装类可以相互装换:
- 由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象;
- 包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。
2、包装类的应用
1、 实现 int 和 Integer 的相互转换
public static void main(String[] args) {
int m = 500;
Integer obj = new Integer(m); // 手动装箱
int n = obj.intValue(); // 手动拆箱
System.out.println("n = " + n);
Integer obj1 = new Integer(500);
System.out.println("obj 等价于 obj1?" + obj.equals(obj1));
}
2、 将字符串转换为整数
parseInt(String s, int radix);
s 为要转换的字符串,radix 为进制,可选,默认为十进制。
3、将整数转换为字符串
Integer 类有一个静态的 toString() 方法,可以将整数转换为字符串。或者直接在整数后面加空字符串
public static void main(String[] args) {
int m = 500;
String s = Integer.toString(m);
String s2 = m+"";
System.out.println("s = " + s);
}
3、自动拆箱和装箱
public static void main(String[] args) {
int m = 500;
Integer obj = m; // 自动装箱
int n = obj; // 自动拆箱
System.out.println("n = " + n);
Integer obj1 = 500;
System.out.println("obj 等价于 obj1?" + obj.equals(obj1));
}
//结果:
// n = 500
// obj 等价于 obj1?true
自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。
例如:
Integer i = 100;
相当于编译器自动为您作以下的语法编译:
Integer i = new Integer(100);
所以自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的:
Integer i = null;
int j = i;
这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于:
Integer i = null;
int j = i.intValue();
自动拆箱装箱是常用的一个功能,所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
Math类
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
查看Math类的源码
public final class Math{
//数学方法
}
Math.PI 记录的圆周率
Math.E 记录e的常量
Math中还有一些类似的常量,都是一些工程数学常用量。
Math.abs 求绝对值
Math.sin 正弦函数 Math.asin 反正弦函数
Math.cos 余弦函数 Math.acos 反余弦函数
Math.tan 正切函数 Math.atan 反正切函数 Math.atan2 商的反正切函数
Math.toDegrees 弧度转化为角度 Math.toRadians 角度转化为弧度
Math.ceil 得到不小于某数的最大整数
Math.floor 得到不大于某数的最大整数
Math.IEEEremainder 求余
Math.max 求两数中最大
Math.min 求两数中最小
Math.sqrt 求开方
Math.pow 求某数的任意次方, 抛出ArithmeticException处理溢出异常
Math.exp 求e的任意次方
Math.log10 以10为底的对数
Math.log 自然对数
Math.rint 求距离某数最近的整数(可能比某数大,也可能比它小)
Math.round 同上,返回int型或者long型(上一个函数返回double型)
Math.random 返回0,1之间的一个随机数
Random类
ava中存在着两种Random函数:
1、java.lang.Math.Random;
调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范围是[0.0,1.0)的左闭右开区间,返回值是一个伪随机选择的数,在该范围内(近似)均匀分布
public static void main(String[] args) {
// 结果是个double类型的值,区间为[0.0,1.0)
System.out.println("Math.random()=" + Math.random());
int num = (int) (Math.random() * 3);
// 注意不要写成(int)Math.random()*3,这个结果为0或1,因为先执行了强制转换
System.out.println("num=" + num);
}
//结果
//Math.random()=0.44938147153848396
//num=1
2、java.util.Random
Random()的两种构造方法:
Random():创建一个新的随机数生成器。
Random(long seed):使用单个 long 种子创建一个新的随机数生成器。
日期时间类
1、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。
Date 类提供两个构造函数来实例化 Date 对象。
第一个构造函数使用当前日期和时间来初始化对象。
Date()
第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
Date(long millisec)
获取当前日期时间:
public static void main(String args[]) {
// 初始化 Date 对象
Date date = new Date();
// 使用 toString() 函数显示日期时间
System.out.println(date.toString());
}
2、SimpleDateFormat
使用 SimpleDateFormat 格式化日期
public static void main(String args[]) {
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + ft.format(dNow));
}
其中 yyyy 是完整的公元年,MM 是月份,dd 是日期,HH:mm:ss 是时、分、秒。
注意:有的格式大写,有的格式小写,例如 MM 是月份,mm 是分;HH 是 24 小时制,而 hh 是 12 小时
制。
时间休眠:休眠(sleep)
你可以让程序休眠一毫秒的时间或者到您的计算机的寿命长的任意段时间、
public static void main(String args[]) {
try {
System.out.println(new Date( ) + "\n");
Thread.sleep(1000*3); // 休眠3秒
System.out.println(new Date( ) + "\n");
} catch (Exception e) {
System.out.println("Got an exception!");
}
}
3、Calendar类
Calendar类的功能要比Date类强大很多,而且在实现方式上也比Date类要复杂一些。
创建一个代表系统当前日期的Calendar对象
public static void main(String args[]) {
Calendar c = Calendar.getInstance();//默认是当前日期
System.out.println(c);
}
File类
1、File类的基本用法
1. java.io.File类:文件和目录路径名的抽象表示形式。
File类的常见构造方法:
public File( String pathname)
以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir
中存储。
1. File的静态属性String separator存储了当前系统的路径分隔符。
2. 通过File对象可以访问文件的属性。
public boolean canRead()
public boolean exists()
public boolean isFile()
public long lastModified()
public String getName()
public boolean canWrite()
public boolean isDirectory()
public boolean isHidden()
public long length()
public String getPath()
通过File对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)。
public boolean createNewFile()throws IOException
public boolean delete()
public boolean mkdir(), mkdirs()
常见构造器,方法:
import java.io.File;
import java.io.IOException;
public class TestFile {
/**
* File文件类 1.代表文件 2.代表目录
*/
public static void main(String[] args) {
File f = new File("d:/src3/TestObject.java");
File f2 = new File("d:/src3");
File f3 = new File(f2, "TestFile.java");
File f4 = new File(f2, "TestFile666.java");
File f5 = new File("d:/src3/aa/bb/cc/dd");
//f5.mkdirs();
f5.delete();
try {
f4.createNewFile();
System.out.println("文件创建成功!");
} catch (IOException e) {
e.printStackTrace();
}
if (f.isFile()) {
System.out.println("是一个文件!");
}
if (f2.isDirectory()) {
System.out.println("是一个目录!");
}
if (f3.isFile()) {
System.out.println("是一个文件奥");
}
}
}