韩顺平Java基础
- 浮点型使用细节
- 基本数据类型转换
- 自增和自减需要注意细节
- 运算符的一些使用细节
- 命名规范
- break关键字
- 数组赋值机制
- 二维数组使用细节
- 类和对象的内存分配机制
- 方法的调用机制原理
- 成员方法传参机制
- 可变参数
- 作用域
- 构造器
- this关键字
- 访问修饰符
- 面向对象三大特征
- Java动态绑定机制
- 多态数组
- 多态参数
- Object类
- 类变量/静态变量/静态属性
- 类方法/静态方法
- 代码块
- 单例模式
- final关键字
- 抽象类
- 接口
- 内部类
- 枚举
- 自定义异常
- 自动装箱和自动拆箱
- 包装类型和 String 类型的相互转换
- Integer注意事项
- String创建的两种方式和区别
- StringBuffer
- StringBuilder
- String、StringBuffer、StringBuilder比较
- BigInteger和BigDecimal类
- 日期类
- 集合
- 泛型
浮点型使用细节
double d = 8.1 / 3 的结果是一个非常接近2.7的小数,比如2.69999997,这是计算机的运算规则造成的
基本数据类型转换
自动类型转换
对于第四点,如下所示:
b2 和 s1 首先转为int,然后结果赋值给short,肯定错误
强制类型转换
自增和自减需要注意细节
记住:i++是先取值,后运算 ++i是先运算,后取值
运算符的一些使用细节
运算符优先级
命名规范
break关键字
break关键字可以指定标签(但是不建议使用标签)
continue 也可以指定标签
数组赋值机制
分为基本数据类型的值拷贝和数组的引用传递
二维数组使用细节
类和对象的内存分配机制
方法的调用机制原理
成员方法传参机制
(1)基本数据类型的传参机制,传递的是值(值拷贝),形参的改变不会影响实参
(2)引用数据类型的传参机制,引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参
可变参数
java 允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
就可以通过可变参数实现
作用域
属性可以加修饰符(public protected private…)
局部变量不能加修饰符
构造器
在这里插入图片描述
this关键字
哪个对象调用,this就代表哪个对象
访问修饰符
面向对象三大特征
封装
注意可以将构造器和setXXX结合
继承
继承的细节
- 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访
问,要通过父类提供公共的方法去访问 - 子类必须调用父类的构造器, 完成父类的初始化
- 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无
参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过 - 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
- super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
- super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
- java 所有类都是 Object 类的子类, Object 是所有类的基类.
- 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)
- 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。
- 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系
继承的本质
super关键字
super和this关系
方法重写/覆盖
多态
如果主人Master有一个feed方法,即给某个Animal喂食Food,随着动物种类的增多和食物种类增多,feed方法也越来越多,不便于维护
所以我们要使用多态
方法的多态
(1)重载体现多态,比如一个类中有多个sum方法,但是方法参数不一样,当我们调用sum方法时,传入不同参数个数,调用不同的sum方法,这里体现了多态
(2)重写体现多态,在继承关系中,父类A有一个say方法,子类B有一个say方法,调用时A.say()和B.say(),方法名一样,但是不同方法,体现了多态
对象的多态
因此可以用来解决上面的喂食问题,直接feed(Animal animal, Food food),这样调用方法时传入具体的Animal和Food的实现就可以,只用编写一个feed方法即可
多态的注意细节
(1)向上转型
编译看左边,编译的时候编译器知道这是Animal类型,所以确定了能调用哪些成员
运行看右边,运行时看子类的具体实现,查找方法时,从子类开始查找,找不到就顺着找他的父类
(2)向下转型
可以用向下转型来调用子类特有的方法
Java动态绑定机制
运行a.sum()时,由于运行类型是B,会去B中找sum()方法,这时结果是40
如果B中没有sum()方法,则由继承机制,去A中找sum()方法。这时A中的sum()方法有getI()方法,由动态绑定机制,该方法和运行类型绑定,所以调用的getI()是B中的getI()方法。此时结果是30
注意对象属性没有动态绑定机制,只需看本类中有没有,没有就使用继承机制,去父类寻找即可。
多态数组
多态参数
Object类
==和 equals 的对比
hashCode方法
toString方法
finalize 方法
类变量/静态变量/静态属性
类方法/静态方法
开发自己的工具类时,可以将方法做成静态的,方便调用
代码块
单例模式
饿汉式
由于static属性或者方法在类加载时就加载了,所以不管通过公共的方法获取多少个对象,都是同一个对象
(我们即使没有使用,他也帮我们创建了对象,很着急,所以叫饿汉式)
懒汉式
只定义不new对象,只有通过getInstace方法获取对象时才创建
对比
final关键字
final和static搭配使用,不会导致类的加载。比如类中有一个属性
public static final int a = 10;
通过类使用这个a变量时,不会加载类,因为底层编译器做了优化
抽象类
接口
接口 VS 继承类
比如猴子天生会爬树,这可以通过继承获得。但是猴子可以通过学习来获得有用、飞翔的技能,这就需要通过接口实现。
接口的多态特性
接口的多态传递现象
内部类
内部类的分类
局部内部类
匿名内部类
成员内部类
静态内部类
枚举
自定义异常
throw和throws的区别
自动装箱和自动拆箱
包装类型和 String 类型的相互转换
Integer注意事项
Integer i = 5;其实调用的是Integer i = Integer.valueOf(5),即只要在-128~127范围内,就这样
如果不在这个范围,就Integer i = new Integer(129),创建对象
String创建的两种方式和区别
StringBuffer
String和StringBuffer相互转换
StringBuilder
String、StringBuffer、StringBuilder比较
BigInteger和BigDecimal类
在进行运算时,调用上面的方法
当long不够用时,可以使用BigInteger
当double不够用时,可以使用BigDecimal
日期类
第一类日期
第二类日期
第三类日期
DateTimeFormatter 格式日期类
Instant 时间戳
集合
Collection接口遍历方式
Iterator迭代器
当退出for循环后,iterator迭代器指向最后的元素,如果需要再次便利,需要重置迭代器 iterator = col.iterator()
增强for循环
List接口
Arraylist注意事项和源码分析
Vector相关
Vector和ArrayList比较
LinkedList相关
ArrayList和LinkedList比较
Set接口
HashSet
LinkedHashSet
Map接口
Map的遍历方法
可以通过(2)(3)(4)获取数据,然后通过迭代器、增强for进行遍历。
HashMap
Hashtable
Properties
如何选择
Collections工具类
排序操作(均为static方法)
查找、替换
泛型
有可能加入的不是Dog,并且遍历时要多一步转换,效率低
针对以上问题,可以使用泛型来解决。
在这里直接指定泛型为Dog
对第四点的解释:
泛型的语法