转自http://blog.sina.com.cn/s/blog_6fd9615d0100y445.html
JAVA与指针
首先,提个问题:JAVA中没有指针,JAVA中有指针,哪个一个对呢?
答:都对,JAVA中没有指针,因为我们不能对指针直接操作,像C++那样用->来访问变量。
JAVA有指针,因为JDK中封装了指针。(现在我们就来找到这个指针)
我的理解:
在声明一个对象的时候,其实就是定义了一个指针变量。
注意:
1、指针变量有两层含义
2、使用创建一个对象包括声明和定义。
1)
2)
这样,很多概念就很容易理解了。
一、值传递和引用传递
举例说明:
测试程序为:
public
String
}
public
public
Student
stu1
stu1.name
int
System.out.println("改变前,stu1名字为"
System.out.println("改变前,a的值为"
TestClass
myTest.change(a,
System.out.println("改变后,stu1名字为"
System.out.println("改变后,a的值为"
}
void
num
student.name
}
}
运行结果为:
改变前,stu1名字为小明
改变前,a的值为10
改变后,stu1名字为小强
改变后,a的值为10
在内存中的表示如下:
转变前:
转变时:把stu1的值(36DF)传给student,使student指向36DF。小明变成了小强。
转变后:student和num两个变量被销毁。
所以,stu1指向的内容改变了,a的值不变。这也就是值传递与引用传递的区别。从中也可以看出就把Student
这里只用String这个类特殊。
public
public
String
System.out.println(name);
TestClass
myTest.change(name);
System.out.println(name);
}
void
str
}
}
运行结果为:
改变前name为abc
改变前name为abc
但是你会发现问题,上文强调过指针的第二层含义为定义了变量在堆内存中的范围也就是name指向的变量只能为三个字母的范围,把name付给str,str也只能指向三个字母范围的变量,“abcd”超出了范围。(其实改为大小相同的“abd”也不行)
所以JAVA引入了一个字符串池的概念。就是说它会把所已知的字符串放入字符串池,如果你创建新字符串没有使用new关键字,它首先会去字符串池找有没有相同值的字符串,如果有的话就指向它;如果没有的话就会创建新的空间。
二、父类与子类
举个例子,定义一个Father类,一个Son类,测试
public
String
Father(String
System.out.println("Father一个参数构造函数");
this.name
}
void
System.out.println("骑自行车");
}
}
public
Son(String
super(name);
System.out.println("Son一个参数构造函数");
this.name
}
@Override
void
System.out.println("开宝马");
}
void
System.out.println("聊QQ");
}
}
public
public
Father
son1.drive();
}
}
结果为:
Father一个参数构造函数
Son一个参数构造函数
开宝马
内存分析:
son1为Father类的指针,但new了一个Son类的对象,并把这个对象付给了son1。
当new一个子类对象(构造子类对象)的时候,需要先创建父类对象,也就是要调用父类的默认构造函数(无参构造函数),如果父类没有无参构造函数也就是说他的无参构造函数被你重写了,那么子类也不能有无参的构造方法,并且在子类的有参构造方法中必须指明构造父类的构造方法(用Super关键字)。