java 中使用引用来取代 C++中的指针。
我们用一个例子来说明。
class Student {
String name;
int grade;
}
public class TestRef1 {
public static void main(String[] args){
Student s1 = null;
Student s2 = null;
s1 = new Student();
s1.name = "V";
s1.grade = 100;
s2 = s1;
System.out.println("Name: " + s2.name);
System.out.println("Grade: " + s2.grade);
}
}
这里并未使用new关键字为对象s2实例化, s2是通过 s1 对象实例化的,也就是说 s1将其自身的引用传递给了s2。
2. 垃圾对象
所谓垃圾对象,就是指程序中不再使用的对象引用。如上例中,在程序的最后使:
s1 = null;
s2 = null;
这样之前 s1 创建的实例化对象不再有任何对象使用它,就成了垃圾对象。
3. 匿名对象
“匿名对象”,顾名思义,就是没有明确的声明的对象。 该对象只会被使用一次,因为没有任何具体的对象名称引用它。
4.构造方法
构造方法所完成的主要工作是帮助新创建的对象赋初值。创建对象时,构造方法就会被自动调用并执行。
1 ) 它具有与类名相同的名称
2 ) 它没有返回值
举个例子:
package javalearning;
class Student {
String name;
int grade;
public Student()
{
System.out.println("Construct method-->public Student()");
}
}
public class TestConstruct {
public static void main(String[] args){
Student stu = new Student();
}
}
//运行结果:Construct method-->public Student()
需要注意的是,在执行javac 编译java 程序的时候,如果在程序中没有明确声明一构造方法的话,系统会自动为类加入一个无参的且什么都不做的构造方法。
类似于下面代码:
public Student()
{}
所以,即使程序中没有声明构造方法,也可以正常运行。
4.1 构造方法的重载
只要构造方法的参数个数不同,或是类型不同,便可定义多个名称相同的构造方法。
注意:在 java 程序中只要明确的声明了构造方法,则默认的构造方法将不会被自动生成。
package javalearning;
class Student {
String name;
int grade;
public Student()
{
System.out.println("Construct method-->public Student()");
}
public Student(String n, int g)
{
name = n;
grade = g;
System.out.println("Construct method-->public Student(String n, ing g)");
}
public void printGrade()
{
System.out.println("Name: " + name + " Grade: " + grade);
}
}
public class TestConstruct {
public static void main(String[] args){
Student stu = new Student();
stu.printGrade();
Student stu1 = new Student("V", 100);
stu1.printGrade();
}
}
//运行结果:
Construct method-->public Student()
Name: null Grade: 0
Construct method-->public Student(String n, ing g)
Name: V Grade: 100
5. 对象比较
有两种方式可用于对象间的比较,它们是“= =”运算符与 equals()方法, “ == ” 操作符用于比较两个对象的内存地址值是否相等。
equals()方法用于比较两个对象的内容是否一致。
记住: “==”是比较内存地址值的, “equals”是比较内容的。
我们来看个例子:
package javalearning;
public class TestEquals {
public static void main(String[] args)
{
String str1 = new String("java");
String str2 = new String("java");
if (str1 == str2) {
System.out.println("str1==str2 They have the same address.");
}
if (str2 == str3) {
System.out.println("str2==str3 They have the same address.");
}
if (str1.equals(str2)) {
System.out.println("str1.equals.str2 They have the same value.");
}
if (str2.equals(str3)) {
System.out.println("str2.equals.str3 They have the same value.");
}
}
}
//运行结果:
str2==str3 They have the same address.str1.equals.str2 They have the same value.str2.equals.str3 They have the same value.
如果把上例中的(以下称情况1)
String str1 = new String("java");
String str2 = new String("java");
改为(以下称情况2):
String str1 = "java";
String str2 = "java";
则运些结果变为:
str1==str2 They have the same address.
str2==str3 They have the same address.
str1.equals.str2 They have the same value.
str2.equals.str3 They have the same value.
这是为什么呢?
实际上,情况2中,“java”这个字符串在内存中开辟了一个空间,而 str1 与str2 又同时指向同一内存空间,
所以即使 str1 与 str2 虽然是分两次声明的,但最终却都指向了同一内存空间。
而情况1中,str1,str2 是用 new 关键字来开辟的空间,所以各自单独占有自己的一个内存空间。因此,指向了不同的地址。
6. this 关键字的使用
this 表示当前对象,而所谓的当前对象就是指调用类中方法或属性的那个对象。
先看一个例子:
package javalearning;
class Student {
private String name;
private int grade;
public Student(String name, int grade) {
name = name;
grade = grade;
}
}
这里的本意是想通过构造函数来初始化变量。但是由于构造函数的变量名称和类的私有变量名称一致,因此,造成了混乱。
不知道形参 name 是赋给了类中的属性 name,还是类中的属性 name 赋给了形参中的 name...
这里,引入this关键字就可以避免这种混乱,因为this.name可以清楚的表示类中的name属性。
如下例:
package javalearning;
class Student {
private String name;
private int grade;
public Student(String name, int grade) {
this.name = name;
this.grade = grade;
}
public void print() {
System.out.println("Name: " + name + " Grade: " + grade);
}
}
public class TestThis {
public static void main(String[] args) {
Student stu = new Student("V",100);
stu.print();
}
}
//运行结果:Name: V Grade: 100
6.1 用this调用构造方法
如果在程序中想用某一构造方法调用另一构造方法,可以用 this 来实现,具体的调用形式如下:
this() ;
但是需要注意的是:this()调用构造方法必须放在构造方法的首行。
构造方法是在实例化一对象时被自动调用的,也就是说在类中的所有方法里,只有构造方法是被优先调用的,
所以使用 this 调用构造方法必须也只能放在构造方法的第一行。
Java基础教程 (http://wenku.baidu.com/view/d19061631ed9ad51f01df2a9.html) 作者不祥