Thinking In Java
文章平均质量分 68
Thinking In Java 阅读笔记
进击的巨蟹
还在学习
展开
-
Thinking In Java -- Chapter 15 -- 泛型
Java泛型的核心概念:告诉编译器想使用什么类型,然后编译器帮你处理一切细节。 //: generics/Holder3.javapublic class Holder3<T> { private T a; public Holder3(T a) { this.a = a; } public void set(T a) { this.a = a; } public T get() { return a; } public static void main(String原创 2021-03-22 22:43:42 · 122 阅读 · 0 评论 -
Thinking In Java -- Chapter 14 -- 类型信息
运行时类型信息使得你可以在程序运行时发现和使用类型信息。 那么Java是如何让我们在运行时识别对象和类的信息的呢?主要有两种方式:一种是传统的RTTI,它假定我们在编译时已经知道了所有的类型;一种是“反射”机制,它运行我们在运行时发现和使用类的信息。 迄今为止,我们已知的RTTI形式包括:传统的类型转换,如“(shape)”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException;代表对象的类型的Class对象,通过查询Class对象可以获取运行时原创 2021-03-21 23:13:28 · 105 阅读 · 0 评论 -
Thinking In Java -- Chapter 13 -- 字符串
不可变StringString对象是不可变的,String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。格式化输出在Java中,所有新的格式化功能都由Formatter类处理,可以将Formatter看做一个翻译器,它将你的格式化字符串与数据翻译成需要的结果。 String.format()是一个static方法,它可以用来生成格式化的String对象。扫描输入Java SE5新增了S原创 2021-03-18 23:33:54 · 92 阅读 · 0 评论 -
Thinking In Java -- Chapter 12 -- 通过异常处理错误
异常链:常常会想要在捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来,这被称为异常链。 现在所有Throwable的子类在构造器中都可以接受一个cause对象作为参数。这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常初始发生的位置。Java标准异常:Throwable这个java类被用来表示任何可以作为异常被抛出的类。Throwable对象分为两个类型(指从Throwable继承而得到的类型):原创 2021-03-17 23:01:29 · 81 阅读 · 0 评论 -
Thinking In Java -- Chapter 11 -- 持有对象
迭代器:迭代器的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。例如,Java的Iterator()(只能单向移动)可以用来:使用方法Iterator()要求容器返回一个Iterator。Iterator将准备返回序列的第一个元素。 使用next()获得序列的下一个元素。 使用hasNext()检查序列中是否还有元素。 使用remove()将迭代器新近返回的元素删除。先看下例://: holding/SimpleIteration.javaimport t原创 2021-03-15 22:49:59 · 89 阅读 · 0 评论 -
Thinking In Java -- Chapter 10 -- 内部类
链接到外部类:当生成一个内部类的对象时,此对象与制造它的外部对象之间就有了一种联系,所以它能访问其外围对象的所有成员,而不需要任何特殊条件。此外,内部类还拥有其外围类的所有元素的访问权。 内部类对象拥有对其外围类对象所有成员的访问权,这个是怎么实现的呢?当某个外围类的对象创建一个内部类对象时,此内部类对象必定会秘密的捕获一个指向那个外围类对象的引用。然后,在你访外围对象的成员时,就是在用这个引用来选择外围类的成员。那现在我们知道:内部类的对象只有只有与外围类的对象相关联的情况下才能被创建(就像你应该看原创 2021-03-11 23:23:31 · 131 阅读 · 3 评论 -
Thinking In Java -- Chapter 9 -- 接口
抽象类和抽象方法:抽象类是普通的类和接口之间的一种中庸之道。我们创建抽象类是希望通过这个通用接口操纵一系列类。抽象类中方法不一定都是抽象方法。我们可能会创建一个没有任何抽象方法的抽象类。 创建抽象类和抽象方法非常有用,因为它们可以使类的抽象性明确起来,并告诉用户和编译器打算怎样来使用它们。抽象类还是很有用的重构工具,因为它们使得我们可以很容易将公共方法沿着继承层次结构向上移动。接口:接口是极度抽象的类,它没有提供任何具体实现,它允许创建者确定方法名,返回类型,参数列表,但是没有任何方法体。接口也原创 2021-03-10 22:49:09 · 118 阅读 · 0 评论 -
Thinking In Java -- Chapter 8 -- 多态
域与静态方法:只有普通方法的调用可以是多态的,域的访问操作不是多态的。如下例: //: polymorphism/FieldAccess.java// Direct field access is determined at compile time.class Super { public int field = 0; public int getField() { return field; }}class Sub extends Super { public int f原创 2021-03-09 23:18:50 · 136 阅读 · 0 评论 -
Thinking In Java -- Chapter 7 -- 复用类
继承语法:为了继承,一般的规则是将所有的数据成员定义成private,将所有的方法指定成public成员。 继承类如果对超类中的方法进行了修改,而又想使用超类中未被修改的方法,可以通过”super.”后面添加超类的方法名来调用。 当创建一个导出类的对象时,该对象包含一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者区别在于,后者来自于外部,而基类的子对象被包装在导出类的对象内部。Java会自动在导出类的构造器中插入对基类构造器的调用。即使你在导出类中不为基类创建构造器,编译器也会为你原创 2021-03-07 23:25:09 · 111 阅读 · 1 评论 -
Thinking In Java -- Chapter 6 -- 访问权限控制
包:库单元如果我创建了一个工具库,库中有一个工具类Print,在类中,通过public 加 static的形式定义了一些方法,那么通过静态导入后,就可以直接使用此方法,如下例是创建的工具类:package net.mindview.util;import java.io.*;public class Print { //print with a new line public static void print(Object obj) { System.out原创 2021-03-06 00:09:26 · 120 阅读 · 3 评论 -
Thinking In Java -- Chapter 5 -- 初始化与清理
方法重载:区分重载方法的规则很简单,每个重载的方法都必须有一个独一无二的参数类型列表。参数顺序的不同,也足以区分两个方法,但是一般情况下别这么做,这样会使代码难以维护。 关于参数是基本类型(char,byte,short,int,long,float,double)的重载,如果传入的数据类型小于方法中声明的形式参数类型,实际数据类型就会被提升。char略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升到int型。如果传入的实际参数大于重载方法声明的形式参数,就得通过类型转化来执行原创 2021-03-05 00:04:58 · 120 阅读 · 2 评论 -
Thinking In Java -- Chapter 4 -- 控制执行流程
逗号操作符:Java中唯一用到逗号操作符的地方就是for循环的控制吧表达式。在控制表达式的初始化和步进控制部分,可以使用一系列由逗号分隔的语句,而且那些语句均会独立执行。初始化部分可以有任意数量的同一类型的定义。标签:在java中,需要使用标签的唯一理由就是因为循环嵌套存在,而且想从多重嵌套中break或continue。一般的continue会退回最内层循环的开头,并继续执行 带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环 一般的break会中断并跳出当前原创 2021-03-03 23:01:55 · 103 阅读 · 1 评论 -
Thinking In Java -- Chapter 3 -- 操作符
赋值:基本类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值时,是直接将一个地方的内容复制到了另一个地方。比如,对基本数据类型使用a=b,那么b的内容就复制给了a,这样即使a中的内容发生修改,b也不会受到这种修改的影响。 但是对对象进行赋值的时候,情况却发生了变化。对一个对象进行操作时,我们真正操作的是对对象的引用。所以,倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方,这意味着倘若对对象使用 c=d,那么c和d都指向原本只有d指向的那个对象。Random类原创 2021-03-02 23:13:05 · 74 阅读 · 0 评论 -
Thinking in Java -- Chapter 2 -- 一切都是对象
对象的创建:堆栈中存储的是对象引用,java系统需要知道堆栈中所有项的生命周期,以便上下移动堆栈指针来分配内存或是释放内存(堆栈指针向下分配内存,向上释放内存)。----RAM 存储 堆用于存放所有的java对象,编译器不需要知道存储的数据在堆中存活了多长时间。当代码执行到new时,会在堆中进行存储分配。但是堆中进行存储分配和清理要比堆栈中需要更多的时间。---RAM 存储 常量值一般直接存储在程序代码内部。--- 有时会存储在ROM中 如果数据完全存活在程序之外,那么它可以不受程序的任何控.原创 2021-03-01 22:52:40 · 128 阅读 · 4 评论 -
java对象赋值的“别名”问题
在对一个对象进行操作时,我们操作的实际是对对象的引用。所以倘若是“将一个对象赋值给另一个对象”,实际是将引用从一个地方复制到了另一个地方。这意味着,假如对对象使用 c = d ,那么c和d都是指向原本只有d指向的哪个对象。这个现象在方法调用中也很常见,将一个对象传递给方法时,也会产生“别名问题”,如下面的一段代码:class Letter{ char c ;}public c原创 2017-08-04 14:05:21 · 764 阅读 · 0 评论 -
关于static关键字的一些学习
static关键字原创 2017-08-04 11:12:57 · 205 阅读 · 0 评论 -
java对象的作用域问题
Java对象不具备和基本类型一样的什么周期。例如下面这段代码: { String s = new String("a string"); }引用s在作用域终点就消失了,然而,s所指向的String对象仍继续占据内存空间。事实证明,有new创建的对象,只要你需要。就会一直保留下去。那么这就会带来一个有趣的问题,如果Java让对象一直存在,那么靠什么才能防止这些对象原创 2017-08-03 14:56:53 · 737 阅读 · 0 评论 -
java中的 continue 和 break
java中的continue和break原创 2017-08-08 16:17:12 · 350 阅读 · 0 评论