对象vs对象变量 “对象” 描述的是一个类的具体实例,他被java虚拟机分配在 "堆" (Heap)中. “对象变量” 为一个对象的引用(对象变量的值=记载着具体对象的位置/地址),他被分配在 "栈" (Stack) 上. Date birthday = new Date(); birthday - 即为对象变量,他被分配在 Stack 上,初始化的Date对象被分配在 Heap 中,如图: 方法的隐式参数 在Java中,通常将 this 关键字称为方法的隐式参数.…
1.使类和成员的可访问性最小化不指定访问级别,就是包私有.protected = 包私有 + 子类一般private不会被访问到,如果实现了Serializable,可能会泄露.反射.final集合或者数组,可以返回clone或者使用unmodifiableList等.java新增2种隐式访问级别,作为模块系统的一部分.一个模块就是一组包.模块内部,可访问性不受导出声明影响,模块中未被到导出的包在模块之外是不可访问的.2.要在公有类而非公有域中使用访问方法如果类可以在它所在的包之外进行访问,就提…
6.2 接口实例 6.2.1 接口与回调 在java.swing包中有一个Timer类,可以使用它在到达给定的时间间隔时发出通告,假如程序中有一个时钟,就可以请求每秒钟获得一个通告,以便更新时钟的表盘. 在构造定时器时,需要设置一个时间间隔,并告知定时器,当到达时间间隔时需要做些什么操作,(java将某个类的对象传递给定时器,然后的定时器调用这个对象的方法.)-----定时器需要知道调用了哪一个方法,并要求传递的对象所属的的类实现了java.awt.event包的ActionListener接口…
第13条:使类和成员的可访问性最小化 设计良好的模块的模块与设计不好的模块区别在于,设计良好的模块会隐藏所有的实现细节,把它的API与他的实现清晰地隔离开来.然后模块之间只通过API通信. 信息隐藏之所以非常重要,是因为它可以有效地解除各模块的耦合性,使这些模块可以独立地开发.测试. 类和接口有两种访问级别.包级私有和公有,包级私有就是没有任何修饰符(也有书上翻译成友好的),如果只有这个包中会调用,那么就应该把它做成包级私有的. 总而言之,应该尽可能地降低访问性.除了公有静态final域的特殊情…
6.1.2 接口不是类,不能实例化一个接口:但是可以声明接口的变量:Comparable x;    接口变量必须引用实现了接口的类对象:x = new Employee(); 检查一个对象是否属于某个特定类(instanceof); 检查一个对象是否属于某个特定的接口(instance):if (anObject instanceof  Comparable){...} 6.1.3 接口与抽象类 抽象类只能扩展一个类(单一继承): 6.1.4 静态方法 由一个字符串序列构造一个文件或目录的途径…
第四章 对象和类 类之间的关系 最常见的三种关系 依赖("uses-a") Order依赖Account类看信息 聚合("has-a") Order包含多个Item 继承("is-a") 知识点:所有Java对象都存在堆中. GregorianCalendar类所包含的方法要比Date类多得多. public避免标记实例域,public数据域允许程序中的任何方法对其进行读取和修改,这破坏了封装.强烈建议用private. 构造器和类同名 每个类中…
6.1 接口不是类,是对类的一组需求的描述,这些类需要遵守接口描述的统一格式进行定义.例如:Arrays类中sort方法(可以对对象数组进行排序)前提是对象所属的类必须实现了Comparable 接口. public interface Comparable { int compareTo(Object other) } Comparable public interface Comparable<T> { int compareTo(T other) } Comparable泛型 接口的方法…
Volume I Chapter 1  An Introduction to Java  • 1.1 Java as a Programming Platform• 1.2 The Java ‘White Paper’ Buzzwords• 1.3 Java Applets and the Internet• 1.4 A Short History of Java • 1.5 Common Misconceptions about Java 1.1  简单的介绍了Java,Java是一个很好的语…
基本语法 Java中的所有函数都属于某个类的方法 Java没有任何无符号的int.long.short 或 byte 类型 浮点数值不适用于无法接受舍入误差的金融计算中,比如2.0-1.1不会输出想要的0.9,如果不允许有任何舍入误差,应该使用BigDecimal类 建议不要在程序中使用char类型,除非确实需要处理UTF-16的代码单元,最好将字符串作为抽象数据类型处理 boolean类型:整数和布尔值之间不能相互转换 利用final指示常量,只能赋值一次,一旦被赋值后,就不能更改了 类常量:…
第21条:用函数对象表示策略 这一条其实也没说啥,就是策略模式.碰到这种场景时,定义一个策略接口,然后不同策略子类实现它,主类包含这个接口的引用就可以了. 第22条:优先考虑静态成员类 嵌套类是指被定义在另一个类的内部的类.嵌套类存在的目的应该只是为它的外围类提供服务.嵌套类包括四种:静态成员类.非静态成员类.匿名类和局部类.除了第一种之外,其他三种都被称为内部类. 听起来很绕,其实区分还是很简单的. 首先,如果没有放在方法内部,那就是成员类(根据具体情况决定要不要做成静态的).放在方法内部,那…
第19条:接口只用于定义类型 这一条就举了一个反例,说有些接口中只包含常量.这是对接口的不良使用.要实现相同的功能,应该使用不可实例化的工具类(第4条说过). public class PhysicalConstants { private PhysicalConstants() { } // Prevents instantiation // Avogadro's number (1/mol) public static final double AVOGADROS_NUMBER = 6.02…
第15条:使可变性最小化 通过一个复数类来看不可变类. public final class Complex { private final double re; private final double im; private Complex(double re, double im) { this.re = re; this.im = im; } public static Complex valueOf(double re, double im) { return new Complex(…
第17条:要么为继承而设计,并提供文档说明,要么就禁止继承 第18条:接口优于抽象类 这两条中,提到了一个很重要的概念骨架实现.也就是说,抽象类实现接口的形式.这样的好处是,接口本来不能提供默认的实现,现在可以在抽象类中实现一些关键的方法.结合了接口和抽象类的优点.例如AbstractCollection,就是一个骨架实现. 另外,在查看源码的过程中,发现居然接口中也可以有方法体了.查了一下,原来是java8的新特性,用default关键字. public interface Collectio…
java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 singleton 不知道怎么操作,觉得意义不大 单例模式 私有化构造器不能实例化,也不可被子类继承 能用原生类的就尽量不用对象 []对于所有对象都通用的方法 reflexivity 自反性 symmetry 对称性 []类成员 降低可访问性 尽量把公有域 变成私有域,并提供 访问和修改的 get se…
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理解Java虚拟机 >(周志明著)读书笔记. Java程序员一般都知道JVM中存在栈和堆的,并简单了解对象是在堆上分配的,这点从C/C++转过Java的程序员很容易想到.但Java由于其自身的特性,还有一些其他的内存区域,如下图所示: 程序计数器 程序计数器占用的内存空间不大,里面记录了各线程当前字节码的…
目录 导致线程不安全的原因 什么是线程安全 不可变 绝对线程安全 相对线程安全 线程兼容 线程对立 互斥同步实现线程安全 synchronized内置锁 锁即对象 是否要释放锁 实现原理 啥是重进入? ReentrantLock(重入锁) API层面的互斥锁 等待可中断 公平锁 锁绑定 本篇参考许多著名的书籍,形成读书笔记,便于加深记忆. 前文传送门:Java并发读书笔记:JMM与重排序 导致线程不安全的原因 当一个变量被多个线程读取,且至少被一个线程写入时,如果读写操作不遵循happens-b…
单元测试知道Java版读书笔记 首先我们必须要知道我们所写的代码,它的功能是什么,如果我们不了解代码的行为,那么也就无从测试. 我们测试的目的,是为了我们整个程序架构的稳定,代码其实就是欧文要实现功能的底层基础,如果说前一步做错了,那么可能后面所做的都是无用功.所以好的单元测试能让我们缩短工作时间 通过编译只能代表你的语法和逻辑是正确的,但是不能代表你的程序能解决所有遇到的问题. 所谓的代码正确,是具有时效性的,它只能代表你在当前这个时间点能够满足用户的需求,但是客户的需求总是在变化的,所以我们…
同学们在学习的时候经常会遇到一些问题,C++.Java.Delphi他们到底有什么不一样的呢?今天我们来比较C++.Java.Delphi声明类对象时候的相关语法.希望对大家有帮助! C++中创建对象的两种语法 在c++的类中,我如果要访问类中的成员变量或函数,有2种方法,第一种就是定义一个一个对象,如: Class A ... A aa; aa.xxx(); 另外一种就是 Class B ... B *aa = new B(); aa->xxx(); Java.C++.Delphi中创建对象…
IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要地是不能在编译时进行类型检查,编程靠运气,只有运行时在用户面前崩溃了(而且是某个特定数据.几十遍运行之后才崩溃了)才丢人地被发现. 所以最近10几年都是强调强类型的编程方式,尽量不要弱类型,尽量不要画蛇添足地去搞什么“动态”.真正好的动态程序,也是强类型的,解决了稳定性问题的. 而 .net 最初设…
Chapter 4 Classes and Interfaces Item 13: Minimize the accessibility of classes and members 一个好的模块设计会封装所有实现细节,模块之间只能通过他们公开的API进行交流.因为这些模块互不影响(loosely coupled),所以可以进行单独测试等等.所以为了封装,我们应该把每一个class或member弄得越inaccessible越好.顶层的class和interface只能是public或者defa…
Java 作为一种面向对象语言,支持以下基本概念: 多态 继承 封闭 抽象 类 对象 实例 方法 重载 对象: 是类的一个实例,有状态和行为.以人为例,黄种人.白种人.黑种人为类,每一个具体的人为类的对象. 类:   它描述一类对象的行为和状态. 软件对象的状态就是属性,行为通过方法体现. 在软件开发中, 方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成. 一个类可以包含以下类型变量: 局部变量: 在方法.构造方法或语句块中定义的变量被称为局部变量.变量声明和初始化都是在方法中,方法…
No13 使类和成员的可访问性最小化 要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.模块之间只通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况.这个概念被称为信息隐藏(infomation hiding)或封装(encapsulation),是软件设计的基本原则之一. 对于顶层的(非嵌套的)类和接口,只有两种可能的访问级别: 包级别的(package-private). 公有的(public). 对于成…
一.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的SmallTalk的五个基本特性,这些特性表现了一种纯粹的面向对象程序设计方式: 1.万物皆为对象. 奇特的变量.可以存储数据,也可以有自身的执行操作.理论上讲,你可以抽取待求解问题的任何概念化构件(狗狗.建筑物.服务等),将其表示为程序中的对象. 2.程序是对象的集合,它们通过发送消息来告知彼此所要做的.要请求一个对象,就必须发送一条消息.具体说,消息是某个特定对象的方法的调用请求. 3.每个对…
接口是什么?它是一种百分之百纯抽象的类. 什么是抽象类?即无法初始化的类.   例如,我们设计一个animal类,以此类为父类,分别设计了多种动物子类,例如Lion,Tiger,Cat,Wolf,Dog类.   Wolf aWolf = new Wolf(); Animal aHippo = new Hippo(); 以上都是正确,而下面这句代码就有问题了. Animal anim = new Animal();   注意:有些类是不应该被初始化的,就是这些类不能被"new"出来. 通…
4.1面向对象程序设计概述 OOP(面向对象编程Object Oriented Programming) OOP中数据第一位,算法第二位. 类 封装:关键在于不能让其他方法直接访问类的实例域,程序仅通过对象的方法与对象交互. 实例域:对象中的数据. 对象 对象的三个主要特性: 对象的行为:可以对对象施加哪些方法. 对象的状态:对于每个特定对象都有一组特定的实例域值,这些值的集合就是对象的当前状态. 对象标识:如何辨别具有相同行为与状态的不同对象??? 类之间最常见的三种关系 依赖(uses-a)…
第十章 对象和类   1.面向对象编程(OOP)的特性:抽象.封装和数据隐藏.多态.继承.代码的重用性. 2.指定基本类型完成了3项工作:①决定数据对象需要的内存数量.②决定如何解释内存中的位(long和float再内存中用的位数相同,但将它们转化为数值的方法不同).③决定可使用数据对象执行的操作或方法.注:对于内置类型来说,有关操作的信息被内置到编译器中.但在C++中定义用户自定义的类型时,必须自己提供这些信息. 3.使用类对象的程序都可以直接访问公有部分,但只能通过公有成员函数或友元函数来访…
java 有很多修饰类的属性的关键字:常用的static,final 说说final和static吧,平时在编程的时候,这两个关键字很多时候都觉得可有可无,最多的时候就是他们俩同时出现----定义常量的时候,其他时候:1.感觉没有对程序正常运行有任何影响 2.不使用这两个关键字看起来也没什么毛病. 这就是程序员和工程师的区别吧,迈出这一步,写出精品代码: 1.定义一个类的属性的时候,认真考虑这个属性是可变的还是所有对象通用的.将所有对象通用的属性添加static关键字. 下面来看一个实例: 判断…
关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象.又称仿函数. 听起来确实很难懂,通过搜索我找到一篇博客,作者对其是这样的描述: 如果把对象理解成指针的话,也就是说,函数对象其实就是函数指针的概念. 这是该作者通过类比法比较出来的: 我们常说java没有指针,其实java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把对象的引用与对象等同了. 在<数据结构与算…
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并发.JVM.分布式之类的.在今年面试的时候深受打击,到处都是问分布式.集群的?难道现在工作两三年的都这么牛逼了?都在搞分布式.集群之类的? 2016书单如下: 1.深入理解Java虚拟机:JVM高级特性与最佳实践---(已看,预计今年看三遍) 2.Oracle查询优化改写技巧与案例---(已看) 3…
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.接口那点事儿 (1)什么是接口? 一组函数成员而未实现的引用类型.只有类和结构能实现接口. (2)从IComparable接口看接口实例: 假设有如下一段代码,它使用Array类的一个静态方法Sort对一个未排序的int类型数组进行排序,并输出排序后的结果. using System; class Program { static void Main() { , , , , }; // Create an arra…