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反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: ...
随机推荐
- “全栈2019”Java第九十六章:抽象局部内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 利用CXF生成webservice客户端代码
一.CXF环境的配置 1.下载CXF的zip包. 2.解压.例如:D:\ITSoft\webserviceClientUtils\cxf\apache-cxf-2.7.17 3.配置环境变量:新建变量 ...
- python 去除字符串的首末两端的空白字符
my_str = " adsffff adsfsad " my_str.strip() 使用strip()默认将 str 两端的空白字符去除掉 同时还有rstrip() 和 lst ...
- mysql分表分库选型
三个方向: 一.应用中自己实现,可直连数据库,自己实现因目前使用的Mybatis框架可以使用两种做法: 1.在SQL中直接分表逻辑,我查了一下代码中的sql,发现join的千姿百态,不大动这些sql这 ...
- jersey annotations
参照: http://blog.csdn.net/a19881029/article/details/43056429 官网文档翻译版 @Path 用来为资源类或方法定义URI,当然除了静态URI也支 ...
- jQuery css()与class()的用法
一.css()用法: 1.设置css // css(name, value) // 修改单个样式 // name:样式名 value:样式值 $("li") .css(&quo ...
- orcal创建序列
CREATE SEQUENCE flowjobseq --序列名INCREMENT BY 1 -- 每次加几个 START WITH 2000 -- 从1开始计数 NOMAXVALUE -- 不设置最 ...
- 【CF1157F】Maximum Balanced Circle 求一个相邻元素之间绝对值为小于1的最大环
题目: https://codeforces.com/contest/1157/problem/F 给出一个序列 , 我们要从序列里面挑出一些数构造成一个相邻元素之间绝对值为小于1的最大环 , 挑选的 ...
- Service层异常处理
1.在service方法里面如果对异常进行了捕获的话,该事务是不会进行回滚的 * 默认spring事务只在发生未被捕获的 runtime excetpion()时才回滚. * * spring aop ...
- MySQL设置远程连接服务器
默认情况下,mysql只允许本地登录,如果要开启远程连接,则需要修改/etc/mysql/my.conf文件. 一.修改/etc/mysql/my.conf找到bind-address = 127.0 ...