Object 类的简单特征
一切类都是 Object 类的子类。
★ toString()方法:负责返回该对象的“描述型字符串”
当 “打印输出”一个对象时,实际就是打印输出该对象的
toString()方法的返回值;
Object 类提供的 toString()方法,返回值是“类名@hashcode”值,大多时候,
需要程序员重写 toString()方法。
★★ boolean equals(Object obj)
--
此方法用于按“程序自己的规则”(即按程序员重写的方法的规则)来判断两个 对象 是否相等。
重写equals()方法的一般标准(
非必须):
1.如果当前对象与被比较对象本身就形同,一般直接返回true;
2.一般要求当前对象与被比较对象的类型和关键属性相同时才返回true
【 == 符号】
用于判断两个基本类型的变量(表达式/直接量)的值是否相等
1.当比较基本类型的值时,程序并不管其数据类型,之比较实际值的大小,例如:
System.out.println('A' == 65.0 ); -- 结果返回 true
System.out.ptintln('0' == 0.0 ); -- 返回false (字符0
的实际值为48)
2.
如果是引用类型的变量(不包括 包装类 ,因为 包装类 可以自动拆箱),要求被比较的两个引用变量,引用同一个实例(或者说是引用实例的
地址形同)才返回true;
例如:
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
-- 运行结果为 false
s1 和 s2 都是 new 出来的对象,二者在内存中的地址不同即引 用的不是同一个实例;
改为以下才会返回 true :
String s1 = new String("Hello");
String s2 = new String();
s2 = s1; //将s1 和 s2 指向同一个实例
System.out.println(s1 == s2);
【 static关键字 深入详解】
1.static 只是一个标识
有 static 修饰,表明被修饰的成员属于类
没有 static 修饰,表明是属于实例
2.static 成员(Field、方法、初始化块)都与类“共存亡”;
static成员建议通过类名来访问,以增强程序可读性(因为用实例
访问static成员的是指还是通过类名来调用);
3.必须先有类,再有对象
可以存在JVM有类但是没有实例的情况,但是绝不可能出现有了该类 的实例却没有该类;
注意:
-- static成员不允许访问非 static 成员(静态成员不能访问非 静态成员)
-- this引用和super都不允许出现在static方法中
-- 当程序直接访问一个Filed时:
如果Field是实例Field,相当于省略了 this;
如果Field是类Field,相当于省略了 类名;
【单例类及其实现】
单例类 -- 只允许创建一个实例的类;
单例类的实现:
1.构造器不能暴露,否则可以通过 new创建很多实例;
2.暴露一个方法,由该方法来获取实例,因为在调用该方法之前肯定不存在实例,所以只能通过类来调用该方法,因而该方法必须用static修饰;
3.使用静态Field来“缓存”已有的实例;在每次获取实例之前,先 是否已“缓存”过实例,如果没有则创建;
例:
public class SingleTon
{
private SingleTon(){} //隐藏构造器
private static SingleTon st; //创建“缓存”变量
public static SingleTon get() //暴露一个返回值为一个实例的方法
{
if(st == null) //判断“缓存”是否存在
{
st =new SingleTon();
}
return st; //返回实例
}
public static void main(String[] args)
{
//通过类来调用方法创建实例s1
SingleTon s1 = SingleTon.get();
//通过类来调用方法创建实例s2
SingleTon s2 = SingleTon.get();
//运行结果为 true,说明 s1 == s2 ,即实际上是指创建了一个实例
System.out.println(s1 == s2);
}
}