[TOC]
# 面向对象三大特性
封装、继承、多态。
* 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据
* 继承可以重用父类代码,实现代码复用和可扩展的效果
* 多态指对象的一个方法在调用时可以有多种状态,即父类引用可以持有子类对象
* 多态实现的两种形式:基于继承重写、基于接口
* 多态存在的三个条件:继承、重写、父类引用持有子类对象
* 非静态成员方法的调用:编译看父类,运行看子类
* 多态优点:不用创建一堆子类对象的引用;多态缺点:不能使用子类特有的成员属性和成员方法
# 静态绑定和动态绑定
* 绑定指一个方法的调用与方法所在的类关联起来
* 静态绑定:编译过程中编译器已经准确的知道这个方法属于哪个类了
* 动态绑定:需要在运行时根据对象具体的类型来绑定,来选择调用哪个类的方法
* private方法、static方法、final方法、构造器方法都是静态绑定的;其他方法全部为动态绑定
# 方法的重载与重写
* 重载指在一个里面,方法名字相同,参数不同,返回类型可相同也可不同。常用于构造器重载
* 重写指子类对父类允许访问的方法的实现过程进行重新编写,返回值和形参都不能变
# 本地变量、实例变量以及类变量之间的区别
* 本地变量就是局部变量,定义在方法内部或者方法的形参中
* 实例变量为为非静态变量,隶属于对象,每一个对象的实例变量都不同
* 类变量为静态变量,隶属于类
# 形参与实参
* 形参是定义方法时使用的参数,出现在方法定义中,在整个方法内可以使用,离开该方法不能使用。
* 实参是用于调用方法时传递给方法的参数。
# 引用分类
1、强引用:是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。
2、软引用:如果内存空间足够,垃圾回收器就不会回收软引用对象;如果内存空间不足,就会回收软引用对象。
3、弱引用:弱引用对象比软引用对象生命周期更短,垃圾回收器扫描时一旦发现弱引用对象,就会回收它。垃圾回收器优先级不高,所以不一定很快发现弱引用对象。
4、虚引用:虚引用对象就和没有被引用一样,任何时候都可能被垃圾回收器回收。一般用于跟踪对象被垃圾回收器回收的过程,如开源库LeakCanary。
# 值传递与引用传递
1、Java总是采用按值调用,方法得到的是参数值的一个拷贝。
2、一个方法不能改变其参数的值,如果是基本类型参数不能改变参数的值,如果是对象参数不能改变参数的引用指向(但可以改变所指向对象的属性)
# final关键字的理解
1、final的意思是【无法改变的】、【最终的】,可以修饰非抽象类、非抽象类的成员变量和成员方法
2、final类不能被继承,没有子类,其中的方法默认是final的
3、final方法不能被重写,但可以被继承(final不能用于修饰构造方法)
4、final成员变量表示常量,只能被赋值一次,赋值后不再改变。
5、使用final声明基础数据类型时,数值恒定不变;使用final声明对象引用时,引用的对象恒定不变,但对象的数据可变;使用final声明数组类型时,引用的数组恒定不变,但数组内的数据可变。
优点:
1、编译器遇到final方法时会转入内嵌机制,提高效率。
2、可以安全的在多线程环境下共享,不需要额外的同步开销。
# Java类加载的时机
1、加载顺序:加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载
2、解析有时可以在初始化之后进行
3、Java虚拟机没规定什么时候进行加载,但规定以下几种情况需要进行初始化,当然初始化前的那几步操作需要在初始化前完成。
a、new一个实例对象时,读取或设置一个类的静态字段时,调用一个类的静态方法时
b、反射调用时,如果没初始化需要触发初始化
c、初始化一个类时,如果其父类还未初始化,需要先触发父类的初始化
d、虚拟机启动时,会先初始化主类
# Java类加载调用顺序
1、基类静态代码块、基类静态成员变量(优先级相同,按代码出现顺序依次执行)(只有第一次加载类时执行)
2、派生类静态代码块、派生类静态成员变量(优先级相同,按代码出现顺序依次执行)(只有第一次加载类时执行)
3、基类普通代码块、基类普通成员变量(优先级相同,按代码出现顺序依次执行)
4、基类构造函数
5、派生类普通代码块、派生类普通成员变量(优先级相同,按代码出现顺序依次执行)
6、派生类构造函数
# 抽象类和接口区别
* 抽象类可以包含抽象方法和具体方法;接口只能包含抽象方法
* 抽象类方法可使用public、protected、private修饰符;接口方法默认使用public static修饰,成员变量默认使用public static final修饰
* 一个抽象类只能继承一个父类;但一个接口可以继承多个父接口
* 相同点:二者都不可以实例化
# 为什么匿名内部类使用局部引用要用final
1、匿名内部类属于一种局部内部类。
2、编译后局部内部类中会有一个成员变量,是对外部局部变量的引用的拷贝,在局部内部类使用外部局部变量值时都是通过这个引用进行的。
3、为避免这个成员变量的值(引用的对象)被外部类的方法修改,导致内部类在使用时得到的值不一样,需要使用final让该成员变量不可变。
4、局部变量位于方法内部,在虚拟机的栈上,意味着这个变量无法进行共享,匿名内部类无法直接访问,只能通过值传递的方式,传递给匿名内部类。
5、而类的成员变量在虚拟机的堆上,内部类可以直接获取这个变量,故类的成员变量不需要声明为final内部类就可访问。
# 什么是匿名内部类
1、匿名内部类即没有名字的内部类,只可被使用一次
2、使用匿名内部类前提条件:必须继承自一个父类或实现一个接口
3、语法格式为 new 父类构造器(参数列表)|实现接口(){}
4、直接将抽象类的方法或者接口方法在大括号中实现,可以省略一个类的书写
5、匿名内部类中不能定义构造方法,但可以使用初始化语块代替构造方法
- 导读
- Java知识
- Java基本程序设计结构
- 【基础知识】Java基础
- 【源码分析】Okio
- 【源码分析】深入理解i++和++i
- 【专题分析】JVM与GC
- 【面试清单】Java基本程序设计结构
- 对象与类
- 【基础知识】对象与类
- 【专题分析】Java类加载过程
- 【面试清单】对象与类
- 泛型
- 【基础知识】泛型
- 【面试清单】泛型
- 集合
- 【基础知识】集合
- 【源码分析】SparseArray
- 【面试清单】集合
- 多线程
- 【基础知识】多线程
- 【源码分析】ThreadPoolExecutor源码分析
- 【专题分析】volatile关键字
- 【面试清单】多线程
- Java新特性
- 【专题分析】Lambda表达式
- 【专题分析】注解
- 【面试清单】Java新特性
- Effective Java笔记
- Android知识
- Activity
- 【基础知识】Activity
- 【专题分析】运行时权限
- 【专题分析】使用Intent打开三方应用
- 【源码分析】Activity的工作过程
- 【面试清单】Activity
- 架构组件
- 【专题分析】MVC、MVP与MVVM
- 【专题分析】数据绑定
- 【面试清单】架构组件
- 界面
- 【专题分析】自定义View
- 【专题分析】ImageView的ScaleType属性
- 【专题分析】ConstraintLayout 使用
- 【专题分析】搞懂点九图
- 【专题分析】Adapter
- 【源码分析】LayoutInflater
- 【源码分析】ViewStub
- 【源码分析】View三大流程
- 【源码分析】触摸事件分发机制
- 【源码分析】按键事件分发机制
- 【源码分析】Android窗口机制
- 【面试清单】界面
- 动画和过渡
- 【基础知识】动画和过渡
- 【面试清单】动画和过渡
- 图片和图形
- 【专题分析】图片加载
- 【面试清单】图片和图形
- 后台任务
- 应用数据和文件
- 基于网络的内容
- 多线程与多进程
- 【基础知识】多线程与多进程
- 【源码分析】Handler
- 【源码分析】AsyncTask
- 【专题分析】Service
- 【源码分析】Parcelable
- 【专题分析】Binder
- 【源码分析】Messenger
- 【面试清单】多线程与多进程
- 应用优化
- 【专题分析】布局优化
- 【专题分析】绘制优化
- 【专题分析】内存优化
- 【专题分析】启动优化
- 【专题分析】电池优化
- 【专题分析】包大小优化
- 【面试清单】应用优化
- Android新特性
- 【专题分析】状态栏、ActionBar和导航栏
- 【专题分析】应用图标、通知栏适配
- 【专题分析】Android新版本重要变更
- 【专题分析】唯一标识符的最佳做法
- 开源库源码分析
- 【源码分析】BaseRecyclerViewAdapterHelper
- 【源码分析】ButterKnife
- 【源码分析】Dagger2
- 【源码分析】EventBus3(一)
- 【源码分析】EventBus3(二)
- 【源码分析】Glide
- 【源码分析】OkHttp
- 【源码分析】Retrofit
- 其他知识
- Flutter
- 原生开发与跨平台开发
- 整体归纳
- 状态及状态管理
- 零碎知识点
- 添加Flutter到现有应用
- Git知识
- Git命令
- .gitignore文件
- 设计模式
- 创建型模式
- 结构型模式
- 行为型模式
- RxJava
- 基础
- Linux知识
- 环境变量
- Linux命令
- ADB命令
- 算法
- 常见数据结构及实现
- 数组
- 排序算法
- 链表
- 二叉树
- 栈和队列
- 算法时间复杂度
- 常见算法思想
- 其他技术
- 正则表达式
- 编码格式
- HTTP与HTTPS
- 【面试清单】其他知识
- 开发归纳
- Android零碎问题
- 其他零碎问题
- 开发思路