JAVA里面有class关键字定义一个类,后面加上自定义的类名便可。如这里定义的person类,使用class person定义了一个person类,而后在person这个类的类体里面定义person这个类应该具备的成员变量(即属性)和方法,如这里定义的int id和int age这个两个成员变量,或者叫属性,这个id表示人的身份证号码,人应该具备这个属性,age表示人的年龄,这也是人应该具备的。这样就在person这个类里面定义了两我的应该有的属性,接下来就是定义方法了,这里定义了三个方法,分别是getAge()、setAge(int i)和getId(),分别用来获取人的年龄,设置人的年龄,获取人的id,getAge()方法获取了人的年龄后,将获取到的值返回,因此使用了return age语句,getId()方法也使用了return id语句用于返回获取到的id的值。函数
在JAVA里面的任何变量首先应该要声明,而后再赋值,而后再使用。成员变量和局部变量有一个重要区别:成员变量在类里面声明时若是不进行初始化,那么JAVA会默认给它初始化,而局部变量JAVA不会默认给它初始化,因此在方法里面声明一个局部变量若是不给它初始化时就会出错。默认初始化大多数都是0,boolean类型的为false,引用类型的为null,如过不记得JAVA对成员变量默认的初始化是多少的话,那就这样作,定义一个成员变量,不给它初始化,而后直接打印这个成员变量,打印出来的结果就是JAVA默认的初始化的值。spa
引用类型和基本类型有着巨大的区别,当声明一个int i=0时,系统会立刻给这个i分配一个内存空间(在栈内存里面分配一小块区域用来装数字0),里面装着一个值为0,之后使用i这个名字立刻就能够访问这个内存空间里面的值,这就是基本数据类型,因此基础类型就只占一块内存。基础类型以外的类型全都叫引用类型,咱们定义一个Mouse m,这个m就是一个引用类型的数据。引用类型有什么重要的特征——引用类型占2块内存。咱们定义好这个类以后,须要使用new关键字把这个类的对象实例化出来,也就是真真正正造出一个对象出来才能使用这个对象。code
如何在内存中区分类和对象对象
类是静态的概念,是位于代码区里面。对象是new出来的,它是位于堆内存,为何对象要位于堆内存?由于堆内存是用来动态分配内存的,只有在运行当中才会new一个对象放堆内存里面,那这个对象到底有多大个,这个东西你不知道,你没有办法提早知道,因此你没有办法提早分配内存给这个对象,你只有在运行期间才能去分配它。什么叫运行期间?敲JAVAC这个命令那是在编译期间,编译完成后再敲JAVA命令,那就是运行期间了。只有在运行期间,才可以明白这个对象到底要分配多大的空间给它,因此把它放在堆内存里面,堆内存比较大,动态分配内存用它。若是这个对象不用了,那它就是垃圾,那么就等着垃圾收集器把它收集回去,释放掉占用的内存。blog
记住,之后一提到引用,脑子里立刻浮现引用那就是一小块内存指向一大块内存。内存
使用new关键字来建立一个新的对象。get
在内存中分析类和对象的关系编译器
假设这里有一个类C,咱们定义了一个类class C,而后在这个类里面定义了两个成员变量: int i和int j。定义好了这两个成员变量之后,咱们写了一个main()方法(public static void main(Strng[] args)),程序开始执行。第一句咱们写了 C c1 = new C(),这句的代码是咱们至关于在堆内存里建立了一个对象,同时也建立了这个对象的一个引用对象c1,c1位于栈内存中,c1这个引用对象指向堆中一大块内存,这一大块内存里面装着new出来的那个对象。这里面咱们通常来讲是new出来两个对象c1和c2,固然,实际上,严格来说,c1和c2叫作对象的引用,有时候,简称new出来了两个对象,c1和c2。你脑子里立刻要浮现出两块内存,c1指向一块,c2指向一块。局部变量是分配在栈内存里面的,main方法里面的c1和c2都是局部变量,因此在栈里面分配了两小块内存出来,一块是c1的,一块是c2的,c1这块内存里面装着一个值,或者叫装着一个地址,这个地址是什么,咱们不知道,咱们只知道根据这个值就能找到new出来的C这个类里面的一个对象,而在这个对象里面有它本身的成员变量i和j,里面的两小块内存是分别用来装i和j的值的,由于每个对象都有本身不一样的成员变量的值,因此c1指向的那块对内存里面又分红一小块一小块内存,每个小块的内存都装着这个对象的成员变量(或者叫属性)。如这里的第一小块装着i的值,第二小块装着j的值,因此当咱们去访问第一小块里面装着的成员变量时,咱们应该这样写:c1.i,这样就拿到了i的值,c1.j,这样就拿到了j的值。同理,c2这个对象也指向了一个new出来的C这个类里面的另外一个对象,这个对象也有成员变量i和j,只不过和c1指向的那个对象里的i和j的值不一样而已。要访问这个这个对象的成员变量时 ,也是要c2.i,c2.j这样去访问。编译
在面向对象里面有一个特殊的方法,叫构造方法。class
构造方法是用来建立一个新的对象的,与new组合在一块儿用,使用new+构造方法建立一个新的对象。你new一个东西的时候,实际上你调用的是一个构造方法,构造方法就是把本身构形成一个新的对象,因此叫构造方法,构造一个新对象用的方法叫构造方法。
构造方法比较特殊,构造方法的名字必须和类的名字彻底如出一辙,包括大小写,而且没有返回值。如原来定义的一个person类,在类里面声明了两个成员变量id与age,这时候你能够再为这个person类定义一个它的构造方法person(int n,int i),这个方法的名字和类名彻底相同,而且没有返回值,也就是在这个方法前面不能写任何的方法的返回类型修饰符,连void都不能够写。
构造方法范例:
1 public class Person { 2 int id; //在person这类里面定义两个成员变量id和age, 3 int age=20; //给成员变量age赋了初值为20 4 5 /**这里就是person这个类的一个构造方法 6 * 构造方法的规则很简单,和类名要彻底同样,一点都不能错,包括大小写。 7 * 而且没有返回值,不能写void在它前面修饰 8 * @param _id 9 * @param _age 10 */ 11 public Person(int _id,int _age ) { 12 id = _id; 13 age = _age; 14 } 15 }
构造方法写好后就和new组合在一块儿使用,new的做用是构建一个新对象,创造一个新对象,因此new的时候实际当中调用的是构造方法。只有调用了这个构造方法才能构造出一个新的对象。例如:
1 public static void main(String[] args) { 2 Person tom = new Person(1, 25); // 调用person这个构造方法建立一个新的对象,并给这个对象的成员变量赋初始值 3 }
下面是在main方法里面调用person构造方法时的内存分析状况:
当方法调用完成以后,栈里面为它分配的空间所有都要消失,即把这个方法调用时分配给它的内存空间释放出来,因此这个构造方法person调用完成以后,栈内存里面分配的两小块内存_id和_age自动消失了。这样就把它们所占的空间让了出来,让其余的方法去占用。而new出来的对象则永远留在了堆内存里面。
声明一个类,若没有在类中指定其构造方法(构造函数)时,编译器会为这个类自动添加形如类名( ){ }的构造函数。
如:
1 class point{//这里声明一个类时并无给它指定其构造方法。 2 int x; 3 int y; 4 }
但在main方法里面咱们却能够这样使用:
1 public static void main(String[] args){ 2 point p = new point(); 3 }
这里这样写是能够的,当没有给这个类指明构造方法时,系统会默认地给这个类加上point ( ) { }这样一个空的构造方法。因此才能够在main方法中使用
point p = new point(); 实际上你调用的就是编译器默认给它加上的point ( ) { }这个构造方法,在这个构造方法当中,默认地把类里面的成员变量x和y初始值设为0。正是由于系统给它默认加上这么一个构造方法,因此才能在main方法里面调用。但要记住一点,一旦给这个类里面指定了构造方法,那么系统就不会再给这个类添加构造方法了。