java基础-类的定义、成员变量、⽅法、对象的创建与使⽤
⼀.JAVA类的定义
  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默认的初始化的值。
三、Java⾯向对象的基本概念——引⽤
  引⽤类型和基本类型有着巨⼤的区别,当声明⼀个int  i=0时,系统会马上给这个i分配⼀个内存空间(在栈内存⾥⾯分配⼀⼩块区域⽤来装数字0),⾥⾯装着⼀个值为0,以后使⽤i这个名字马上就可以访问这个内存空间⾥⾯的值,这就是基本数据类型,所以基础类型就只占⼀块内存。基础类型之外的类型全都叫引⽤类型,我们定义⼀个Mouse  m,这个m就是⼀个引⽤类型的数据。引⽤类型有什么重要的特征——引⽤类型占2块内存。我们定义好这个类之后,需要使⽤new关键字把这个类的对象实例化出来,也就是真真正正造出⼀个对象出来才能使⽤这个对象。
如何在内存中区分类和对象
  类是静态的概念,是位于代码区⾥⾯。对象是new出来的,它是位于堆内存,为什么对象要位于堆内存?因为堆内存是⽤来动态分配内存的,只有在运⾏当中才会new⼀个对象放堆内存⾥⾯,那这个对象到底有多⼤个,这个东西你不知道,你没有办法提前知道,所以你没有办法提前分配内存给这个对象,你只有在运⾏期间才能去分配它。什么叫运⾏期间?敲JAVAC这个命令那是在编译期间,编译完成后再敲JAVA命令,那就是运⾏期间了。只有在运⾏期间,才能够明⽩这个对象到底要分配多⼤的空
间给它,所以把它放在堆内存⾥⾯,堆内存⽐较⼤,动态分配内存⽤它。如果这个对象不⽤了,那它就是垃圾,那么就等着垃圾收集器把它收集回去,释放掉占⽤的内存。
  记住,以后⼀提到引⽤,脑⼦⾥马上浮现引⽤那就是⼀⼩块内存指向⼀⼤块内存。
四、对象的创建和使⽤
五、类和对象的关系
在内存中分析类和对象的关系
  假设这⾥有⼀个类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这样去访问。
六、构造⽅法
  在⾯向对象⾥⾯有⼀个特殊的⽅法,叫构造⽅法。构造⽅法是⽤来创建⼀个新的对象的,与new组合在⼀起⽤,使⽤new+构造⽅法创建⼀个新的对象。你new⼀个东西的时候,实际上你调⽤的是⼀个构造⽅法,构造⽅法就是把⾃⼰构造成⼀个新的对象,所以叫构造⽅法,构造⼀个新对象⽤的⽅法叫构造⽅法。
  构造⽅法⽐较特殊,构造⽅法的名字必须和类的名字完全⼀模⼀样,包括⼤⼩写,并且没有返回值。如原来定义的⼀个person类,在类⾥⾯声明了两个成员变量id与age,这时候你可以再为这个person类
定义⼀个它的构造⽅法person(int n,int i),这个⽅法的名字和类名完全相同,并且没有返回值,也就是在这个⽅法前⾯不能写任何的⽅法的返回类型修饰符,连void都不可以写。
构造⽅法范例:
1public class Person {
2int id;  //在person这类⾥⾯定义两个成员变量id和age,
3int age=20;  //给成员变量age赋了初值为20
4
5/**这⾥就是person这个类的⼀个构造⽅法
6    * 构造⽅法的规则很简单,和类名要完全⼀样,⼀点都不能错,包括⼤⼩写。
7    * 并且没有返回值,不能写void在它前⾯修饰
8    * @param _id
9    * @param _age
10*/
11public 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){
java类的概念2    point  p = new  point();
3 }
  这⾥这样写是可以的,当没有给这个类指明构造⽅法时,系统会默认地给这个类加上point ( ) { }这样⼀个空的构造⽅法。所以才可以在main⽅法中使⽤
point  p = new  point(); 实际上你调⽤的就是编译器默认给它加上的point ( ) { }这个构造⽅法,在这个构造⽅法当中,默认地把类⾥⾯的成员变量x和y初始值设为0。正是因为系统给它默认加上这么⼀个构造⽅法,所以才能在main⽅法⾥⾯调⽤。但要记住⼀点,⼀旦给这个类⾥⾯指定了构造⽅法,那么系统就不会再给这个类添加构造⽅法了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。