Java学习笔记之 类与对象2

1. 引用数据类型的传递

 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) 作者不祥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值