JAVABASIC
day1-java
J2se(标准版/基础版):主要提供了小型应用程序以及桌面服务解决方案
J2ee(企业版/商业版):主要针对企业中模块化开发以及集中化开发提供了解决方案
J2me(小型版/移动版):主要针对于嵌入式开发以及终端开发提供了可能
jre=jvm+核心类库(提供了java程序启动时必须的信息)
jdk=jre+kit(开发工具包)
安装jdk会在jdk内部安装一个jre,根据提示安装会再安装一个外部jre
地址栏输入cmd可以直接打开所在文件夹的命令行
.java文件:源文件-->经过编译-->.class文件:字节码文件
1..class文件的名称和类名一致
2.如果是公共类,要求.java文件的名称和类名一致
3.有几个类就有几个.class文件,如果出现了大小写同类名的问题,第一个类名生效,最后一个类的内容生效
4.一个.java文件中至多只能出现一个公共类
一个电脑可以安装多个jdk,在eclipse中可以配置Installed JREs来选择使用哪个jre,Compiler为系统编译使用的版本,如果和配置的jre不同,可能会在编译时报错。系统环境变量中的jdk为eclipse使用的jdk,不需更改,不安装无法打开eclipse
day2-type
java命令:
javac编译
java运行
javadoc生成文档
命名规范:
类名/接口名:XxxYyyZzz
方法名/变量名:xxxYyyZzz
包:xxx.yyy.zzz
常量:XXX_YYY_ZZZ
整数的不同表现形式:
二进制:以0b开头,0b100=4
八进制:以0开头,0100=64
十进制:默认就是十进制,100=100
十六进制:以0x开头,0x100=256,522就是十六进制的1314
正码:如果是正数符号位为0,如果是负数符号位为1
反码:正数的原码和反码一致,负数的反码是在原码的基础上符号位不变,数值位按位取反
补码:正数的原、反、补一致,负数是在反码的基础上末尾加1
java底层的数据运算都是用补码来计算的
java是一个强类型的语言,保证每个数据都有对应的类型表示
数据类型:
基本数据类型(四类八种)(占用字节)(一个字节占8个位):
整型:byte(字节1)(-128~127)/short(短整2)(-23768~23767)/int(整型4)(占32个位)(-2^31~2^31-1)(-2147483648~2147483647正负二十多亿)/long(长整8)
浮点:float(单精度4)/double(双精度8)
布尔:boolen(布尔1)
字符:char(字符2)(0~65535)
按所占位数记忆:
1个字节8位(bit):byte字节
2个字节16位:short,char
4个字节32位:int,float
8个字节64位:long,double
boolen(单独使用4个字节,在数组中使用1个字节)
编码:把文字转换为数字的过程
ASCII表(半个字节)--西欧码表(ISO8859-1个字节)--BIG5(繁体中文2个字节)--GB2312(简体中文2个字节)--国标码GBK(包含繁简体2个字节)--Unicode(编码体系)中包含UTF-8(3个字节)
所有的完整码表默认兼容西欧码表
类型转换:
隐式类型转换:
1.不可以隐式转换为char类型
2.byte、char、short在底层都是以int来存储数据的,无论做任何操作都会类型提升为int类型
3.int可以类型提升为long
4.整型提升为浮点型可能存在舍入误差
5.float可以类型提升为double
类型提升顺序:byte、char、short-->int-->long-->float-->double
short s='中';不报错,short s='达';会报错:java会对值进行类型检查,如果是字符类型就会转换成相应的编码值
强制类型转换:
1.浮点型转整型时舍弃小数位
2.可能会出现意想不到的数((byte)128会输出-128)
如果等号右边都是常量,在编译时会先进行计算,再把最后结果进行給值
引用数据类型(数组、类、接口):
day3-math&logical
逻辑运算符:
1.&:遇见false则false
2.|:遇见true则true
3.^:相同为false,不同为true(异性相吸,同性相斥)
4.!:取反
5.&&:双与,有短路效果
6.||:双或,有短路效果
交换两个整数值:
效率:2(异或(只能整数))、3(求和(一般适用于整数))、1(中间变量(开发中常用))
位运算符:>>右移<>>无符号右移
优先级:
()!~++--*/%+-<<>>>>>关系&^|&&||三元赋值
day4-switch&while
选择结构:ifelse/switch
循环结构:for/while/dowhile
day5-javamemory&array
输出数组得到:[I@4ec4d412
这个区域代表的是
对象[(代表的是对@代表后面
象是数组)是地址值
[I@4ec4d412
这块区域代表的是哈希码值的十六进
对象的元素类型---制表现形式
I(数组元素类型是int)
java内存五个分区:
栈stack:存储是变量(暂时),如果存储内容不再使用,立即清除不会对存储的内容进行赋值
堆heap:存储的是对象,如果存储的对象不再使用,会在某个时间被回收,会对存储的内容赋予系统默认初始值
方法区(面向对象)
本地方法栈
寄存器
new:在堆里开辟空间,所有在堆里开辟空间,系统都会赋予初始值
byte、short、int---0
char---'\u0000'
long---0L
float---0.0F
double---0.0
boolean---false
引用类型---null
=共享:两个引用指向同一块内存空间
foreach循环只能做遍历不能做其他操作,foreach循环相当于把数组里的内容复制出来一份进行操作,不会影响数值
day6-array2d&function
copyOf可以用来扩容和缩容
数组支持所有数据类型,所存储的类型都是相同的
冒泡排序:
int[] arr = { 3, 1, 6, 8, 5, 2 };
for (int i = 1; i < arr.length; i++) {
for (int j = 1; j <= arr.length - i; j++) {
if (arr[j - 1] > arr[j]) {
// 用中间值交换数值
// int temp = arr[j - 1];
// arr[j - 1] = arr[j];
// arr[j] = temp;
// 用异或方式交换数值:^
arr[j - 1] = arr[j - 1] ^ arr[j];
arr[j] = arr[j - 1] ^ arr[j];
arr[j - 1] = arr[j - 1] ^ arr[j];
}}}
System.out.println(Arrays.toString(arr));
基本数据类型存在栈中,引用数据类型存在堆中
方法的传值问题:
如果实参是基本数据类型,传入的是值的拷贝
如果实参是引用数据类型,传入的是地址值的拷贝
方法存在栈中,如果实参是基本数据类型,方法中修改数值不改变,如果实参是引用数据类型,则方法中修改数值会改变,但是如果只是给数值重新new,则依然不会改变。
day7-class
递归一定要有一个结束标志,否则代码会无限循环下去
递归次数过多的时候会出现栈溢出的错误
类是对象的概括,对象是类的实现
构造方法:与类同名且没有返回值类型的方法
在java中所有的非静态属性和方法都可以通过对象调用
构造代码块:在构造方法之前先执行
局部代码块:在方法中{} 用于控制变量的生命周期,提高内存利用率
局部变量和成员变量:
位置:
局部变量:方法里或者代码块内
成员变量:方法外,类以内
内存方面:
局部变量:栈
成员变量:堆
生命周期:
局部变量:随着方法被调用或者执行代码块开始产生,方法调用结束或者代码块执行完毕而消除
成员变量:随着对象的创建而产生,随着对象的被回收而被销毁
day8-oop
访问修饰符 本类 子类 同包类 其他类
public 可以 可以 可以 可以
protected 可以 可以 可以 不可以
default 可以 可以 可以 不可以
private 可以 不可以 不可以 不可以
只有public可以修饰类
子类的方法访问权限修饰符要么和父类一致,要么大于父类的方法访问权限修饰符的范围
子类无法继承父类的private方法、构造方法、构造代码块
protected修饰的内容如果在其他类中,其子类对象要在子类的本类中才能使用
重写和向上造型都属于多态
day9-static&final&abstract
静态变量会随着类的加载而加载
静态变量不可以定义在构造方法中,静态变量与类同级,构造方法与对象同级
静态方法会随着类的加载而加载,不会对静态方法赋予系统默认的初始值,可以被类名调用也可以通过对象调用
静态方法中不可以定义静态变量,静态方法被调用的时候里面的内容才被加载执行
静态方法中不可以使用this,静态方法与类同级,this与对象同级
main方法可以直接使用或调用非静态变量或方法吗?不可以
静态修饰的内容只能直接调用静态信息,非静态的内容可以直接调用静态信息以及非静态信息
System.arraycopy()
Arrays.copyOf()
Arrays.toString()
Arrays.sort()
静态方法重载?可以
静态方法重写?不可以,静态方法与类同级,重写针对的是对象,所以没有重写。 在父子类中如果出现方法签名一致的方法,要么都是静态静态(但是不是重写),要么都是非静态方法就是重写
抽象类:一个方法要么有抽象abstract,要么有方法体{}
所有子类对父类的某个方法都进行了不同程度的重写,这个父类方法的方法体就没有意义,把方法体去掉用abstract修饰就变成了抽象方法,一个类中出现了抽象方法这个类就要变成抽象类
如果一个普通类继承抽象类需要重写所有的抽象方法,如果不想全部重写就变为抽象类
抽象类中可以没有抽象方法
抽象类可以创建对象?不可以 底层C语言可以根据构造方法创建出对象,但是这个对象拿不到
抽象方法可以被private/static/final?不可以,因为抽象方法必须重写
抽象类可以被final?不可以,因为抽象类需要可以被继承
day10-interface&package
接口不是类,但接口编译后也是.class文件
普通类实现了接口就要重写所有的抽象方法,如果不想重写就要把类变成抽象类
接口无法定义构造方法,所以接口不能创建对象
接口中都是抽象方法?不一定,jdk1.8以前是对的,从jdk1.8开始java支持接口中可以定义实体方法
jdk1.8在接口中的新特性:
1.接口中允许定义实体方法(static、default)
2.Lambda表达式---重写接口中的抽象方法(接口中只能有一个抽象方法---函数式接口)
四种内部类:方法内部类、成员内部类、静态内部类、匿名内部类
接口中定义内部类,以及内部接口(类里定义一个接口或者接口里定义一个接口)默认都是被static修饰
java包:
1.java原生包:
lang包:核心类库 在程序启动的时候会自动加载包
下的所有内容 使用的时候不用导包
util包:提高了大量的操作类与对象的工具类 工具包
applet、awt包:图形化界面
io:数据传输
math:提供了简单的数学运算
net:网络数据传输
nio:高并发
security:安全
sql:操作数据库
text:格式化 3.46
time:提供了时间和日期
2.javax扩展包
3.org第三方厂商包
day11-gc&object
通知系统进行垃圾回收:System.gc();
Object重要方法:
.clone()
.finalize()
.getClass()
.hashcode()
.toString()
.equals()
day12-String&char
java中为什么String中的S要大写?
原因:
java中的八种基本数据类型,分别是:
boolean,byte,short,int,long,char,float,double
它们还分别对应八种封装好的类:
Boolean,Byte,Short,Integer,Long,Character,Float,Double
而String也是java中封装好的一个类。不是基本数据类型。String类是常量(final)型的,也就是定义的数据不可修改
总结解释如下:
①String 不属于Java语法的一部分,而是基于Java语法封装的一个类(Java的类风格是首字母大写)
②基本数据类型int,final,double等是基本语法组成的一个部分
日常写代码的时候应注意:java规范中要求常量名必须大写
day13-pattern
day14-math&date&exception
Math包下的类(BigDecimal用于精确运算,BigInteger用于超大数操作)
日期(SimpleDateFormat日期转字符串以及字符串转日期)
jdk1.8开始java.time包下有了关于时间和日期的新类
Throwable是异常的定义父类
Error(不能处理)
Exception(可以处理)
编译时异常:编译时出现,必须处理(抛出或捕获)
运行时异常:运行时出现,可以处理也可以不处理
子类不能抛出比父类更大的编译时异常
day15-collection&list&set
list添加的下标大于list长度则在最后添加,不会报错:list.add(6, "1");
如果删除的下标大于list长度则会报错list.remove(9);
ArrayList基于数组实现,默认长度为10,默认扩容是基于扩容运算在原来的基础上加上一半