Java相关知识:
1.特点:
去掉了c语言的指针,核心机制jvm(Java虚拟机),加入了垃圾回收机制GC,Java语言跨平台性:有了不同平台的jvm,可以使Java运行在不同的操作系统上。
2.jdk(jre(jvm,类库)、开发工具集),配置环境变量,
3.编写、javac.exe:.class编译:有几个类生成几个字节码文件,文件名与源文件类名相同,public只能有一个类且和源文件名相同、java.exe解释运行
环境搭建:
2.IT行业三大发展规律
3.bit与byte(比特与字节)
还有PB、EB、ZB、YB等单位
4.关键字
关键字、保留字(goto、const暂时不用,以后的版本可能会用)、标识符(自己可以起名字的地方,class )规则:
5.转义字符:\b 退格符 \n 换行符 \r 回车符 \t 制表符 \ “ \ ’ \ \
\u0123 Unicode码表示字符常量 ascll(SPACE 32 A 65 a 97)
6.byte\char\short 做运算时,结果是int 类型 用int去接收 int-long-float-double
浮点型默认为double
常用命令行
文档注释
4.long与float
float:4字节
long:8字节
float范围比long大,long强制转换为float会有精度损失
float存储结构:
十进制小数转为二进制小数:
5.boolean
占几个字节
如果boolean是单独使用:boolean占4个字节。
如果boolean是以“boolean数组”的形式使用:boolean占1个字节。
6.类型转换
自动类型提升:
此时不写,12.3默认double类型,无法自动转换为float
强制类型转换:(int)doubled1
7.进制
世界上有10种人,认识和不认识二进制的。
A - 10
负数的原码除符号位各个位取反得到反码,+1得到补码,正数都一样
计算机底层都用补码来存储数据
int 类型的128强制转换为byte, 原本的1变成符号位,然后按照补码识别为-128
8.运算符
instanceOf
逻辑运算符,用于布尔类型,逻辑与&或|非!、(前面不对,第二个条件不执行,即符号左边已经是false了,右边的条件将不执行,逻辑与会执行)短路与&&或||非^(异或)
位运算符操作的都是整形的数据,<< 向左移一位,相当于*2
可以使用位运算符交换两个变量的值 ^
三元运算符:
条件?a:b , a和b需要同类型,
Object o1 = true ? new Integer(1) : new Double(2.0);
syso(01); // 2.0 idea快捷键为sout+tab,eclipse是syso->alt+/
//两边需要同类型,1提升为double类型
9.程序流程控制
顺序结构、分支结构、循环结构(for、while、dowhile、foreach)
switch结构中的表达式,只能是byte、short、char、int、枚举类型(jdk5.0)、string类型(jdk7.0)
case之后只能声明常量,不能声明范围
dowhile至少会执行一次循环体
10.break和continue
break跳出包裹的最近一层循环,continue跳出当此循环
标签的使用:在指定的循环加个标签头,跳出指定的循环
label:for(。。)
break label;
11.数组
静态初始化:初始化和数组元素的赋值操作同时进行
int[] ids = new int[]{121, 121};
动态初始化
String[] names = new String[5];
12.内存的简化结构
二位数组:
String[ ] [ ] arr2 = new String[ 3 ] [ 2 ] ;
String[ ] [ ] arr2 = new String[ 3 ] [ ] ;
String[ ] [ ] arr2 = new String[ ] [ ] { {1,2,2 }, {1,2}, {1,12,2}};
[ ] 放在标识符或者变量名后
没初始化过内层,数据是引用类型,未初始化所以指向的是null,引用类型的变量只能存储两种值:null或地址值
13.Arrays工具类
数组常见方法的操作工具类
sort方法用的是快排
14.面向对象
类的成员:属性、方法、构造器、代码块、内部类
三大特征:封装性、继承性、多态性、(抽象)
pop与oop
对象的内存解析:
通常说的栈是虚拟机栈
属性(成员变量)与局部变量的对比:
局部变量:形参、方法内、代码块内
调用时需要显式赋值,加载到堆空间
成员变量:可以使用权限修饰符:private、public、proptected、缺省、final,实例变量和类变量(静态变量static修饰)
加载到栈空间
对象数组
15.匿名对象
只能调用一次,new phone().name
16.重载
同名方法,与返回值类型无关,只看参数个数和类型是否不同
可变个数的形参:
和数组不构成重载,必须声明在末尾,最多声明一个可变形参
如果变量是基本数据类型,赋值的是数据值,引用数据类型保存的是数据的地址值
参数传递的两个小技巧
1.方法内终止方法外的输出
system.exit(0);
终止jvm运行
2.重写打印流方法
重载和重写的区别
17.封装
将类的属性private私有化,提供公共的set和get方法来获取
单例模式
类只能用public、default
构造器,系统默认提供一个空参的构造器,如果显式定义了类的构造器后,系统就不再提供默认的空参构造器
属性的赋值过程:
18.JavaBean
类是公共的
有一个无参的公共的构造器
有属性,且有对应的get、set方法
UML类图
19.继承
extend
重写细节:
子类的访问修饰符不能小于父类的
创建子类对象时,会间接调用父类的构造方法,所以子类中会有父类的结构
子类的堆空间里需要有父类的结构,就是通过调用super()来获取:
20.多态性
(虚拟方法调用:多态的情况下,父类里面和子类相同名参的方法,执行的是子类重写父类的方法)
是一个运行时行为,运行时才知道new的是哪个子类对象,进而调用对应的方法
前提:类的继承关系;方法的重写
当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法,当时调用子类的方法调用不了
编译时的状态;有了对象的多态性后,我们在编译期,只能调用父类声明的方法,运行时执行的是子类重写父类的方法
运行时的状态
用例:传参的父类设计为Object类型,或连接多种数据库的链接时用统一的父类
对象的多态性只适用于方法不适用于属性,
person的id是1001
man extends person 的id是1002
person p2 = new man();
21.向下转型、自动装箱
向下转型:B b1 = (B)a,需要有子父类关系
**自动装箱:**基本数据类型包装成引用类,原本需要new一下,Java5.0后不需要再new,直接Integer n1 = 1即可赋值
**自动拆箱:**调用包装类的xxxValue() ,5.0后直接可以把包装类对象赋给基本数据类型,不需要再调用方法。
String类中重载的valueOf可以把基本或包装类转换成字符串
调用parseXxx(String s) 字符串变成基本或包装类
22.object
线程wait、notify、notifyall、clone、equals()定义的方法内容和==相同、toString、getClass()反射相关、hashCode、finalize()调用gc垃圾回收机制前的方法、
23. == 和 equals()
==:
- 比较基本数据类型,比较两个变量保存的数值是否相等
- 比较的是引用类型,比较两个变量的地址值是否相等(变量类型需一致,否则编译报错)
equals(Object obj)方法
适用于引用类型,
String、Date、File、包装类等都重写了object方法,比较的是实体内容是否相同。
重写:1.先比较引用地址是否相同;2.比较类型是否相同;3.编译器中可自动生成,toString方法也可自动生成
24.单元测试JUnit
1.当前工程add libraries-JUnit4
2.创建的Java类:public、提供公共构造器、测试的方法无形参、返回值
3.单元测试方法上要声明注解@Test,导入对应包
4.无异常,绿条通过
25.包装类Wrapper
(Byte、Short、Integer、Long、Float、Double)父类为number、Boolean、Character,无法直接加减乘除运算
针对八种基本数据类型定义对应的引用类型-包装类(封装类),让基本数据类型也有类的特征
Integer类中定义了一个内部类,有一个封装加载好的integer数组,使用自动装箱的时候,取值的数值在-128到127之间,调用的是数组中的值。不用再去new,提升效率
26.static
静态,
可以修饰属性、方法、代码块、内部类
修饰属性:静态变量,类的多个对象共享同一个静态变量,一个修改别的也修改过
- 静态变量随着类的加载而加载,早于对象的创建
- 可以通过类.静态变量 进行调用,类只会加载一次,变量在内存中存一份
- 静态方法中只能调用静态的方法和属性,方法内不能使用this和super
- 工具类中的方法习惯上声明为静态的
- static final : 全局常量
27.单例模式(Singleton) *
某个类只产生一种对象实例,该类只提供一个获取的方法,其构造器的访问权限为private,内部产生该类对象
应用场景:计数器、日志应用、数据库连接池、读取配置文件的类、任务管理器、回收站
//饿汉式:
//线程安全
Class Bank {
//创建私有的构造器
private Bank(){
}
private static Bank instance = new Bank();
public static Bank getInstance(){
return instance;
}
}
//*******************************************************
//懒汉式,未改进:存在线程不安全
Class Bank {
//创建私有的构造器
private Bank(){
}
private static Bank instance = null;
public static Bank getInstance(){
if(instance == null){
instance = new order();
}
return instance;
}
}
//改写成线程安全:
Class Bank {
private Bank(){
}
private static Bank instance = null;
//方式一:
public static synchronized Bank getInstance(){
if(instance == null){
instance = new order();
}
return instance;
}
//方式二: 效率慢
public static Bank getInstance(){
synchronized(Bank.class){
if(instance == null){
instance = new order();
}
return instance;
}
}
28.代码块
{
//1.用来初始化类、对象,可以调用非静态或静态
}
static{
//随着类的加载而执行一次,只能调用静态的属性和方法
}
29.抽象类和抽象方法
关键字:abstract
修饰类、方法
修饰类:
- 此类不能实例化
- 抽象类中一定有构造器,便于子类对象实例化时调用
修饰方法:
- 只有方法的声明,没有方法体
- 抽象类中可以没有抽象方法,有抽象方法一定是抽象类
- 子类重写了所有的抽象方法,才可以实例化,否则子类也是抽象类
30.匿名类
public class Test{
public static void main(String[] args) {
//p是Person的一个匿名子类的对象(抽象类的匿名子类对象、多态性)
Person p = new Person(){
@Override
public void eat(){
syso;
}
}
//匿名对象
method(new XXX());
//匿名子类的匿名对象
method(new Person(){
@Override
public void eat(){
syso;
}
});
}
}
public static void method1(Person p){
p.eat();
}
abstract class Person {
void eat();
}
31.模板方法设计模式 *
父类中易变的部分抽象出来,供给不同的子类实现
32.接口
关键字:interface
“多重继承”
接口就是规范,是一组定义好的规则
/* 1.接口中不能定义构造器
2.通过implements实现接口调用
3.需要覆盖所有抽象方法,此实现类就可以实例化,没有实现完成需声明为抽象类
4.接口之间可以多继承
接口的使用上,体现了多态性,接口不能产生实例需要用实现的类去完成
*/
//jdk7以前,只能定义 **全局常量** 和抽象方法,书写时可以省略, 注意是常量final
interface F{
public static final int MAX_A = 7000