Java学习笔记之 类与对象2
来源:互联网 发布:高考软件理科 编辑:程序博客网 时间:2024/05/21 05:58
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) 作者不祥
- Java学习笔记之对象与类
- Java学习笔记之 类与对象2
- Java学习笔记(2): 类与对象
- Java学习笔记之 类与对象1
- Java学习笔记之 类与对象3
- JAVA学习笔记----对象与类
- JAVA学习笔记-对象与类
- Java学习笔记,类与对象(三)
- JAVA类与对象学习笔记
- java学习笔记-类与对象
- Java学习笔记-对象与类
- Java学习笔记--类与对象
- Java学习笔记3--类与对象
- Java学习笔记之面向对象2
- Java学习笔记:对象与类(2)
- Java学习笔记(2):对象与类
- 《JAVA与模式》学习笔记之面向对象设计原则
- java学习之--对象与类
- oracle:变长数组varray,嵌套表,集合
- Redis运行流程源码解析
- iOS地图MKMapView详析
- 批处理 删除文件 脚本
- SQL 批量插入
- Java学习笔记之 类与对象2
- php简体转繁体
- LOG4J配置详解
- spring 依赖注入
- 对C++继承,封装,多态的理解
- Android APN配置
- [.Net码农]EXCEL变DataTable
- iframe可编辑 (CRM不免会运用到JS)
- ExtJS的几个小技巧