最近做项目时,遇到了一个错误:

public class UserJobFilteredServiceImpl implements UserJobFilteredService {
//方法1,业务方法,实现service层的方法
public void getAttention(int userId) {
//这个方法里面需要调用方法2,我采用如下方式调用,运行时报错
UserJobFilteredServiceImpl  userJobFilteredServiceImpl = new UserJobFilteredServiceImpl();
userJobFilteredServiceImpl. checkValid;
//改为如下方式调用,结果正确
UserJobFilteredServiceImpl  userJobFilteredServiceImpl;
userJobFilteredServiceImpl. checkValid;
//被项目经理看到了,狠狠的批评了一顿,改为如下
this. checkValid;
};
//方法2,检查方法,本类自带的方法
public void checkValid() {};
}

为了便于理解,先定义一个简单的类

class User{

int userId;

String userName;

String age;

}

有了如上类,我们便可以创建对象,如下:

User user1 = new User();

创建对象的过程中包含了如下几个动作

1>右边的new User,是以User类为模板,在堆空间里创建一个User类的对象。

2>末尾()表示,在对象创建后,立即调用User类的构造函数,对刚生成的对象进行初始化。(构造函数是肯定有的,如果我们没写,系统会自动生成一个构造函数)

3>左边的User user1,是创建了一个User类的引用变量。

4>=操作符使对象引用指向刚刚建好的User对象

其实,可以将如上步骤分为两步

1>User user1;

2>user1=new User();

这样写就比较清楚了,有两个实体:一个是对象引用变量,一个是对象本身。

举个很生动的例子:对象好比一个气球,引用变量是一根绳,可以用来系气球。

如果只是执行了第一条语句,还没执行第二条,此时创建的引用变量user1还没指向任何一个对象,它的值是null,引用变量是一根还没有系上气球的绳;当执行了第二句后,一只新气球做出来了,并被系在user1这根绳上。

再来一句

User user2;

此时又做了一根绳子,还没系上气球,接着来一句

user2 = user1;

此时,发生了复制行为。注意:对象本身没有被复制,被复制的是对象引用。结果是user2也指向了user1所指向的对象,即两根绳子都系上同一个气球了。

如果在创建一个对象

user2 = new User();

此时,引用变量user2改指向了第二个对象。

由如上例子,我们得出结论:

1>一个对象引用可以指向0个或1个对象(形象解释:一根绳子可以不系气球,也可以系一个气球)

2>一个对象可以有N个引用指向它(解释:可以有N条绳子系住同一个气球)

如果再来一句

user1 =user2;

即是 user1也指向了第二个对象。这个是没问题的,问题是第一个对象呢?没有一条绳子系住它,它可能会飞。正确说来,它已成为jav的垃圾回收机制处理对象了,至于什么时候被回收,这处决于java回收机制了。

由此看来,下面的语句应该是不合法的,至少应该没用

new User();

书上介绍说,它是合法的,而且是可用的,比如,我们仅仅为了打印而生成一个对象,就不需要引用变量来系住它,最常见的就是打印字符串:

System.out.println("I am java");

字符串对象"I am java"在打印后就被丢掉。有人称之为这种对象为临时对象。