Java学习笔记之 类与对象2

来源:互联网 发布:高考软件理科 编辑:程序博客网 时间:2024/05/21 05:58
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) 作者不祥

原创粉丝点击