Java对象基础

类是面向对象语言中最为重要的一种数据类型,类声明的变量称为对象。类是创建对象的模板,当使用一个类创建一个对象时,也称给出了这个类的一个实例。

创建对象

创建对象包括对象的声明为声明的对象分配内存两个步骤:

对象的声明

类的名字 对象名字; //声明之后,就可以分配内存了

为声明的对象分配内存

使用new运算符和类的构造方法为声明的对象分配内存,即调用构造方法为其分配内存。如果类中没有构造方法,系统会调用默认的构造方法(默认构造方法:无参无语句)。如果类中定义了一个或多个构造方法,那么Java不提供默认的构造方法。
举个栗子:

class xiyoujiRenwu{
	float height,weight;
	String head,ear,hand,foot,mouth;
	void speak(String s){
		System.out.println(s);
	}
}
public class Example4_1{
	public static void main(String argv[]){
		xiyoujiRenwu zhubajie;    //声明对象
		zhubajie = new xiyoujiRenwu();  //为对象分配内存,默认构造方法
	}
}
//自建构造方法此处不再给出,在以后的讲述中会有提到。

Notice: 如果类中定义了一个或者多个构造方法,那么Java不提供默认的构造方法!!!

对象的内存模型

接上面的代码给大家介绍一下对象的内存模型,以便于更好的理解对象这一概念:

  • 声明对象zhubajie后,zhubajie的内存中还没有任何数据,也就是空对象。空对象不能使用,因为它还没有得到任何“实体”,必须再进行为**为对象分配内存的步骤,即为对象分配实体。
  • 当系统见到:
    zhubajie = new xiyoujiRenwu();
    
    时,就会做两件事。
    1. 为xiyoujiRenwu类中的成员变量height, weight, head, ear, mouth, hand, foot分配内存,即类中的成员变量被分配内存空间,然后执行构造方法进行数据的初始化。(如果成员变量在声明时没有指定初值,并且所使用的构造方法也没有对成员变量进行初始化,那么,整型变量默认初值为0,浮点型变量默认初值0.0,boolean型变量默认false,引用型变量默认初值为NULL)。
    2. 给出一个信号,保证这些变量是属于对象zhubajie的。即new运算符为这些变量分配完内存后,会返回一个引用给zhubajie对象。(这样也就不难理解一个类使用new创建不同的对象(实例变量等)不会相互影响了,因为他们被分配不同的内存)。如下图所示:
      zhubajie

使用对象

抽象的目的时产生类,而类的目的是创建具有属性和行为的对象。对象不仅可以操作自己的变量改变状态,而且还能调用类中的方法产生一定的行为。

	 对象.变量;		 //调用变量
	 对象.方法;		 //调用方法

体现封装: 当对象调用方法时,方法中出现的成员变量就是分配给该对象的变量。当对象调用方法时,方法中的局部变量被分配内存空间,方法执行完毕,局部变量即可释放内存。
Notice: 局部变量在声明时如果没有初始化,那么它就没有默认值

对象的引用和实体

当用类创建一个对象时,类中的成员变量在堆(一种运行时的数据结构,支持动态内存管理) 中分配内存空间,这些内存空间成为该对象的实体或对象的变量,而上文所提到的对象中存放的引用在栈中分配内存,以确保实体由该对象使用。

由上面的解释大家可以知道,引用 和 实体 是分开的,即大家可以改变引用来相应改变它所能调用的实体。
这么说大家可能还是不清楚,举个栗子给大家:

class x1aoPoint{
	 public int a,b; //public表示权限,后面会提到
	 x1aoPoint(int a,int b){ //自定义构造方法(又复习了一下)
		this.a = a;
		this.b = b;  //关于this会在后面的博客中提到哦
	}
}
public class Lin{
	public static void main(String args[]){
		x1aoPoint p1,p2;
		p1 = new x1aoPoint(1,2);
		p2 = new x1aoPoint(4,3);
		//下面是重点!!!
		System.out.println("("+p1.a+","+p1.b+")");
		System.out.println(p1+"\n"+p2);
		p1 = p2; //改变引用,使p1也指向此前为p2分配的变量
		System.out.println("("+p1.a+","+p1.b+")");
		System.out.println(p1+"\n"+p2);
	}
}

运行结果如下,其余请自己体会:

x1aolin@x1aolin-E402NA:~/桌面/javaExample$ vim Lin.java
x1aolin@x1aolin-E402NA:~/桌面/javaExample$ javac Lin.java 
x1aolin@x1aolin-E402NA:~/桌面/javaExample$ java Lin
(1,2)
x1aoPoint@233c0b17
x1aoPoint@61a52fbd
(4,3)
x1aoPoint@61a52fbd
x1aoPoint@61a52fbd

最后补充一点: Java有所谓的“垃圾回收”机制:周期性的检测某个实体是否已经不再被任何对象所拥有,如果发现这样的实体,就会自动释放掉实体所占有的内存。所以,上面代码中,当p2的引用赋给p1时,最初分配给p1的实体就会被释放掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值