=Start=
缘由:
作为一个Java编程新手,整理一下在学习《Java核心技术 卷I:基础知识》时的笔记,方便以后回顾和参考。
正文:
参考解答:
- 封装:Java中所有的代码都放在了类中,从形式上来看只是将变量和方法放在了一起,但是推荐将所有的变量都用private修饰,只允许类内部的方法进行修改,这样一层封装确保了数据不会被随意修改,使大型项目的排错更容易。
- 继承:可以通过继承这种方式在超类的基础上丰富子类的功能。同时也达到了代码复用的效果。
- 重载:同一个方法名,根据参数的不同,由编译器来决定实际该调用哪个方法。
- 多态:一个Employee类变量除了可以指代Employee对象之外,还可以指代基于Employee类派生出的Manager类的变量。
第1章 Java程序设计概述
- ……
- 1.3 Java applet与Internet
- 在网页中运行的Java程序被称为applet
- 1.4 Java发展简史
- ……
第2章 Java程序设计环境
- ……
- 2.3 使用命令行工具
- javac和java
- ……
- 2.6 建立并运行applet
第3章 Java的基本程序设计结构
- 3.1 一个简单的Java应用程序
- Java对大小写敏感
- 3.2 注释
- ……
- 3.6 字符串
- 3.6.1 子串
- 3.6.2 拼接
- 3.6.3 不可变字符串
- 3.6.4 检测字符串是否相等
- 3.6.5 空串与Null串
- ……
- 3.6.9 构建字符串
- 3.7 输入输出
- 3.7.1 读取输入
- 3.7.2 格式化输出
- 3.7.3 文件输入与输出
- ……
- 3.10 数组
- 3.10.1 for each循环
- 3.10.2 数组初始化以及匿名数组
- 3.10.3 数组拷贝
- 3.10.4 命令行参数
- ……
第4章 对象与类
- 4.1 面向对象程序设计概述
- 面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。
- 在OOP中,不必关心对象的具体实现,只要能够满足用户的需求即可。
- 4.1.1 类
- 用Java编写的所有代码都位于某个类的内部
- 在扩展一个已有的类时,这个扩展后的新类具有所扩展的类的全部属性和方法
- 4.1.2 对象
- 4.1.3 识别类
- 首先从设计类开始,然后再往每个类中添加方法。
- 识别类的简单规则是:在分析问题的过程中寻找名词,而方法对应着动词。
- 4.1.4 类之间的关系
- 依赖(”uses-a”):应该尽可能的将相互依赖的类减至最少!!!
- 聚合(”has-a”)
- 继承(”is-a”)
- 4.2 使用预定义类
- 4.2.1 对象与对象变量
- 构造器是一种特殊的方法,用来构造并初始化对象。构造器的名字应该与类名相同。
- 一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
- 在Java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。
- 4.2.2 Java类库中的Gregorian-Calendar类
- 4.2.3 更改器方法与访问器方法
- 4.2.1 对象与对象变量
- 4.3 用户自定义类
- 要想创建一个完整的程序,应该将若干类组合在一起,其中只有一个类有main方法。
- 类文件(.java文件)名必须与public类的名字相匹配。
- 在一个源文件中,只能有一个公有类,但可以有任意数目的非公有类。
- 4.3.1 Employee类
- 域(变量)
- 构造函数
- 方法
- 4.3.2 多个源文件的使用
- 4.3.3 剖析Employee类
- 4.3.4 从构造器开始
- 构造器与类同名;
- 每个类可以有一个以上的构造器;
- 构造器可以有0个、1个或多个参数;
- 构造器没有返回值;
- 构造器总是伴随着new操作符一起调用。
- 4.3.5 隐式参数与显式参数
- 第一个参数称为隐式(implicit)参数——关键字this,隐式参数没有出现在方法声明中。
- 4.3.6 封装的优点
- 第一:限定了可以修改内部变量的方法;
- 第二:更改器方法可以执行错误检查。
- 4.3.7 基于类的访问权限
- 4.3.8 私有方法
- 4.3.9 final实例域
- 4.4 静态域与静态方法
- 4.4.1 静态域(静态变量)
- 4.4.2 静态常量
- 4.4.3 静态方法
- 4.4.4 工厂方法
- 4.4.5 main方法
- 4.5 方法参数
- Java总是采用按值调用(call by value)。
- Java对对象采用的不是引用调用,实际上,对象引用进行的是值传递。
- 4.6 对象构造
- 4.6.1 重载
- 如果有多个方法有相同的名字、不同的参数,便产生了重载。
- 4.6.2 默认域初始化
- 4.6.3 无参数的构造器
- 4.6.4 显式域初始化
- 4.6.5 参数名
- 4.6.6 调用另一个构造器
- 4.6.7 初始化块
- 4.6.8 对象析构与finalize方法
- 4.6.1 重载
- 4.7 包
- Java使用包(package)将类组织起来。使用包的主要原因是确保类名的唯一性。
- 4.7.1 类的导入
- 4.7.2 静态导入
- 4.7.3 将类放入包中
- 如果没有在源文件中放置package语句,这个源文件中的类就被放置在一个默认包(default package)中。
- 4.7.4 包作用域
- 4.8 类路径
- 4.9 文档注释
- 4.9.1 注释的插入(javadoc)
- 4.9.2 类注释
- 4.9.3 方法注释
- 4.9.4 域注释
- 4.9.5 通用注释
- 4.9.6 包与概述注释
- 4.9.7 注释的抽取
- 4.10 类设计技巧
- 一定要保证数据私有(private)
- 一定要对数据初始化
第5章 继承
- 利用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。
- 5.1 类、超类和子类
- 关键字extends表示继承。已存在的类称为 超类(super class)、基类(base class)或父类(parent class);新类称为 子类(sub class)、派生类(derived class)或孩子类(child class)。
- 一个对象变量可以指示多种实际类型的现象被称为多态(polymorphism)。
- 在运行时能够自动的选择调用哪个方法的现象被称为动态绑定(dynamic binding)。
- 5.1.1 继承层次
- 5.1.2 多态
- 在Java中,对象变量是多态的。一个Employee变量既可以引用一个Employee类对象,也可以引用一个Employee类的任何一个子类的对象(例如:Manager、Executive等)
- 5.1.3 动态绑定
- 5.1.4 阻止继承:final类和方法
- 不允许扩展的类被称为final类。
- 类中的特定方法也可以被声明为final。如果这样做,子类就不能覆盖这个方法(final类中的所有方法自动地成为final方法)。
- 将方法或类声明为final的主要目的是:确保它们不会在子类中改变语义。
- 5.1.5 强制类型转换
- 5.1.6 抽象类
- 为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的。
- 抽象方法充当着占位的角色,它们的具体实现在子类中。
- 类即使不含抽象方法,也可以将类声明为抽象类。抽象类不能被实例化。(实例化可以简单的认为是用new关键字进行的)
- 5.1.7 受保护访问
- 5.2 Object:所有类的超类
- Object类是Java中所有类的始祖,在Java中每个类都是由它扩展而来的。
- 5.2.1 equals方法
- 5.2.2 相等测试与继承
- 5.2.3 hashCode方法
- equals与hashCode的定义必须一致:如果 x.equals(y) 返回 true ,那么 x.hashCode() 就必须与 y.hashCode() 具有相同的值。
- 5.2.4 toString方法
- 5.3 泛型数组列表
- ArrayList是一个采用类型参数(type parameter)的泛型类(generic class)。
- 5.3.1 访问数组列表元素
- 5.3.2 类型化与原始数组列表的兼容性
- 5.4 对象包装器与自动装箱
- 有时,需要将 int 这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。例如,Integer类对应基本类型int。通常,这些类被称为包装器(wrapper)。
- 比如 list.add(3) 这个调用将自动的变换成 list.add(Integer.valueOf(3)) ,这种变换被称为自动装箱(auto boxing)。
- 5.5 参数数量可变的方法
- System.out.printf()
- 5.6 枚举类
- 5.7 反射
- 反射是指在程序运行期间发现更多的类及其属性的能力。
- 5.7.1 Class类
- Employee e; Class cl = e.getClass();
- 5.7.2 捕获异常
- 5.7.3 利用反射分析类的能力
- 5.7.4 在运行时使用反射分析对象
- 5.7.5 使用反射编写泛型数组代码
- 5.7.6 调用任意方法
- 5.8 继承设计的技巧
- 将公共操作和域放在超类
- 不要使用受保护的域
- 使用继承实现 “is-a” 关系
- 使用多态,而非类型信息
- 不要过多的使用反射
第6章 接口与内部类
- 首先,接口是一种技术;其次,这种技术主要用来描述类具有什么功能,而并不给出每个功能的具体实现。
- 6.1 接口
- 在Java中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。
- 6.1.1 接口的特性
- 接口不是类,尤其不能使用new运算符实例化一个接口!
- 尽管每个类只能够拥有一个超类,但却可以实现多个接口。这就位定义类的行为提供了极大的灵活性。
- 6.1.2 接口与抽象类
- 为什么有了抽象类之后还要有接口?因为用抽象类表示通用属性存在这样一个问题:每个类只能扩展于一个类。尽管每个类只能够拥有一个超类,但却可以实现多个接口,这样类的定义就比较灵活。
- 6.2 对象克隆
- 6.3 接口与回调
- 回调(callback)是一种常见的程序设计模式。在这种模式中,可以指出某个特定事件发生时该采取的动作。
- 6.4 内部类
- 6.4.1 使用内部类访问对象状态
- 6.4.2 内部类的特殊语法规则
- 6.4.3 内部类是否有用、必要和安全
- 6.4.4 局部内部类
- 6.4.5 由外部方法访问final变量
- 6.4.6 匿名内部类
- 6.4.7 静态内部类
- 6.5 代理
- 利用代理可以在运行时创建一个实现了一组给定接口的新类。这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。
- 所有的代理类都扩展于Proxy类。
- 代理类一定是public和final。
第10章 部署应用程序和applet
- 10.1 JAR文件
- 10.1.1 清单文件
- 除了类文件、图像和其它资源外,每个jar文件还包含一个用于描述归档特征的清单文件
- 清单文件被命名为MANIFEST.MF,它位于jar文件的一个特殊 META-INF 子目录中
- 10.1.2 可运行JAR文件
- 10.1.3 资源
- 10.1.4 密封
- 10.1.1 清单文件
- 10.2 Java Web Start
- 10.2.1 沙箱
- 10.2.2 签名代码
- 10.2.3 JNLP API
- 10.3 applet
- 10.3.1 一个简单的applet
- applet是一种包含在HTML网页中的Java应用程序
- 10.3.2 applet的HTML标记和属性
- 10.3.3 object标记
- 10.3.4 使用参数向applet传递信息
- 10.3.5 访问图像和音频文件
- 10.3.6 applet上下文
- 10.3.1 一个简单的applet
- 10.4 应用程序首选项存储
- 10.4.1 属性映射
- 10.4.2 Preferences API
第11章 异常、断言、日志和调试
- 11.1 处理错误
- 11.1.1 异常分类
- 在Java中,异常对象都是派生于Throwable类的一个实例
- 所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception
- Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误,应用程序不应该抛出这种类型的对象,如果遇到了,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了;
- Exception层次结构是在编码时需要重点关注的,它又分为两个分支:一个是RuntimeException(如果出现RuntimeException异常,那么就一定是你的问题),另一个是其它异常;
- 由程序错误导致的异常属于RuntimeException,包含下面几种情况:
- 错误的类型转换
- 数组访问越界
- 访问空指针
- Java语言规范将派生于Error类或RuntimeException类的所有异常称为「未检查异常」,所有其它的异常称为已检查异常。
- 11.1.2 声明已检查异常
- 一个方法不仅需要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误。
- 方法应该在其首部声明所有可能抛出的异常。这样可以从首部反映出这个方法可能抛出哪类已检查异常。
- public FileInputStream(String name) throws FileNotFoundException, EOFException
- public FileInputStream(String name) throws Exception
- 总之,一个方法必须声明所有可能抛出的「已检查异常」,而「未检查异常」要么不可控制(Error),要么就应该避免发生(RuntimeException)。
- 11.1.3 如何抛出异常
- throw new EOFException();
- EOFException e = new EOFException(); throw e;
- 11.1.4 创建异常类
- 定义一个派生于Exception的类,或者派生于Exception子类的类。
- 11.1.1 异常分类
- 11.2 捕获异常
- 如果某个异常发生的时候没有在任何地方进行捕获,那程序就会终止执行,并在控制台上打印出异常信息,其中包括异常的类型和堆栈的内容。
- 如果调用了一个抛出已检查异常的方法,就必须对它进行处理,或者将它继续进行传递。
- 11.2.1 捕获多个异常
- 11.2.2 再次抛出异常与异常链
- 11.2.3 finally子句
- 11.2.4 带资源的try语句
- 11.2.5 分析堆栈跟踪元素
- 11.3 使用异常机制的技巧
- 异常处理不能替代简单的测试
- 不要过分的细化异常
- 利用异常层次结构
- 不要压制异常
- 在检测错误时,「苛刻」要比放任更好
- 不要羞于传递异常
- 11.4 使用断言
- 11.4.1 启用和禁用断言
- 11.4.2 使用断言完成参数检查
- 11.4.3 为文档假设使用断言
- 11.5 记录日志(Logger)
- 11.5.1 基本日志
- 11.5.2 高级日志
- 11.5.3 修改日志管理器配置
- 11.5.4 本地化
- 11.5.5 处理器
- 11.5.6 过滤器
- 11.5.7 格式化器
- 11.5.8 日志记录说明
- 11.6 调试技巧
- 打印变量的内容System.out.println()
- 在每一个类中放置一个main方法,这样就可以对每一个类进行单元测试
- JUnit
- 日志代理(logging proxy)
- 利用Throwable类提供的printStackTrace方法,可以从任何一个异常对象中获得堆栈情况
- 利用printStackTrace(PrintWriter s)将堆栈跟踪发送到一个文件中
- 将错误信息单独保存在一个文件在(java myprogram 2>errors.txt)
- 观察类的加载过程(在启动时添加 -verbose 选项)
- 使用-Xlint选项对代码问题进行检查
- 使用jconsole
- 使用jmap
- 使用-Xprof选项
- 11.7 GUI程序排错技巧
- 11.8 使用调试器
- 断点
- 单步跟踪
参考链接:
=END=
《 “Java基础学习_2” 》 有 19 条评论
JAVA字符串格式化-String.format()的使用
http://blog.csdn.net/lonely_fireworks/article/details/7962171/
Java魔法堂:String.format详解
http://www.cnblogs.com/fsjohnhuang/p/4094777.html
Java String.format()的对于int,long
http://bosshida.iteye.com/blog/898409
http://blueram.iteye.com/blog/441683
`
今天用String.format(format, args)方法,
format: “this num %l is long”,args是一个long数
但运行有错,抛java.util.UnknownFormatConversionException,查了一下才知道,
原来%d是包括了int,long,byte等等类型了,
format:”this num %d is long”就行了。
`
java中,如何计算一个方法所耗费的时间秒数?
http://blog.csdn.net/wer724853863/article/details/52232808
`
long startTime=System.currentTimeMillis();//记录开始时间
method();//此处为你调用的方法
long endTime=System.currentTimeMillis();//记录结束时间
System.out.println(String.format(“执行时间:%d ms”, endTime-startTime));
float excTime=(float)(endTime-startTime)/1000;
System.out.println(“执行时间:”+excTime+”s”);
`
Java HashMap工作原理及实现
https://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/
java中HashMap详解
http://blog.csdn.net/caihaijiang/article/details/6280251
如何看待代码中滥用HashMap?
https://www.zhihu.com/question/28119895
Java中HashMap判断某个key是否存在?
https://stackoverflow.com/questions/3626752/key-existence-check-in-hashmap
https://stackoverflow.com/questions/14788434/check-the-existence-of-a-hashmap-key
`
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
if(map.get(key) != null || (map.get(key) == null && map.containsKey(key))) {
// …
}
`
“大话架构”阿里架构师分享的Java程序员需要突破的技术要点
https://segmentfault.com/a/1190000013561054
`
一、源码分析
二、分布式架构
三、微服务
四、性能优化
五、Java工程化
`
Java工程师成神之路(2018修订版)
https://mp.weixin.qq.com/s/UKwZkwYmDSVTbj62ACuapg
一名3年工作经验的java程序员应该具备的技能
http://dataunion.org/32518.html
`
1、基本语法
2、集合
3、框架
4、数据库
5、Web方面的一些问题
6、数据结构和算法分析
7、Java虚拟机
8、设计模式
9、多线程
`
如何充分利用多核CPU,计算很大List中所有整数的和?
https://since1986.github.io/blog/111da3a8.html
http://flysnow.iteye.com/blog/711162
http://blog.csdn.net/ouyang_peng/article/details/46491217
初步诊断你的GC
https://mp.weixin.qq.com/s/oKH2vBqhwoVOdbEMJg4Lmw
深入理解Java:注解(Annotation)自定义注解入门
http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html
深入理解Java:注解(Annotation)–注解处理器
http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html
Java进阶(一)Annotation(注解)
https://www.jasongj.com/2016/01/17/Java1_%E6%B3%A8%E8%A7%A3Annotation/
Java进阶(二)当我们说线程安全时,到底在说什么
https://www.jasongj.com/java/thread_safe
Java进阶(三)多线程开发关键技术
https://www.jasongj.com/java/multi_thread
Java进阶(四)线程间通信方式对比
https://www.jasongj.com/java/thread_communication
Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式
https://www.jasongj.com/java/nio_reactor/
Java进阶(六)从ConcurrentHashMap的演进看Java多线程核心技术
https://www.jasongj.com/java/concurrenthashmap/
Java进阶(七)正确理解Thread Local的原理与适用场景
https://www.jasongj.com/java/threadlocal/
JAVA后端开发规范
https://juejin.im/post/5ada99fff265da0b8a672fbd
`
目录
一、命名风格
二、变量定义
三、代码格式
四、OOP规约
五、集合处理
六、控制语句
七、注释规约
八、其他
九、异常处理
十、MySQL数据库
建立表规约
索引规约
SQL语句
`
Java中 int 和 String 类型的相互转换
https://stackoverflow.com/questions/4105331/how-do-i-convert-from-int-to-string
`
// 方法一
int i = 5;
String strI = “” + i;
// 方法二
int i = 5;
StringBuilder sb = new StringBuilder();
sb.append(“”);
sb.append(i);
String strI = sb.toString();
// 方法三
int i = 5;
String strI = Integer.toString(i);
// 方法四
int i = 5;
String strI = String.valueOf(i);
`
实战java高并发程序设计读书概要整理
https://blog.csdn.net/congge_1993/article/details/80004890
线程池创建
https://blog.csdn.net/congge_1993/article/details/73497439
线程池监控——自定义线程池
https://blog.csdn.net/congge_1993/article/details/80111897
java注解详解
https://www.cnblogs.com/yiwangzhibujian/p/7353270.html
`
一、前言
1.1 示例
1.2 再议注解
二、注解的属性
2.1 注解位置
2.2 注解生命周期
三、自定义注解
3.1 注解定义
3.2 注解使用
四、jdk已有注解
五、总结
说到底,注解的使用方还是很简单的,难点在于提供给你注解的人是怎么通过注解去达到他的目的的。如果你设计一个框架并提供注解给人使用,那么你就要精通反射。不过一般情况下是很少遇到需要自定义反射的场景,除非你设计一个中间框架,别人通过你的框架来调用自己实现的类,就像Spring一样。
`
Java 注解详解 (annotation)
https://blog.csdn.net/suifeng3051/article/details/51801018
`
什么是java注解
Java注解的目的
注解基本概念
注解的构成
注解的位置
一些常用的内置注解
Deprecated注解
Override注解
SuppressWarnings
创建自定义注解
定义一个自定义注解
给注解元素设置默认值
两个元注解Retention和Target
通过反射获得Java注解信息
获取类的注解信息
获取方法的注解信息
获取参数的注解信息
获取字段的注解信息
`
Java 异常设计最佳实践
https://blog.csdn.net/suifeng3051/article/details/52126895
`
关于异常
Java 异常基本概念
Java 异常体系结构
检查异常与非检查异常
检查异常 or 非检查异常
尽量少使用检查异常
异常转译
异常的架构设计
从系统不同角度看异常
设计一个统一的异常处理类
异常层次定义
`
Java反射机制
https://juejin.im/post/5b7e708b51882542b83d70c9
`
目录
一、Java反射机制概述
二、反射的作用
三、理解Class类和类类型
3.1 类是对象吗
3.2 Class的对象的获取
第一种方法
第二种方法
第三种方法
四、动态加载类
五、获取类的信息
5.1 获取类的构造函数
1、单独获取某个构造函数
2、获取所有的构造函数
5.2 获取类的成员方法
1、单独获取某一个方法
如何调用获取到的方法
2、获取类中所有成员方法的信息
注意:
5.3 获取类的成员变量
1、单独获取某个成员变量
2、获取所有的成员变量
5.4 获取类、方法、属性的修饰域
5.5 通过反射获取私有成员变量和私有方法
六、关于反射的一些高级话题
Android编译期问题
软件的解耦合
反射安全
七、通过反射了解集合泛型的本质
`
Java 和操作系统的交互细节
https://mp.weixin.qq.com/s/9HcxAtM08ynuZGXQ1ygUMQ
`
# 结合 CPU 理解一行 Java 代码是怎么执行的
# 从 Linux 内存管理角度理解 JVM 内存模型
# NPTL和 Java 的线程模型
# 线程的同步
# Java 中如何实现定时任务
# Java 如何和外部设备通信
`
Java类文件结构详解
http://tech.dianwoda.com/2020/01/02/javalei-wen-jian-jie-gou/
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html