72-对象的引用
引用好比快捷键,只是记录对象的内存地址,通过它可以访问对象(属性和方法)。
在Java中,尽管一切可以看作对象,但是真正操作的标识符实际上是一个引用。
类名 引用名称
比如:
Student xiaoming;
这个xiaoming其实只是一个引用,它并不是对象。对象是new出来的:
Student xiaoPan = new Student();Code language: JavaScript (javascript)
引用只是存储一个对象的内存地址,并非存放一个对象。
73-对象的比较
对象的比较可以使用==运算符或者equals方法,它们有本质的区别。我们用String来演示:
当使用==时,比较的是引用中的内存地址。把一个String赋给另外一个String,其实是地址的赋值,并不是对象的赋值,所以它们的==比较是一样的。
String s1 = new String("a");
String s2 = new String("A");
String s3 = new String("a");
String s4 = s3; //这里是把地址赋给s4 所以s3和s4都是指向一个内存地址
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //false
System.out.println(s1 == s3); //false
System.out.println(s1.equals(s3)); //true
System.out.println(s1 == s4); //false
System.out.println(s1.equals(s4)); //true
System.out.println(s3 == s4); //true
System.out.println(s3.equals(s4)); //true 对象自己和自己比较Code language: JavaScript (javascript)
==比较的是内存地址,只要有new就会产生新的内存地址,所以s1、s2、s3是不同的内存地址。s1、s2、s3、s4记录的都是内存地址。==比较的是内存地址,String的equals比较的是字符串的值。equals是Object的方法,可以重写。
74-对象的销毁
每个对象都有生命周期,否则内存早就爆了。当对象的生命周期结束时,分配给该对象的内存地址将会被回收。在其他语言中需要手动回收废弃的对象,但是在Java中由垃圾回收机制自动处理。
Java虚拟机如何认为对象是垃圾:
- 局部变量执行完毕后
- 对象赋值为
null
75-练习-图书销量
使用一个静态成员来记录书本的库存,每次卖出一本就减少一本,构造的时候初始化数量,由一个方法输出剩余库存数。
class Book {
public static int Count = 1000;
private String name;
public Book() {
}
public void Sell() {
System.out.println("卖出一本书");
Count--;
}
public static void ShowCount() {
System.out.println("书本库存:" + Count);
}
public static void main(String[] args) {
Book b = new Book();
Book.ShowCount();
b.Sell();
b.Sell();
b.Sell();
b.Sell();
b.Sell();
b.Sell();
b.Sell();
Book.ShowCount();
}
}Code language: PHP (php)
输出结果:
书本库存:1000
卖出一本书
卖出一本书
卖出一本书
卖出一本书
卖出一本书
卖出一本书
卖出一本书
书本库存:993Code language: CSS (css)
76-练习-计算长方形面积
编写一个长方形类,由长和宽两个属性。在构造方法中初始化长和宽,定义一个成员方法来计算它的面积。
class Rectangle {
private float length;
private float width;
public Rectangle(float length, float width) {
this.length = length;
this.width = width;
}
public float getArea() {
return length * width;
}
public static void main(String[] args) {
Rectangle rect = new Rectangle(5.0f, 3.0f);
System.out.println("长方形面积:" + rect.getArea());
}
}Code language: PHP (php)