对象引用

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虚拟机如何认为对象是垃圾:

  1. 局部变量执行完毕后
  2. 对象赋值为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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注