类封装完以后就可以通过使用new关键字和类的构造方法来创建对象,这种对象分为两种:匿名对象与非匿名对象。何为匿名对象,何为非匿名对象呢?举个例子:假如有如下类:
package com.heima.vo;
public class Student{
private String name="lisi";
private int age=12;
public void print(){
System.out.println(name+":"+age);
}
}
这种形式的对象称之为匿名对象:new Student();
这种形式的对象称之为非匿名对象:Student stu=new Student();
两者的区别:
1、两者的结构不同,这一点通过其表现形式一目了然,在此不作赘述;
2、在内存中的分布不同:匿名对象创建的对象只存在于堆中;非匿名对象创建对象时的对象虽然也在堆中,但其类变量却在栈中,栈中的类变量通过创建变量的内存地址来指向相应的对象。
3、①匿名对象调用方法有意义,而调用类中的属性则没有意义:例如:new Student().name="wangwu";,这属于使用匿名对象调用属性,那么为什么说这样做没有意义呢?当代码执行到这一行代码时则修改new Student()对象的name属性,可是当该条语句被执行后呢?由于这时new Student()没有继续引用,所以此对象在堆中就成了垃圾。那么为什么说匿名对象调用方法有意义呢?方法存在于栈空间,当在内存中创建的对象调用方法时,JVM开始为局部变量开辟内存空间,方法开始执行,方法强调其功能,对象调用方法可以完成其功能,所以匿名对象调用方法有意义。
②非匿名对象调用方法或调用类中的属性都有意义(其中前者不在累述,请参见第①点):例如:Student stu=new Student();,stu.name="wangwu"这属于使用非匿名对象调用属性,那么为什么说这样做有意义呢?当代码执行到这一行代码时则修改stu对象的那么属性,此时使用该对象调用print()方法则输出的name值为wangwu,鉴于这一点所以认为非匿名对象调用属性实用意义的。