服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java编程思想读书笔记(第5-7章)一


  第2章  万事万物皆对象
  
  一.所有对象都必须由你建立
  
  1.  存储在哪里
  
  1.  寄存器:我们在程序中无法控制
  
  2.  stack:存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在heap中
  
  3.  heap:存放用new产生的数据
  
  4.  static storage:存放在对象中用static定义的静态成员
  
  5.  constant storage:存放常量
  
  6.  non-ram:硬盘等永久存储空间
  
  2.  特例:基本型别
  
  基本类型数据存放在stack中,存放的是数据。而产生对象时,只把对象的reference存放在stack中,用于指向某个对象,对象本身存放在heap中。
  
  3.  java中的数组
  
  当你产生某个存储对象的数组时,真正产生的其实是存储reference的数组。引数组建立后,其中的每一个reference都会被自动设为null,表示“不指向任何对象”。
  
  二.建立新的数据型别:class
  
  1.  数据成员和函数
  
  1.1  基本成员的缺省值
  
  1)  当class的某个成员属于基本型别时,即使你没有为它提供初值,java仍保证它有一个缺省值。
  
  2)  只有当变量身份是“class内的成员时,java才保证为该变量提供初值。
  
  三.函数(mehtods),引数(arguments),返回值(return values)
  
  1.  引数列
  
  当引数传递的是对象时,传递的是对象的reference。
  
  四.注解用内嵌式文档
  
  java提供两种注解风格:/*xxxx*/、//xxxx
  
  第3章  控制程序流程
  
  一.使用java运算符
  
  1.关系运算符
  
  1.) 当对两个对象运用关系运算符进行比较时,比较的是object reference,如:
  
  java/lang/integer.java.html" target="_blank">integer n1 = new java/lang/integer.java.html" target="_blank">integer(3);
  java/lang/integer.java.html" target="_blank">integer n2 = new java/lang/integer.java.html" target="_blank">integer(3);
  java/lang/system.java.html" target="_blank">system.out.println(n1==n2);
  
  结果为false,因为两个object reference(n1和n2)值是不同的
  
  2) quals()的缺省行为也是拿referenct来比较。不过java中的class覆写了equals方法,如:
  
  java/lang/integer.java.html" target="_blank">integer n1 = new java/lang/integer.java.html" target="_blank">integer(3);
  java/lang/integer.java.html" target="_blank">integer n2 = new java/lang/integer.java.html" target="_blank">integer(3);
  java/lang/system.java.html" target="_blank">system.out.println(n1.quals(n2));//值为true
  
  2.  逻辑运算符
  
  1)  只能将and、or、not施用于boolean值身上。如果逻辑运算符两边的值存在non-boolean值,将会出错,如:
  
  int test1 = 1;
  java/lang/system.java.html" target="_blank">system.out.println((test && 1<2);//编辑出错,test是non-boolean值
  
  3.  位移运算符
  
  如果所操作的位移对象是char、byte、short,位移动作发生之前,其值会先被晋升为int,运算结果会是int。
  
  二.流程控制
  
  1.  迭代(iteration)
  
  1.1  逗号运算符
  
  逗号运算符只能用于for循环的控制表达式中的initialization和step两部分中,如:for(int i=0, j=i+1; i<5; i++, j=i*2)
  
  1.2  break和continue
  
  break表示退出循环;continue表示退出本次循环,回来循环起始位置。
  
  1.3  label
  
  label只有放在迭代语句之前才起作用,在label和迭代语句之间插入任何语句都不会起作用。
  
  2.  switch
  
  switch中的选择器必须是int或char型,如:
  
  float i = 2;
  
  switch ( i )//将出错,因为i不是int或char之一
  
  3.  计算细节
  
  1)  从float或double转为整数值,总是以完全舍弃小数的方式进行。
  
  4.  math.random()的输出范围是[0, 1]。
  
  第4章  初始化和清理
  
  一.以构造函数(constructor)确保初始化的进行
  
  如果某个class具备构造函数,java便会在对象生成之际,使用者有能力加以操作之前,自动调用其构造函数,于是便能名确保初始化动作一定被执行。
  
  二.函数重载(method overloading)
  
  1.  区分重载函数
  
  由于只能从函数名和函数的引数列来区分两个函数,而重载函数具有相同的函数名称,所以每个重载函数都必须具备独一无二的引数列。
  
  2.  default构造函数
  
  1)  default构造函数是一种不带任何引数的构造函数。如果你所开发的class不具任何构造函数,编译器会自动为你生成一个default构造函数。
  
  2)  如果你自行定义了任何一个构造函数(不论有无引数),编译器就不会为你生成default构造函数。
  
  3)  如果定义了一个class,如
  
  class bush{
  bush(int i){}
  }
  
  当想用new bush();来产生class的实例时,会产生错误。因为在定义class时已定义了构造函数,所以编译器就不会为class生成default构造函数。当我们用new bush()来产生实例时,会尝试调用default构造函数,但在class中没有default构造函数,所以会出错。如:
  
  class sundae
  {
  sundae(int i) {}
  }
  public class icecream
  {
  public static void main(java/lang/string.java.html" target="_blank">string[] args)
  {
  //sundae x = new sundae();会编译出错,无构造函数sundae()
  sundae y = new sundae(1);
  }
  }
  
  *:在定义一个class时,如果定义了自己的构造函数,最好同时定义一个default构造函数
  
  3.  关键字this
  
  1)  this仅用于函数之内,能取得“唤起此一函数“的那个object reference。
  
  2)  在构造函数中,通过this可以调用同一class中别的构造函数,如
  
  public class flower{
  flower (int petals){}
  flower(java/lang/string.java.html" target="_blank">string ss){}
  flower(int petals, sting ss){
  //petals++;调用另一个构造函数的语句必须在最起始的位置
  this(petals);
  //this(ss);会产生错误,因为在一个构造函数中只能调用一个构造函数
  }
  }
  
  **:1)在构造调用另一个构造函数,调用动作必须置于最起始的位置
  
  2)不能在构造函数以外的任何函数内调用构造函数
  
  3)在一个构造函数内只能调用一个构造函数
  
  4.  static的意义
  
  无法在static函数中调用non-static函数(反向可行)。为什么不能呢,我们看下面的例子。
  
  例4.2.4.1
  
  假设能在static函数中调用non-static函数,那么(a)处就将出错。因为在没有产生movie class实例之前,在就不存在movie class内的name实例,而在getname()中却要使用name实例,显然的错误的。
  
  class movie{
  java/lang/string.java.html" target="_blank">string name = “”;
  movie(){}
  public movie(java/lang/string.java.html" target="_blank">string name) { this.name = name; }
  public static java/lang/string.java.html" target="_blank">string getname() { return name; }
  }
  public class test{
  public static void main(java/lang/string.java.html" target="_blank">string[] args){
  //下面两名先产生实例后再调用getname()没有问题
  //movie movie1 = new movie(“movie1”);
  //string name1 = movie1.getname();
  //下面一名将出错
  //string name2 = movie.getname(); (a)
  }
  }
  
  三.清理(cleanup):终结(finalization)与垃圾回收(garbage collection)
  
  1)你的对象可能不会被回收
  
  只有当程序不够内存时,垃圾回收器才会启动去回收不再被使用的对象的内存空间。某个对象所占用的空间可能永远不会被释放掉,因为你的程序可能永远不会逼近内存用完的那一刻,而垃圾回收器完全没有被启动以释放你的对象所占据的内存,那些空间便会在程序终止时才一次归还给操作系统
  
  3)  只有在采用原生函数(native methods)时,才使用finalize()。
  
  四.成员初始化(member initialization)
  
  1)  函数中的变量不会被自动初始化,如
  
  void f(){
  int i;
  i++;
  }
  
  将发生编译错误,因为i没有被初始化。
  
  2)  class的数据成员会被自动初始化,具体情况如下(见p220例子):
  
  基本型别:boolean:false、char:null(/u0000)、byte:0、short:0、int:0、
  
  long:0 、float:0、double:0