大学期间接触 Java 的时间也不短了,不论学习还是实习,都让我发觉基础的重要性。互联网发展太快了,各种框架各种技术更新迭代的速度非常快,可能你刚好掌握了一门技术的应用,它却已经走在淘汰的边缘了。
而学习新技术总要付出一定的时间成本,那么怎么降低时间成本呢?那就是打好基础,技术再怎么革新,底层的东西也很少会变动,牢固的基础会帮助你在各种新技术的学习中游刃有余,快速上手。
因为我选择的方向是后台开发,所以谈谈我认为的基础有哪些。其他方向肯定也有自己的体系,从低层到高层,可以自己摸索。后台的话,我觉得网络知识,各种协议,web 知识,数据库知识,Linux 基本操作以及自己选择的后台语言知识,这些是最基础最需要牢固掌握的。
所以从今天起,会出一系列与后台基础相关的博文,一是对自己过去学习的一个总结,二是分享出来,希望可以帮助到需要的人。
概要Java 基础我做了 10 个方面的总结,包括基本概念,面向对象,关键字,基本类型与运算,字符串与数组,异常处理,Java 平台与内存管理,分布式 Java 应用,多线程,IO。以下对这些内容做一些简单的总结,同时我也有完整的思维导图,博客上不方便展示,若有需要,联系我。
细节 1. 基本概念 1.1 语言特点纯面向对象
平台无关性
内置类库
支持web
安全性
防止代码攻击
健壮性
强类型机制
垃圾回收器
异常处理
安全检查机制
去除C++中难以理解易混淆的特性
1.2 与C++比较解释编译混合型语言,执行速度慢,跨平台
纯面向对象,只有类,不存在全局变量或全局函数
无指针,无多继承,可多实现
垃圾回收器自动管理内存
1.3 main函数知识Java程序入口方法
可由final,synchronized修饰,不能用abstract
1.4 Java程序初始化顺序静态优于非静态
父类优于子类
按照成员变量的定义顺序
总共10个
1.5 作用域与可见性静态变量属于类
局部变量属于花括号
成员变量看下一条
public、protected、default、private 可见性依次递减
1.6 构造函数与类名相同,无返回值
可重载,不能被继承,即不能被覆盖
参数个数任意
伴随new 一起调用,为系统调用
完成对象的初始化工作
子类可通过super显式调用父类。父类没有提供无参,子类必须显式调用
未定义,默认无参,修饰符取决于类修饰符
1.7 标识接口无任何方法声明
表示实现它的类属于一个特定的类型
1.8 clone 方法实现Cloneable接口
重写Object类中的clone()
clone()中调用super.clone()
把浅复制引用指向新的克隆体
1.9 反射定义:允许程序在运行时进行自我检查,也允许对其内部成员进行操作
功能
得到一个对象所属的类
获取一个类的所有成员和方法
运行时创建对象
在运行时调用对象的方法
获取类的方式
class.forName("类路径")
类名.class
实例.getClass()
1.10 创建对象的四种方式new
反射机制
clone()
反序列化
1.11 package 作用提供多层命名空间,解决命名冲突
对类按功能进行分类,使项目组织更加清晰
2. 面向对象 2.1 与面向过程区别层次逻辑关系不同。
面向对象是通过类的层次结构来体现类之间的继承与发展
面向过程是通过模块的层次结构概括模块与模块间的关系与功能
数据处理方式不同与控制程序方式不同
面向对象是数据与操作封装成一个整体,通过事件驱动来激活和运行程序
面向过程是数据单独存储,控制程序方式上按照设计调用或返回程序
2.2 特性抽象
继承
多态
封装
2.3 这种开发方式优点开发效率高。代码重用
保证软件的鲁棒性。经过长期测试的已有代码
保证软件的高可维护性。设计模式成熟
2.4 继承单继承
只能继承父类的非私有成员变量和方法
同名成员变量,子类覆盖,不会继承
相同函数签名,子类覆盖,不会继承
2.5 组合和继承区别组合:在新类中创建原有类的对象。has a
继承是 is a
2.6 多态方法重载
编译时多态
方法覆盖
运行时多态
成员变量无多态概念
2.7 覆盖和重载区别子父类关系,垂直;同类方法间关系,水平
一对方法发生关系;多个方法发生关系
参数列表相同;参数列表不同
调用的方法根据对象的类型决定;根据调用时的实参表决定方法体
2.8 抽象类与接口异同同
不能被实例化
接口的实现类实现了接口,抽象类的子类实现了方法,才能被实例化
异
接口只能定义方法,不能实现;抽象类可以有定义和实现
接口需要被实现;抽象类需要被继承
接口强调特定功能的实现;抽象类强调所属关系
接口成员变量默认为 public static final,成员方法 public abstract
抽象类变量默认default,方法不能用 private、static、synchronized、native 修饰
2.9 内部类静态内部类
static 修饰
只能访问外部类中的static数据
成员内部类
与实例绑定
不可定义静态属性和方法
外部实例化后,该内部类才能被实例化
局部内部类
代码块内
不能被public、protected、private以及static修饰
只能访问final 局部变量
匿名内部类
无类名
无构造函数,必须继承或实现其他类
原则
无构造函数
无静态成员,方法和类
不能是public、protected、private、static
只能创建匿名内部类的一个实例
new 后面有继承或实现
特殊的局部内部类
2.10 如何获取父类类名利用反射:obj.getClass().getSuperClass().getName()
不使用super.getClass()原因:该方法在 Object中为final与native,子类不能覆盖,返回此Object运行时类
2.11 this指向当前实例对象
区分成员变量与方法形参
2.12 super访问父类成员变量或方法
子类同名会覆盖,访问父类只能通过super
子类构造函数需显示调用父类构造函数时,super()必须为构造函数的第一条语句
3. 关键字 3.1 变量命名英文字母
数字
_和$
不能包含空白字符
首字符不能为数字
保留字不能做标识符
区分大小写
3.2 assert软件调试
运行时开启 -ea
3.3 static特定类的统一存储空间,类绑定
成员变量:属于类,内存中只有一个复制
成员方法:调静态数据。可实现单例模式
代码块:初始化静态变量,只被执行一次
内部类:不能与外部类重名,只能访问外部类静态数据(包括私有)
3.4 switch多分支选择
整型或字符类型变量或整数表达式
Java 7 开始支持 String。原理是String的hashCode()返回的int类型值匹配
3.5 volatile保证线程间的可见性
从内存中取数据,而不是缓存
不保证原子性
3.6 instanceof二元运算符
判断一个引用类型的变量所指向的对象是否是一个类的实例
即左边对象是否是右边类的实例
3.7 strictfp精确浮点
确保浮点运算的准确性
若不指定,结果依赖于虚拟机平台
指定后依赖于统一标准,保证各平台的一致性
3.8 null不是合法的Object实例
无内存
表明该引用目前没有指向任何对象
4. 基本类型与运算 4.1 基本数据类型int长度
byte(8 bit)
short(16 bit)
int(32 bit)
long(64 bit)
float长度
单精度(32 bit float)
双精度(64 bit double)
boolean 类型变量的取值
true
false
char数据类型:Unicode字符(16 bit)
void:java.lang.Void 无法直接对其进行操作
4.2 不可变类实例创建后,值不可变
所有的基本类型的包装类+String
优点
使用简单
线程安全
节省内存
缺点:会因为值的不同而产生新的对象,导致无法预料的问题
4.3 类型转换隐式类型转换
低精度到高精度
byte->short->char->int->long->float->double
显式类型转换
反之
可能会损失精度
类型自动转换
低到高
char类型会转换为其对应的ASCII码
byte、char、short参与运算自动转为int,但"+=",不转
基本数据类型与boolean不能相互转换
多种类型混合运算,自动转成容量最大类型