`
laststand
  • 浏览: 9979 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Thinking in Java 学习笔记 一

阅读更多

继承在面向对象中如此重要,以至于经常被高度强调,新手往往有这样的印象:处处使用继承。这会导致难以使用并过分复杂的设计,实际上建立新类时,应该首先考虑组合,因为它更为简单清晰。

两种方式导致基类与子类的差别:在子类中增加新的方法、使子类和基类之间产生差异的方法(override)。

单根继承。是否所有类都继承自单一的类,java的答案是yes,终极的类为Object。

Java并没有赋予程序员销毁对象的权力,java完全采用了动态内存分配方式,采用垃圾回收器设计处理内存释放问题。

存储数据之处:

1)寄存器,不同于C/C++,java没有提供直接控制使用寄存器的方法。

2)堆栈 。位于通用RAM中,通过堆栈指针得到支持,向下分配,向上则为释放,仅次于寄存器。Java系统必须知道其中数据的确切生命周期,以便上下移动(约束了灵活性),所以某些Java数据存在其中,但对象并不在。

3)堆。一种通用的内存池(RAM中),存放着所有Java对象。不同于堆栈之处:编译器不需要知道数据将存活多久,当需要对象时,new自动在堆里分配存储。灵活性的代价:用堆分配清理要比堆栈消耗更多时间。

4)常量存储。常量通常直接放在程序代码内部,不被改变。在嵌入式系统中,又是放在ROM中。

5)非RAM存储。持久化对象,不受程序控制,如数据库等。

Java中的数组。为了安全性,java的数组与C/C++直接使用内存块不同,确保初始化,而且不能在范围之外访问(编译时报错,C/C++是可以访问,然后运行报错),初始化时有一个特定的值,拥有自己的关键字null

基本类型默认值(未初始化):boolean false,char ‘\u0000’(null),byte (byte)0,short (short)0,int 0,long 0L,float 0.0f,double 0.0d 这些基本字段的初始化仅限于类中属性,对局部变量并不初始化,而是与C/C++一样(任意值)。

对于未初始化,Java视为错误,而C++仅视为警告。

作用域,将一个较大的作用域的变量隐藏起来的做法,在java中是行不通的,即不能在小作用域中再次声明大作用域中已有的变量。另外java对象不具备和基本类型一样的生命周期 ,在作用域结束后,无法访问对象,但其并没有销毁,而是继续存在于内存中。等待垃圾回收器处理。

Java对类库,命名空间的引用使用倒置,如org.apache.*

只有用了new来创建,数据存储空间才被分配。

Java流程跳转中除了continue和break的直接使用外,还提供了label的使用,有点类似于C中的goto了;先标注一个label1:(冒号结尾),continue label1和break label1还是回到label入口以及终止迭代(label和当下的,两重)

JAVA构造的问题:没有构造器的时候,编译器将替你制造一个默认构造器 (无参数,内容不清楚),如果有了一个及以上的构造器 ,不再合成。

对于方法的调用:如Class a;a.b(c) ;内部表示为Class.b(a,c);

this的使用,不必过分使用this仅在需要的时候使用它,便于阅读。this可以用于构造器间的调用,如在一个构造器中使用this(i) 即可调用相应参数的constructor,但只能使用给一个。在类的内部,对于方法,其实编译器会默认加上this,而static就是没有this的方法。

Finalize()一旦垃圾回收器决定释放该对象,在释放前调用这个方法。如一个对象为circle,当他被创建的时候画到了屏幕上,那么如果不明确让它擦除,它可能永远得不到清理,在finalize中加入清理就可以了,一旦垃圾回收,就会清理(如果不回收,也不会清理)。Finalize一般的用途是清理通过创建对象外的方式分配空间的存储空间(正常的创建方式由垃圾回收处理)

对于局部变量,C++的销毁动作发生于{ }结束的时候(作用域),而对于用new创建的对象使用delete删除(调用相应析构),一旦忘了,那么永远不析构,内存泄露。Java不允许创建局部变量,只能用new创建 。但是却没有delete(因为有了垃圾回收器……)。如果JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收的恢复内存的……

为类中成员变量赋值,在声明的时候就可以了;在C++中这么做确实无效的,尽管很多新手都是这么做的~

构造器初始化可以灵活用于变量初始赋值,但是要牢记:无法阻止自动初始化的运行 ,即对于一个int,constructor中赋值为7,但其仍然是先置0,再赋值为7。散布在类中各个变量会在constructor调用前逐个初始化。

Static变量只会初始化一次,发生在类的第一个对象创建的时候(顺序上先于一般变量初始化),也就是在class文件第一次被加载的时候。

Constructor虽然没有显式的表明,其实也是静态方法 。New使用创建对象时,分配中间清零,分配数据类型的默认初始值:数字为0,布尔(false)和字符相同,引用被设置为null。

在类中,static的域static{ },其中的语句在class载入时调用一次,其实同constructor,对于类中没有static声明的,仅为{ }内的语句,则每次一个对象实例化的时候都执行一遍。(这两个一般用于static与非static对象的初始化)

Java中定义数组可以用int[] a或者int a[],含义相同(不知道编译的时候都换成哪种?),后一种是C++的习惯,前一种更为达意,即一个整形数组变量——a。编译器不允许指定数组的大小,这样声明也没有给对象分配空间,你拥有的仅仅只是一个引用。数组初始化通过{}内赋值完成,空间分配同new。数组有默认成员变量length,超出这个边界——exception,而非如C++容忍访问内存。数组通过new后,仍然只是一个引用数组,只有当创建的对象赋给引用,初始化才算结束。

对于对象的print行为,如果没有定义toString访问,默认打印类名@地址。

enum枚举这个类看起来是一种新的数据类型,实际只是在产生了某些编译器行为,很大程度上你可以将它当做其他类来处理。事实上确实有自己的方法如ordinal、toString。

访问控制(隐藏具体实现)与“最初的实现并不恰当”有关 。但是修改代码面临许多的压力,在面向对象设计中考虑:“如何把变动的事物与不变的事物分离开来”。这种观念的体现之一就是类库。这一目标通常可以通过约定来实现。public、protected、private的出现也是为了明确开放的(通常意味很少变动或不变的)、封闭的(内部改动不影响功能)、继承。Package与默认权限则是将类捆绑为一个组件。Package代表了组件的概念,对于类的定位也有好的作用,这样的命名规则也为访问控制提供了支持。

Java解释器的运行过程:寻找环境变量CLASSPATH,查找.class文件的根目录。从根目录开始,解释器将获得的包的名称中的点号改为反斜杠,已CLASSPATH为根产生一个路径名称(根据操作系统的不同,a.b.c将解析为a\b\c或a/b/c)。

对于protected变量,继承来说,包A中的类继承了包B中的类,那么子类同样只有自己所在包的包权限。

类本身只有两种权限:public与默认的包访问权限。

有关public类的一些限制:对于每一个编译单元(文件),只能有一个public类,并且类的名称必须完全与编译单元的名称相同 ,不然会得到编译错误。当然编译单元中不带public类也是可以的。

复用类的概念就是,继承、组成。组成指的就是在一个类中引用另一个类。通常对于继承而言,最好将子类中的方法声明为public(而非暧昧的默认包权限),因为继承常常发生于不同的包之间。Java会自动在子类的构造器中插入对基类构造器的条用,确保基类的初始化 。如果基类没有默认构造器,在子类中直接调用带参数的构造器(必须在其中增加对基类构造的调用,不然要报错)。编译器虽然强制要求去初始化基类,但是却并不监督将成员变量也初始化,这点必须自己注意。

复用的第三种关系为代理,Java没有提供直接支持(为什么),这个介于继承与组合间的中庸之道。(这货貌似是设计模式吧,貌似~~)

 

分享到:
评论

相关推荐

    Thinking in Java 自学笔记——第二章 一切皆对象

    Thinking in Java 自学笔记——第二章 一切皆对象 个人原创,不喜勿喷。

    Thinking in java学习笔记

    这是我经过半年的认真研读《thinking in java》这本书的读书笔记,涉及到从容器一章开始的所有后续章节的内容,只有把握我笔记中的内容我想你就差不多弄懂了<thinking in java>这本书的精华

    Thinking In java学习笔记

    这是我看Thinking in java 做的笔记,和大家分享下,如有不明白的的地方可与我私信,或者直接问度娘。

    Java学习笔记.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    java基础补足和thinking In Java学习.rar

    JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造...

    《Thinking+in+Java》读书笔记共38页.pd

    《Thinking+in+Java》读书笔记共38页.pdf.zip

    恒生电子JAVA笔试试题-Thinking-In-Java-Notes:ThinkinginJava学习笔记

    Java》学习笔记 [TOC] 阅读计划 章节列表 对象导论 一切都是对象 操作符 控制执行流程 初始化与清理 访问权限控制 复用类 多态 接口 内部类 持有对象 通过异常处理错误 字符串 类型信息 泛型 数组 容器深入研究 Java...

    Thinking in Java

    在学习java的适合看看!有学习笔记,经过整理的。

    Thinking_in_Java(第四版_).rar

    学习笔记

    java学习资料/笔记整理(二)

    java学习资料/笔记整理,含java语言入门中文版、JDK1.4.2手册、JSP由浅入深、Think In Java(中英文)、Thinking_in_Java_chinese_version、精通swing程序设计等8个编译的HTML帮助文档....

    windows10上安装mysql详细图文教程.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    Tomcat安装、配置和部署笔记 - 辛伯达 - 博客园.pdf

    我的学习笔记的书本课程来自于:《Thinking in Java》和《Head First Java》 视频课程主要来自于:廖雪峰老师《Java 基础课程》 如涉及版权侵犯请联系我更正。 初来乍到,文笔稚嫩,学识浅薄,请多指教。

    java日常学习资料整理

    该资源包含了本人学习java时的笔记整理,还包含华为编程规范,以及thinking in java等多方面的学习资料,对于java从业者来说javaAPI文档以及经典书目必须要读,另外为了更具实践性还附了java实验指导书,希望对于...

    String学习笔记

    自己写的java学习笔记,有完整的体系结构,有思维导图帮助理解和记忆

    5本java学习用书

    找了5本学习java的好书和一些例子代码和大家分享,希望能够对您能有所帮助。

    thinking-in-spring:春天学习笔记

    春天思考 春天学习笔记

    java软件笔试题-MyNotebook:我大学时期的笔记本

    java软件笔试题 my notebook 我的笔记本,大部分是在大二大三的时候写的笔记,对于已经毕业的来说可能比较基础甚至naive。对面临校招和实习的同学应该会有所帮助。这里将不再更新,请移步我的博客:。 part 1:...

    java-study:JAVA示例,关于并发和缓存

    [目录]用法一个包含...Thinking in Java》一书的源代码书行动中的Java并发有效的Java(第二) Java 8实战用Java思考(第四)深度JVM Java网络编程博客笔记包和类的名称设法具有描述性,但可能违反了建议的名称样式。

    thinking-in-spring:学春天

    春天学习笔记 Bean初始化 BeanDefinitionBuilder 新的GenericBeanDefinition Bean的命名(非强制性) BeanNameGenerator AnnotationBeanNameGenerator Bean的别名(一般XML配置) 别名 BeanDefinition的注册 ...

Global site tag (gtag.js) - Google Analytics