Thinking in Java学习笔记

Thinking in Java学习笔记

第一章 对象导论
       其实这章介绍的是oop的思想,知道什么是抽象、接口、继承等等,其实这些我觉得没有必要专门提出来写一章,这个我就不介绍了
在以后的学习中,这些知识是会在里面融会贯通的。

第二章 万事万物皆对象
       在java程序中,万事万物皆对象,即使是java程序本身,也是一个对象
       一、Reference是操纵对象之钥匙
             c语言中是使用指针来操纵对象的,但是java呢?用的是reference来操纵对象,我习惯把他叫做句柄,句柄和对象的关系就想是电视遥控器和电视机的关系一样,既然是这样,那么遥控器和电视机都是可以独立出现的
           例如:String name;
            这个java语句只会产生句饼(遥控器),并不产生实际的对象(电视机),就想你老婆还没生孩子之前你们就把名字给取好了一样,句柄并没有连接到实际的对象上。这个样子写代码是不推荐的,一个没有指向对象的句柄在调用的时候编译器会抱错,应当使用String name="baby";,或者使用String name =new String("baby");这里new的意思是产生一个string类型的对象,并且这个string叫做baby。这2个方法都可以实现对象的建立。
二、所有的对象都需要你来建立
       1、储存在那里
             a、寄存器  这里是核心的存储空间,我们是没办法操纵的
             b、栈 (stack )这里的存取速度快,效率高,因为这里要求被存储的数据有具体大小和存活时间限制,使用弹性小,这里一般存储的是我们的对象句柄,而对象是不存在这里的
             c、堆 (heap) 这里是通用的存储空间,他比stack好在编译器不需要知道实际在heap中存储数据的大小,也不知道这个空间需要分配多长时间,弹性好,所以用来存储对象,但是速度要比stack慢很多
             d、静态存储空间(static storage)这里是存放被声明为static的特定成员,java对象本身是不会分配在这里的
             e、常量储存空间 这里存放的是程序中的常量,常量值不会改变,最安全
             f、non-ram  流或者是持久话对象
      2、基本数据类型
             boolean char byte short int long float double void  基本数据类型的数据是不用new 来创建的,直接int i=0,不使用heap空间,他是被放在stack中的,速度快!但是假如你要是想用heap来存储基本数据类型的话,就要使用该类型的外覆类来实现了 例如Integer  i= new Integer("0");
             注意!String不是基本数据类型,她是对象!从他的定义方法就可以知道了!
       3、数组(array)
             java中的数组使用和定义上要比c中的数组更安全,当你在定义数组的时候其实产生的是一个储存对象句柄的数组,而每一个句柄所指向的值回被设定为null,也就是不指向任何对象
三、你不需要摧毁对象
       1、基本类型生存范围
              java中基本类型的生存范围是由一对大括号决定的,在生存空间内定义的变量,只能用于生存空间结束之前 {
         int i=1;
       {
               int i=100;//错误!这样的定义在java总是不允许的!编译器会认为i已经被定义过了
        }
   }
       2、对象的生存范围
              对象拥有的寿命和基本类型是不一样的,当你使用new来产生一个对象的时候,即使离开了大括号,该对象还是存在的
   {
             String name =new Sting("baby");
   }
            句柄name会在大括号的生存空间之外消失的,但是他所指向的string对象却还在继续占用着内存,但是大家会认为大量的无用对象会占用大量的内存,java中是怎么解决的呢?他使用的是垃圾回收机制,垃圾回收器会在特定的时间检查使用new创建的对象,假如这些对象已经没有句柄指向他们,那么他就回把无用的对象清理掉。
四、建立新的数据类型 class
         java中既然一切全是对象,那么是什么来限制对象的属性呢?通过使用类。java中使用class关键字来自己定义一个类
        例如:class women{ //class body}这样你就定义一个women 类,当然这个类没有任何属性
        1、数据成员和方法
               一个类中,存在2中成员,一个是数据成员,一个是方法。数据成员可以是基本数据类型,也可以是对象,而基本数据类型在声明的时候系统会自动的给他赋予一个初始值
五、方法、参数、返回值
          一个合法的方法包括名称、参数、返回类型、方法体 例如
        void name(int i)
       {
                return;
        }其中 名称name()      参数int i       返回类型 void     方法体 {},对于一个class而言,名称+参数的组合必须是唯一的,参数也可以是空的,有一个叫test的对象允许你调用一个返回值为string的方法getTest(),则 String name = test.getTest(); name的类型一定要和返回值的类型相同。
        在向一个方法传递一个对象的时候,其实传递的是该对象的句柄(基本数据类型除外),而传递的对象类型一定要和方法中接受参数的参数类型相同。当你不需要方法给你返回什么东西的时候,你可以把该方法的返回类型设置为void,而此时方法中的return就是用来离开方法的,不需要等到他执行完毕,如果方法的返回类型不为void的时候,你可以使用return 返回一个和返回类型一样的值

打造第一个java程序
 名称的可视性
         名称问题有些人觉得不是什么大问题,我开始也觉得那不是个什么大问题,但是当你有一天写了很多的类时,你就发现,名称其实真的很重要,假如你有这么一个类,他需要调用其他几个类, 当这几个被类名相同时,问题就出现了,那么
         怎么区分他们,并且使他们的名称不冲突呢?毕竟我们不可能把每个声明过的类的名字一一记住,以便在下次声声明其他名称时,加以区分。这个时候我们就需要使用包(package)了,一个包就是一个命名空间。命名空间的使用规则是:反转internet域名,例如,我的blog是blog.csdn.com/maoerzuozuo你可以在类的开头使用package maoerzuozuo.com.csdn.blog,这样就好了~每个包都是一个独一无二的命名空间。需要注意一点:当使用package说明一个包时,该包的层次结构必须和文件目录的结构相同!就想c:/maoerzuozuo/com/csdn/blog
 使用其他组件
        包定义了之后一定要使用的,怎么使用呢?在文件的开头使用import关键字,假如我要导入我开发的一个叫hello.class组件,我只要import maoerzuozuo.com.csdn.blog.hello;就导入了我所创建的包,当然你也可以偷懒,用import maoerzuozuo.com.csdn.blog.*;
  导入该文件夹里所有的包(也许你有的包根本用不上),但是这样有个弊端,就是在编译的速度要比直接指明包的编译速度要慢。
 关键字static(静态的)
           一个class只有在你使用new来产生对象时,他的函数才能被外界使用,但是也有2中情况是用上面的方法无法实现的。
           1、不管产生多少的对象或没有对象产生对象时,一些特定的数据存储只有一份;
           2、类中的某个函数不想和对象绑定在一起,既我不想产生对象,但是我还想用类中的一个函数;
           一般情况下, 你要使用一个非静态(non-static)的成员的话,必须先产生一个对象使用对象来调用这个数据或函数,所以你必须知道这个函数/数据属于哪个对象才行,因为static是不用产生对象就可以使用的,所以在static的函数中不能直接调用non-static的函数或变量。
   解决1、把static关键字摆在成员变量或函数定义之前,就可以使他们变为静态的。
            class StaticDemo
            {
             static int i=888;
             public static void main(String args[])
             {
              StaticDemo sd1=new StaticDemo();
              StaticDemo sd2=new StaticDemo();
              System.out.println(sd1.i);//888
              System.out.println(sd2.i);//888
              StaticDemo.i++;
              System.out.println(sd1.i);//889

   System.out.println(sd2.i);//889
               
             }
            }
            现在即使你产生n个StaticDemo对象,但是i只有原始的一份,不管你是sd1.i还是sd2.i,其实就是同一个i,全部引用自这个StaticDemo.i,所以,只要改变StaticDemo.i内存储的数据,这些sd1和sd2的i都会改变,因为他们的i的句柄全部指向的是StaticDemo.i这一个内存空间,就相当于,有一个人在a公司工作,还在b公司兼职,而他假如死掉了,则同时影响2家公司,就是这个意思,同样的道理也适用于static的函数
    解决2、要想不产生对象就能使用函数,这样需要在函数名前加上static
              class StaticDemo
              {
               public static void show(String s)
               {
                System.out.println(s);
               }
               public static void main(String args[])
               {
                show("one");//调用方法1
                StaticDemo.show("two");//调用方法2
                new StaticDemo().show("three");//调用方法3
               }
              }
                    对于调用方法1,其实他隐藏了一个关键子,就是this,他的完整形式应当是this.show("one"),这个this的用法以后会学到
                    对于调用方法2,使用的是className.method()的形式,这个也就是static的函数调用的典型形式,non-static的函数是不能使用这样的方法调用的!

对于调用方法3,这个方法就是我们调用函数的一般方法,创建对象,由对象调用函数,这个方法对于static和non-static是同样适用的。某个成员变量在声明为static的时候,其建立的方式有很大的变化,但是static的函数变化不大,static函数最大的一点用处就是可以在不建立对象的情况下,调用函数,就像我们经常见到的main函数一样。
你的第一个java程序
        java程序默认的回把java.lang下的包导入到你所创建的文件中,我们没有必要再使用import来导入。一个public的class的名称一定要和文件名称是一样的,并且一个class里面只允许有一个public的class,附则程序是编译不过去的。如果你要运行这个类的话,那么这个类中一定要有一个main()函数,他的固定格式为public static void main(String args[]),其中,public表示这是一个公开给外界使用的函数,并且是个static的不允许有返回值,而传入main()的参数必须是个String对象数组,即使你从来没有过,这个args[]的string数组可以存储cmd的参数。                  
 编译与执行
     使用javac 文件名.java来编译java文件,使用java className来执行className这个类,这里要注意2点,一个是当你使用java命令执行一个类时,这个类必须要有main函数;第二个className不一定等于文件名,一个java文件中假如有public类,那么这个类名必须要和文件名相同,其他情况你可以随你自己的意思起名字
注释及内嵌文档
  //注释单行 /*.......*/注释多行,多行注释内不能嵌套多行注释。
  寓文档于注释
    javadoc命令可以将内嵌在程序代码中的文档提取出来,生成html格式的文件,使用浏览器就可以查看。
  语法
    这个部分我就跳过去了,有兴趣的朋友自己看看,很简单的
编码风格
  类名在编写的时候,应当第一个字母大写,如果名称是由多个单词组成,则把这些个单词并在一起写,并且把他们的第一个字母大写 例如 public class MaoErZuoZuo
本章总结:
  这一章总算ko了,呵呵~其实这章讲的不难,大家就是要仔细看书,好好体会tij的精髓
本章习题解答
  这章的习题总体不难,惟独有一个题是运用了后面学习的知识,我们就把他作为难题来对付好了
  "撰写某个程序,使他能够接受由命令行传入的3个引数,为此,你需要对代表命令行引数的string数组进行索引"
  public class Solve
  {
   public static void main(String args[])
   {
    System.out.println(args[0]);
    System.out.println(args[1]);
    System.out.println(args[2]);
   }
  }
  这个程序可以接受3个引数,并且把他显示出来,有的人会问了:我们怎么把引数传递进来呢。大家在运行时,要在java Solve后面加个空格,在加三个引数,每个使用空格隔开,例如 java Solve aaa bbb ccc这样程序就会接受到这3个引数,并且把他显示。当你输入引数和接受引数的数量不符时候,会抱ArrayIndexOutOfBoundsException的错误,希望大家注意!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值