[转]Thinking in Java基础学习_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > [转]Thinking in Java基础学习

[转]Thinking in Java基础学习

 2012/8/21 11:13:38  ocre  程序员俱乐部  我要评论(0)
  • 摘要:浓缩即是精华。本文转自:http://blog.02ta.com/blog/java/thinking-in-java第1章对象导论继承的关系意味着有时需要在已写好的接口类中添加新方法向上转型这个词源于继承图的典型布局方式,通常基类在顶部而导出类在其下部散开.抽象类的作用是不希望任何人创建基类的实际对象,而只是希望他们将对象向上转型到基类抽象方法只能在抽象类内部创建,当该抽象类被继承时,抽象方法必须被实现,如果继承类同样为抽象类时,就不需要提供此抽象方法的实现。JAVA容器类库有List
  • 标签:学习 Java

浓缩即是精华。

本文转自:?http://blog.02ta.com/blog/java/thinking-in-java

?

?

第1章????对象导论

?

继承的关系意味着有时需要在已写好的接口类中添加新方法

向上转型这个词源于继承图的典型布局方式,通常基类在顶部而导出类在其下部散开.

抽象类的作用是不希望任何人创建基类的实际对象,而只是希望他们将对象向上转型到基类

抽象方法只能在抽象类内部创建,当该抽象类被继承时,抽象方法必须被实现,如果继承类同样为抽象类时,就不需要提供此抽象方法的实现。

JAVA容器类库有List ,Map ,Set等,并使用迭代器来操作容器中的元素,java1.0,1.1使用Enumeration作为标准迭代器,java2增加了一个更完备的迭代器Iterator ;

不同的容器对于某些操作具有不同的效率,如两种List ,ArrayList和LinkedList,ArrayList在随机访问时是使用固定的时间,LinkedList随机选取元素需要在列表中移动,这种代价是高昂的,访问越靠近表尾的元素花费时间越长,另一方面如果在序列中插入一个元素时LinkedList的开销却比ArrayList 要小

Java是单根继承,所有类都最终继承自单一的基类Object

容器只存储Object类型,所以在存入时需要向上转型,因此他会丢失其身份,我们知道向上转型是安全的,当他取出时就得到了Object对象的引用,就需要向下转型为更具体的类型,一般来说向下转型是危险的,但JAVA提供了运行时异常,向下转型错误时就会抛出类型转换异常

Java是在堆的内存池中动态的创建对象,这种方式运行时才知道要多少对象,生命周期如何,具体类型是什么,C++是在堆栈或静态存储区域内,这种方式需要在编程时知道对象的确切数量,生命周期和类型

Java提供轻量级持久性即对象序列化.

2009-3-1

?

第2章????一切都是对象

?

1寄存器是最快的存储区在处理器内部,2堆栈位于通用RAM速度仅次于寄存器,Java的某些数据存储于堆栈中特别是对象引用,Java对象存放于堆中,3堆是种通用的内存池位于RAM区,4静态存储里存放程序运行时一直存在的数据也在RAM里,一般用static标识的某个对象的特定元素是静态的,Java对象从来不会存放在静态存储空间.,5常量存储通常直接存放在程序代码内部,6非RAM存储像基本的两个例子“流对象”,“持久化对象”,在流对象中对象转化成字节流,通常被发送给另一台机器,在持久化对象中对象被存放于磁盘上

(流对象是一种存储机制吗?)

Java提供了两个高精度计算的类:BigInteger和BigDecimal.BigInteger可以准确的表示任何大小的整数值,而不会丢失任何信息,BigDecimal支持任何精度的定点数,可以用它进行精确的货币计算

当类的某个数据成员是基本数据类型时,即使没初始化,Java也会确保它获得一个默认值,但是在方法内部定义的变量就算是基本数据类型,java也不为其赋初始值.

2009-3-2

?

第3章????控制程序流程

?

对象等价性比较,关系caozuofu.html" target="_blank">操作符==和!=适用于所有对象,而==和!=比较的是对象引用是否相同,equals()比较的是两个对象实际内容是否一致. equals默认比较的是对象引用

Math.random()输出值范围是[0,1),0<= Math.random()<1

2009-3-3

?

第4章????初始化与清理

?

JAVA使用构造器确保对象初始化,构造器与类同名是为了让编译器知道调用哪个方法来初始化对象

在同一个类中有多个名称相同且有不同的参数类型列表时就叫方法重载

方法重载时,如果果传入的数据类型(实际参数类型)“小于”方法中声名时的形式参数类型,实际数据类型就会被“提升”如实参(5),形参(long x),对于char型参数是直接提升至int型,当“大于”时编译器将无法自动识别,只能做强制类型转换.

This指当前对象的引用,一般在方法内部使用,return this;返回对当前对象的引用,在构造器中调用构造器this(params)将产生符合此参数列表的明确调用,但必须将构造器调用置于最起始处,否则编译报错, 除构造器外编译器禁止在其它任何方法中调用构造器

Java对象在堆上,通过垃圾回收器一面回收空间,一面使堆中的对象紧凑排列,这样“堆指针”就很容易的移动到下一个分配区域,实现了一种高速的,有无限空间可供分配的堆模型,C++是在堆栈上查找可用空间,其开销是大的

JAVA虚拟机采用“自适应”工作模式,“停止-复制”,暂停程序,将存活的对象从一个堆复制到另一个堆,没有被复制的全是垃圾,“标记-清扫”思路是从堆栈和静态存储区出发,遍历所有引用,进而标记所有存活对象,在标记工作完成时才会清理释放没有被标记的对象,这样下来堆空间将不是连续的

初始化顺序是先静态后非静态

当数组长度不确定时的定义方法Integer [] x=new Integer[]{1,2,3,}

2009-3-4

?

第5章???隐藏具体实现

一个java文件中可以有多个类,但只有一个public 类,在编译有多个类的JAVA文件时,每个类都会输出一个.class的文件.

Package 必须是java文件中除注释以外的第一句代码.

在一个类中如果将构造器定义为私有,那只能定义一个static方法来返回该对象的引用,常见于单立模式singleton中.

2009-3-4

?

第6章???复用类

?

通过构造器初始化导出类时,会先初始化基类通过基类的默认构造器,当需要初始化基类的有参构造器时可以使用super(params)的形式。

一般情况下“is-a”(是一个)的关系是用继承来表达,而“has-a”(有一个)的关系是用组合来表达,像”车子”,”交通工具”,车子是一种交通工具,车子可以继承交通工具从而更加特殊化.

如导出类覆盖了基类的方法t(),向上转型基类对象Parent p=newSub();p.t()将是调用子类方法

当对对象引用运用final时,一旦引用被初始化指向一个对象,就无法最把它指向另一个对象,而对象自身是可以被修改的

方法用final修饰,其作用是:1.想要确保在继承中使方法行为保持不变,并且不会被覆盖.2. 是方法调用上性能的提高,编译器将针对此种方法的所有调用都转为内嵌调用。

(什么是内嵌调用)

当用final修饰类时,表示该类不能被继承,或者说你对该类的设计永不需要做任何变动,或者出于安全考虑,你不希望它有子类,

Java1.x>Java 2?????? Vector >ArrayList?????? , ?Hashtable>HashMap

在直接调用static 方法时会产生初始化动作.顺序是:基类的静态成员,导出类的静态成员,基类成员, 基类构造器,导出类成员, 导出类构造器,方法程序块

向上转型是OOP中多态的一种重要表现,

2009-3-5

?

第7章???多态

?

在初始化时,基类的构造器肯定在导出类之前运行,并且按照继承层次逐渐向上链接,这样可以确保在进入导出类构造器时,基类中可供我们访问的成员都已得到初始化.销毁时的顺序应该和初始化相反

在基类构造器中调用被覆盖的方法,应该注意此时的导出类构造器和非静态成员都还没有进行初始化,在基类构造器中最好只调用被private ,final修饰的方法,这些方法不可能被覆盖,也就不需要考虑上面那一点.

多态意味着”不同的形式”,继承于同一个基类的导出类,他们有相同的接口,各导出类也可以覆盖这些接口的行为实现,在向上转型时更是能够使用动态绑定(后期绑定)的方法,来正确定位接口的实现.多态也只能在继承和抽象中体现出来.简单地说就是一个接口,多种实现

Java中除了static ,private ,final修饰的方法外,其他所有方法都是后期邦定,如果不是后期邦定,就不是多态。当一个方法能被覆盖,才有后期邦定,而static ,private ,final修饰的方法不能被覆盖。

2009-3-6

?

第8章???接口与内部类

?

接口中的方法只能被public修饰,不加修饰默认是public访问权限,因为接口中的方法必须被实现, 所以声明private是没有论何意义的,

接口与抽象类的区别,接口不允许有成员变量和方法的实现,而抽象类可以有成员变量和具体的方法定义.

接口是一种很便捷的用来创建常量组的工具,因为接口中的字段都是默认,public static final的,这天生就是常量定义.

Java的内部类可以有效解决”多重继承”问题,

java内部类,有:静态内部类,非静态内部类,局部内部类,匿名内部类四种。内部类可以声明为private或protected,普通类只能被赋予public

非静态内部类初始化时,需要外围类对象实例,如:

OuterClass outer=newOuterClass();

outer.new InnerClass().method();

外围类实例也会隐式的传给非静态内部类,因此非静态内部类可以访问外围类所有成员包括私有,但不能使用static修饰非静态内部类成员

静态内部类不需要外围类实例,如:

newOuterClass.InnerClass().method();

静态内部类只能访问外围类的static 成员,也可以显示的在静态内部类使用new OuterClass().field(可以是私有)来手工建立外围类实例引用,但这需要消耗同非静态内部类更多的时间和空间,

匿名类没有类名,也就没有构造方法,所以只能在它们被声明的时候实例化

匿名类和局部类只有在非静态环境中定义的时候才有外围实例,也不能包含静态成员.

如果内部类的每个实例,都需要一个指向外围实例的引用,就要把内部类做成非静态的,否则做成静态的,假设这个内部类在方法内,如果你只需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就要把它做成匿名类,否则就做成局部内

2009-3-6

2009-11-29update

?

第9章???通过异常处理错误

?

Throwable是Exception的基类

在捕获到异常后,再throw e.fillInStackTrace()重新抛出异常时,将修改调用栈上的原始抛出点信息,为新抛出点有关的信息

?

第10章泛型

?

多态与泛型不冲突,

Java泛型的一个局限性:基本类型无法作为类型参数

Java泛型主要是为了编译时类型检查,在生成字节码时已经将类型信息进行擦除了

Java SE5具备了自动打包和自动拆包的功能,可以很方便地在基本类型和其相应的包装器类型之间进行转换

泛型方法可以不需要泛型类的支持,

如:

publicclassTest {

????publicstatic<T> T test(T a){

???????returna;

??? }

}

泛型方法与可变参数列表能够很好地共存:

泛型还可以应用于内部类以及匿名内部类

,Class.getTypeParameters()将“返回一个TypeVariable对象数组,该对象数组不是参数类型而是用作参数占位符的标识符, 泛型代码内部,无法获得任何有关泛型参数类型的信息.

Java泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型信息都被擦除了,你唯一知道的就是你在使用一个对象。因此List<String>和List<Integer>在运行时事实上是相同的类型,这两种形式都被擦除成它们的“原生”类型,即List。

泛型边界<T extends Testclass>声明T必须具是类型Testclass或者从Testclass导出的类型

?

第11章集合

?

1.Collection

List 必须保持元素特定的顺序,Set 不能有重复元素.

List实际有两种类型,ArrayList 优点随机访问元素,LinkedList优化了顺序访问,插入或移除的开销不大,随机访问相对较慢

Set 有HashSet 快速查找对象,TreeSet 底层为树结构,可以从Set中提取有序的序列,LinkedHashSet具有HashSet的查询速度,内部使用链表维护元素的顺序,在迭代时结查按元素插入顺序显示

2.Map

Map是一组成对的”键值对”对象.

Map 包括:HashMap,TreeMap,LinkedHashMap(基于”最近最少使用”LRU),

JAVA集合里只能存放Object类型对象,基本类型存入集合时java会自动打包成其包装器类型,

?

第12章模式

?

工厂模式,就是在工厂类中new 对象,在需要对象的时候从工厂里拿,而不在每次使用的时候就new一个,

工厂模式就是用来生产对象的

工厂方法模式

抽向工厂模式解决一个问题有多种方法,每一种方法需要多种不同的工具,这时可以使用抽向工厂模式

?

第13章ClassLoader\

?

BootstrapClassLoader,load核心JAVA类,第一个被加载的Classloader,再通过它Load级别更小的ClassLoader

ExtClassLoader,load\jdk1.6.0_07\jre\lib\ext

AppClassLoader,load用户写的类

ClassLoader在Load Class时首先会找上层是否以经Load过这个Class,如果Load过就不再重复Load

?

?

第14章??? EJB的了解

?

1.EJB会话BEAN ,分为有状态无状态会话BEAN,有状态的是客户端在每次lookup时创建一个BEAN的实例,无状态的是EJB容器直接创建一个实例池所有客户端共享实例池中的对象,会话BEAN还有远程与本地之分,本地是指客户端与会话BEAN在同一个应用服务器,直接从内存中与BEAN实例交互,远程的话一般是在不同的应用服务器,在调用EJB的这一过程存在对象序列化,协议解释,TCP/IP通信等分布式对象协议开销.

使用注释来定义JNDI名称会带来移值问题,因此建议使用ejb-jar.xml部署描述文件进行定义该文件必须放置在jar的META-INF目录下.

EJB会话BEAN可对其进行权限验证,拦截,注入

2.EJB实体BEAN

发表评论
用户名: 匿名