处理对象
打印对象和toString()方法
-
Java对象都是Object类的实例,都可以直接调用该类中定义的方法,这些方法提供了处理Java对象的通用方法
-
toString()方法是Object类里的一个实例方法,所有的Java类都是Object类的子类,因此所有的Java对象都具有该方法
-
例如:
System.out.println(o);//o是一个Object类实例化的空对象
输出结果为:java.lang.Object@6996db8,多次运行后,@后面的8位十六进制数字会发生变化,事实上使用这种方法输出Object对象时,实际上输出的是Object对象的toString()方法的返回值,即上面的代码和下面的代码效果是一样的:System.out.println(o.toString());
-
-
此方法通常用于实现这样的功能:当程序员直接打印该对象时,系统将会输出该对象的“自我描述”信息,用以告诉外界该对象具有的状态信息。Object类提供的toString()方法总是返回该对象实现类的“类名+@+hashCode”值,这个返回值并不能实现真正的“自我描述功能”,因此如果需要自定义类能实现“自我描述”的功能。则可以重写Object类的toString()方法
-
例如:
public class Test { public static void main(String[] args) { Person p = new Person("小明"); System.out.println(p); //输出结果:我叫小明 } } class Person { private String name; public Person(String name) { this.name = name; } @Override public String toString() { return "我叫" + name; } }
-
-
对象之间的比较:见Java学习笔记3-1。
类成员
static修饰的成员就是类成员,已经介绍过的类成员有类变量、类方法、静态初始块三个成分,static修饰的类成员属于整个类,并不属于单个实例
理解类成员
- 类变量属于整个类,当系统第一次准备使用该类时,系统会为该类变量分配内存空间,类变量开始生效,直到该类被卸载,该类的类变量所占有的内存才能被系统的垃圾回收机制回收,也就是说类变量的生存范围几乎等于类的生存范围
- Java在语法上通过对象名调用类成员,当通过对象来访问类变量时,系统会在底层转换为通过该类来访问对应的类成员,因此即使某个实例为null,也可以通过它访问所属类的类成员,但是为了程序可读性并不推荐这么使用,在此不再赘述
- 对于static关键字而言,类成员不能访问实例成员
单例(Singleton)类
-
如果一个类始终只能创建一个实例,则这个类被称为单例类
-
在一些特殊场景下,要求不允许自由创建该类的对象,而只允许为该类创建一个对象。为了避免其他类自由创建该类的实例,应该把类的构造器使用private修饰,从而把该类的所有构造方法隐藏起来
-
根据良好的封装性原则:一旦把该类的构造隐藏起来,就需要提供一个public方法作为该类的访问点,用于创建该类的对象,且该方法必须使用static修饰(因为调用该方法之前不存在对象,因此调用该方法的不可能是对象,只能是类)
-
除此之外,该类还必须缓存已经创建的对象, 否则该类无法知道是否曾经创建过对象,也就无法保证只创建一个对象。为此该类还需要使用一个成员变量来保存曾经创建的对象,因此该成员变量需要被上面的静态方法访问,故该成员变量也必须使用static修饰
-
单例模式三要素
- 构造方法私有化
- 静态属性指向实例
- public static的getInstance方法,返回第二部的静态属性
-
饿汉式与懒汉式单例模式
-
区别
-
饿汉式
- private static 类名 instance = new 类构造方法();
- 提供一个getInstance方法返回instance
-
懒汉式
- private static 类名 instance;此时instance指向null
- 提供一个getInstances方法返回instance,此时应该加入判断语句,判断null==Instance,则instance==new 类构造方法();
-
-