Java基础-基于《Thinking In Java》
摘要
本文是对一些java基础知识的整理,把之前印象笔记里面的全部慢慢搬到这个blog来
为了方便就按照《Thinking In Java》的目录来编辑。
这里面的内容均为面试题相关,可能的考点等
这本书里面有些翻译不是很好,建议和英文版对照。
Chapter1-Introduction to Objects
特性
抽象、封装、继承、多态
面向对象设计方法主要特征:继承、封装、多态。
延伸点:反射会破坏代码的封装性(mock等)
Chapter2-Everything Is an Object
Object方法
return | method | 解释 |
---|---|---|
protected Object | clone() | 创建并返回此对象的一个副本。 |
protected void | finalize() | 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 |
void | notify() | 唤醒在此对象监视器上等待的单个线程。 |
void | notifyAll() | 唤醒在此对象监视器上等待的所有线程。 |
void | wait() | 在其他线程调用此对象的 notify()方法或 notifyAll()方法前,导致当前线程等待。 |
void | wait(long timeout) | 在其他线程调用此对象的 notify()方法或 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。 |
void | wait(long timeout, int nanos) | 在其他线程调用此对象的 notify()方法或 notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。 |
方法属于对象的成员,静态方法属于类的成员
Q:为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?
一个很明显的原因是 JAVA 提供的锁是「对象级」 的而不是「线程级」的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的 wait()方法就有意义了。
如果 wait()方法定义在 Thread 类中,线程正在等待的是哪个锁就不明显了。
简单的说,由于 wait,notify 和 notifyAll 都是锁级别的操作,所以把他们定义在 Object 类中因为锁属于对象。
拓展:
在 Java 中,每个对象都有两个池,锁(monitor)池和等待池
锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized 方法(或者 synchronized 块),由于这些线程在进入对象的 synchronized 方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。
等待池:假设一个线程A调用了某个对象的 wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在 synchronized 中,这样自然在执行 wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。
如果另外的一个线程调用了相同对象的 notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的 notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.
Q:为什么 wait 和 notify 方法要在同步块中调用?
- 避免 IllegalMonitorStateException
- 避免任何在 wait 和 notify 之间潜在的竞态条件
基本数据类型
Integer,Float,Double等都继承自Number类
名称 | 包装类型 | 初始化 | 其他 |
---|---|---|---|
boolean | Boolean | false | 1位 |
byte(1字节) | Byte | (byte)0 | ASCII码:空格:32;数字0到9:48到57,后面为大小写字母; byte 类型用在大型数组中节约空间,主要代替整数,因为 占用的空间只有 int 类型的四分之一 |
short(2字节) | Short | (short)0 | Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一; |
char(2字节) | Character | '\u0000'(null) | 单一的 16 位 Unicode 字符; |
int(4字节) | Integer | 0 | |
float(4字节) | Float | 0.0f | 精确到小数点后6位,在储存大型浮点数组的时候可节省内存空间; |
long(8字节) | Long | 0L | |
double(8字节) | Double | 0.0d | 精确到小数点后15位(默认的小数类型) |
BigInteger 任意精度的整数,不可变
BigDecimal 任何精度的定点数(商业计算),不可变,通常建议优先使用String构造方法
parseInt()是把String变成int的基础数据类型;
类型转换
byte,short,char-> int -> long -> float -> double 不同类型运算结果类型向右边靠齐。
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
拆箱和装箱
装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。
大多数情况下两者相同,java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)等实现了自己的equals,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true。
valueOf()
方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。
在 Java 8 中,Integer
缓存池的大小默认为 -128~127,所以除非用 new Integer()
显式的创建对象,否则都是同一个对象(-128~127)
比较符号 | 比较对象 | 数据转型 |
---|---|---|
== | 同一个对象 | 有表达式会触发 |
equals | 同一个类型和内容 | 不触发 |
一般会考你“==”和equals的区别,数据转型,拆箱装箱
“==”和equals记住,前者相同,后者相等。前者会触发数据转型。
new Integer()新建对象
valueof装箱,xxxValue拆箱
Math类
方法 | 功能 | 返回值 |
---|---|---|
ceil() | 向上取整 | double |
floor() | 向下取整 | double |
round() | 原来的数字加上0.5后再向下取整 | int |
变量名
三种元素构成:数字+字符+$+下划线。
不能以数字开头+不能是关键字.
类名
一个文件中可以有多个类,如果没有public类,则可以与任意类名相同,如果有public类则文件名必须与此类名相同,因为一个文件中只能有一个public类。如果文件中只有一个类,则文件名必须与类名相同
注释
名称 | 功能 |
---|---|
Override | 标识当前的方法,是否覆盖了它的父类中的方法 |
Deprecated | 已经过期或者即将过期的方法,不推荐我们使用 |
SuppressWarning | 屏蔽相应的警告 |
Chapter3-Operators
运算符 | 结合性 | 其他 |
---|---|---|
() [] . | 从左到右 | |
! +(正) -(负) ~ ++ -- | 从右向左 | ~n=-n-1 |
* / % | 从左向右 | %取余操作,只适用于整型 |
+(加) -(减) | 同上 | |
<< >> >>> | 同上 | 按位左(右)移运算符, 按位右移运补零运算符。 |
< <= > >= instanceof | 同上 | |
== != | 同上 | |
& | 同上 | 相对应位都是1,则结果为1,否则为0 |
^ | 同上 | 相对应位值相同,则结果为0,否则为1 |
或 | 同上 | 相对应位都是0,则结果为0,否则为1 |
&& | 同上 | 逻辑与(前面表达式为false,后面不计算) |
逻辑或 | 同上 | 逻辑或(前面表达式为true,后面不计算) |
Chapter4-Controlling Execution
break continue return
break 中断并跳出当前循环。直接跳出当前的循环,从当前循环外面开始执行,忽略循环体中任何其他语句和循环条件测试。他只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出.
- continue 终止当前的循环过程,但他并不跳出循环,而是继续往下判断循环条件执行语句.他只能结束循环中的一次过程,但不能终止循环继续进行.
return 导致当前的方法退出,并返回那个值。
switch
选择因子:整数类型(long除外),enum(jdk1.5后),String(jdk1.7后)
字符串的switch是通过equals()和hashCode()方法来实现的。
注意break
Chapter5-Initialization & Cleanup
类的加载包括:加载,验证,准备,解析,初始化
构造方法内可以用this调用另一个构造方法
重载与重写
同名不同参数为重载,与返回值类型无关;(比如你调用这个方法的时候java怎么根据返回值来区分你实际调用的方法)与访问修饰符无关
子类覆写父类的方法为重写
方法重写应遵循“三同一小一大”原则:
- “三同”:即方法名相同,形参列表相同,返回值类型相同;
- “一小”:子类方法声明抛出的异常比父类方法声明抛出的异常更小或者相等;
- “一大”:子类方法的访问修饰符应比父类方法更大或相等。
题型:怎么算重载和重写,重写的修饰符范围
final不能重写
Chapter6-access control
访问控制符
名称 | 功能 |
---|---|
包访问权限 | 不提供任何权限修饰词情况下;默认包:处于同一个文件目录下 |
public | 都可用 |
protected | 修饰方法和成员变量,处理继承的概念,保证了仅有继承的类才能访问这个成员。同时具有包访问权限。 |
private | 仅在被包含的类里面可用,类的变量通常声明为private |
❤class编写顺序可按照:public
Java基础-基于《Thinking In Java》的更多相关文章
- 【Java基础】11、java方法中只有值传递,没有引用传递
public class Example { String testString = new String("good"); char[] testCharArray = {'a' ...
- 【Java基础】4、java中的内部类
内部类的分类:常规内部类.静态内部类.私有内部类.局部内部类.匿名内部类. 实例1:常规内部类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...
- Java基础系列1:Java基本类型与封装类型
Java基础系列1:Java基本类型与封装类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括两 ...
- 【JAVA】基于MVC架构Java技术荟萃案例演练
基于JAVA-MVC技术的顾客管理项目案例总结 作者 白宁超 2016年6月9日22:47:08 阅读前瞻:本文源于对javaweb相关技术和资料汇总,涉及大量javaweb基础技术诸如:Servle ...
- java基础3.0:Java常用API
本篇介绍Java基础中常用API使用,当然只是简单介绍,围绕重要知识点引入,巩固开发知识,深入了解每个API的使用,查看JavaAPI文档是必不可少的. 一.java.lang包下的API Java常 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- 夯实Java基础系列15:Java注解简介和最佳实践
Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...
- Java基础系列1:Java面向对象
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 概述: Java是面 ...
- Java 基础之详解 Java 反射机制
一.什么是 Java 的反射机制? 反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
随机推荐
- P3357 最长k可重线段集问题 网络流
P3357 最长k可重线段集问题 题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\sub ...
- spring-mybatis源码追踪
启用一个扫描类 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <propert ...
- CPU缓存刷新的误解
即使是资深的技术人员,我经常听到他们谈论某些操作是如何导致一个CPU缓存的刷新.看来这是关于CPU缓存如何工作和缓存子系统如何与执行核心交互的一个常见误区.本文将致力于解释CPU缓存的功能以及执行程序 ...
- rpm 安装卸载
安装命令 rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rpm 安装 example.rpm 包并在安装过程中显示正在安装的文件信息: rp ...
- java编码规范_缩进和注释
1. 缩进排版(Indentation) 4个空格常被作为缩进排版的一个单位.缩进的确切解释并未详细指定(空格 vs. 制表符).一个制表符等于n个空格(视具体的编辑器而定,Eclipse ...
- 爬虫6:pyquery库
强大又灵活的网页解析库,如果觉得正则写起来太麻烦,BeautifulSoup语法太难记,而你又熟悉jQuery的语法,那么用PyQuery就是最佳选择 一. 初始化 1. 字符串初始化 h ...
- 读取Properties文件的六种方法
1.使用java.util.Properties类的load()方法 示例: InputStream in = new BufferedInputStream(new FileInputStream( ...
- CentOS7打开关闭防火墙与端口
http://www.javahelp.com.cn/h-nd-747.html#_np=153_1707
- Xcode括号自动补全以及二次编译后不显示输入
今天遇到了一个大坑,在使用栈来进行计算表达式的时候,发现输入括号就报错,以及二次编译后不显示. 测试了好久,经过无数次debug后. 二次编译不显示还是没搞明白,不过输入倒是没什么问题,就是不显示出来 ...
- FlowPortal-BPM——验证控件
自上而下依次是: 非空验证.范围验证.规则表达式验证.比较验证.自定义验证 非空验证的使用: 1.ControlToValidate - 监控的控件 2.ErrorMessage - 为空时提示信息