一、文档注释:
文档注释是Java特有的,注释内容可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该文件的说明文档
javadoc -d 生成后存放文档的文件夹名 -author -version XXX.java
二、命名规范
1.标识符的命名规范
- 由26个英文字母大小写,0-9,$,_ 组成
- 数字不可以开头
- 不可以使用关键字或保留字,但可以包含
- 对大小写敏感
- 标识符不能包含空格
2. Java中命名规范(驼峰原则)
- 包名:多单词组成时所有字母都小写,xxxyyyzzz
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
- 变量名、方法名:多单词组成时,第一个单词的首字母小写,其他单词的首字母都大写,xxxYyyZzz
- 常量名:所有字母都大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ
三、byte、char、short做运算
- byte、char、short这三种类型做运算(包括同种类型之间做运算)时,结果都是int类型
- 整型常量默认为int型
- 浮点型常量默认为double型
- char类型有且只能放一个字符
- 使用 +=,*=,-=,/=,%=进行计算后结果仍然是原来的类型
四、四种进制的表示
- 二进制(binary):0,1,满2进1,以
0b或0B
开头 - 八进制(octal):0-7,满8进1,以
0
开头 - 十进制(decimal):0-9,满10进1
- 十六进制(hex):0-9及A-F(a-f),满16进1,以
0x或0X
开头表示
五、右移运算符和无符号右移运算符
- 右移运算符: >> 如果最高位为0,则补0,如果最高位为1,则补1
- 无符号右移运算符: >>> 无论最高位为0还是1,都补0;
六、交换两个数的方法
1.定义临时变量
int num1 = 10;
int num2 = 20;
int tmp = num1;
num1 = num2;
num2 = temp;
2.不定义临时变量
/**
只适用于数值类型
相加时可能超出存储范围
*/
int num1 = 10;
int num2 = 20;
num1 += num2; //执行之后num1 = 30,num2 = 20
num2 = num1-num2;//执行之后num1 = 30,num2 = 10
num1 = num1-num2;//执行之后 num1 = 20,num2 = 10
3.用位运算符
/**原理:a与同一个数异或两次等于a*/
/**只适用于数值类型*/
int num1 = 10;
int num2 = 20;
num1 = num1^num2;
num2 = num1^num2;
num1 = num1^num2;
七、switch结构中的表达式
- switch结构中的表达式,只能是如下的6种数据类型之一:byte,short,char,int,枚举类型(JDK5.0之后新增的),String类型(JDK7.0之后新增的)。
- case之后的值只能是常量
八、数组
1. 一维数组
//声明
int[] ids;
//静态初始化:数组的初始化和数组元素的赋值操作同时进行
ids = new int[]{1001,1002,1003,1004};
//动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];
2.二维数组
//声明
int[][] ids;
//静态初始化:数组的初始化和数组元素的赋值操作同时进行
ids = new int[][]{{1,2,3,4},{5,6,7},{8,9}};
ids = {{1,2,3,4},{5,6,7},{8,9}};//也是正确的写法
//动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[][] names = new String[5][3];
String[][] name= new String[5][];
3.数组的默认初始化值
- 数组元素是整型:0
- 数组元素是浮点型:0.0
- 数组元素是char型: 0(ASCII码)或“\u0000”
- 数组元素是boolean型:false
- 数组元素是引用类型:null
注意:成员变量(属性)的默认初始化也是这些值
九、数据结构与算法
1、数据结构
- 数据与数据之间的关系:集合、一对一、一对多、多对多
- 数据的存储结构
- 线性表:顺序表(如数组),链表,栈,队列
- 树形结构:二叉树等
- 图形结构:有向图、无向图等
2.算法
- 排序算法
- 检索算法
十、方法参数的值传递机制
- 形参:方法声明时的参数
- 实参:方法调用时实际传给形参的值
- Java里方法的参数传递只有一种:值传递
- 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
- 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
注意:String类型的变量虽然也是引用类型,但是因为其地址指向的数据是放在
内存中的方法区里的常量池(数据不可修改)
,所以修改String类型的值相当于在常量池中创建一个新的常量,然后把原先的地址改为新的地址
十一、理解“万事万物皆对象”
- 在Java语言范畴中,我们都将功能,结构封装到类中,然后通过类的实例化,来调用具体的功能
- 涉及到Java语言与前端Html、后端的数据库交互时,前后端的结构在Java层面交互时,都体现为类,对象。
十二、可变个数的形参
- JavaSE5.0中提供了Varargs(variable number of raguments)机制,允许直接定义能和多个实参相匹配的形参,从而,可以使用一种更简单的方式,来传递个数可变的实参。
//JDK5.0以前:采用数组形参来定义方法,传入多个同一类型的变量
public static void test(int a,String[] books);
//JDK5.0之后,采用可变个数形参来定义方法,传入多个同一类型的变量
public static void test(int a,String ... books);
- 当调用可变个数形参的方法时,传入参数的个数可以是任意个(0,1,2。。。)
注意:可变个数形参必须写在参数列表的末尾,且一个方法最多只有一个
十三、JavaBean
javabean是一种java语言写成的可重用组件
所谓JavaBean,是指符合如下标准的Java类
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get和set方法
十四、UML类图
十五、MVC设计模式
十六、代码块
- 代码块的作用:用来初始化类、对象
- 代码块如果有修饰的话,只能使用static
- 分类:静态代码块和非静态代码块
1.静态代码块
- 内部可以有输出语句
- 随着类的加载而执行
- 作用:初始化类的信息
- 如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
2.非静态代码块
- 内部可以有输出语句
- 随着对象的加载而执行
- 每创建一个对象就执行一次
- 作用:可以在创建对象时,对对象的属性等进行初始化
- 如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
非静态代码块、静态代码块、构造器的执行顺序
总结为:由父及子,静态先行
对属性赋值的位置和顺序
- 默认初始化
- 显示初始化 || 在代码块中赋值(谁先写,先赋值)
- 构造器中赋值
- 创建对象后,通过”对象.属性或对象.方法“的方式进行赋值
十七、抽象类 abstract
- abstract可以用来修饰
类
和方法
- abstract修饰类:抽象类
- 抽象类不能实例化
- 抽象
类中一定有构造器
,便于子类实例化是调用(涉及:子类实例化的全过程) - 开发中,都会提供抽象类的子类,让子类对象实例化,完成相关操作
- abstract修饰方法:抽象方法
- 抽象方法只有方法的声明,没有方法体
- 包含抽象方法的类一定是抽象类 ,反之,抽象类中可以没有抽象方法
- 若子类重写父类中所有的抽象方法,则该子类可以实例化,若没有重写所有的抽象方法,则该子类也是抽象类
- abstract不能用来修饰属性和构造器
- abstract不能用来修饰私有方法、静态方法、final的方法、final的类
- 抽象了类的匿名子类
创建一匿名子类的对象 Person p = new Person(){ @Override public void eat(){ System,out,println("eating..."); } @Override public void breath(){ System.out.println("fresh air ..."); } }; 其中Person类是抽象类,eat()和breath()都是抽象方法
十八、接口 interface
- 接口就是规范,定义的是一组规则,体现了显示世界中“如果你是/要…则必须能…”的思想。
继承是一个“是不是”的关系,而接口实现则是“能不能”的关系
接口的本质是契约,标准,规范
,就像我们的法律一样。指定好后大家都要遵守
接口的使用
- 接口使用interface来定义
- Java中,接口和类是并列的两个结构
- 如何定义接口:定义接口中的成员
3.1 JDK7及以前:只能定义全局常量和抽象方法
①全局变量
:public static final,但是书写时,可以省略
②抽象方法
:public abstract,但是书写时,可以省略
3.2 JDK8:除了可以定义全局常量和抽象方法之外,还可以定义静态方法和默认方法
①静态方法
:public static,只能
通过接口调用,实现类中是看不到接口中的静态方法的
②默认方法
:public default,通过实现类的对象调用,也可以重写接口中的默认方法。
注意:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数方法
注意:如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下报错——>接口冲突
- 接口中不能定义构造器!意味着接口不能实例化
- 在Java开发中,接口通过让类去实现(implements)的方式去使用
- Java类中可以多实现,弥补了java单继承性的局限性
class extend AA implements BB,CC
接口与接口之间可以多继承
- 接口的具体使用,体现多态性
- 接口实际上可以看做是一种规范
十九、成员内部类
- java中允许将一个类A声明在另一个类中,则A类就是内部类,类B称为外部类
- 内部类的分类: 成员内部类(静态和非静态)vs 局部内部类(方法内、代码块内、构造器内)
- 成员内部类:
- 作为外部类的成员:
①调用外部类的结构:外部类.super.结构
②可以用static修饰
③可以被4中不同的权限修饰 - 作为一个类
① 类内可以定义属性、方法、构造器等
②可以被final修饰
③可以被abstract修饰
关注三个点:
- 如何实例化内部类:
- 静态的成员内部类:
外部类.内部类 变量名 = new 外部类.内部类();
- 非静态的成员内部类:
外部类 outer = new 外部类(); 外部类.内部类 inter = outer.new 内部类();
- 如何在成员内部类中区分调用外部类的结构:
外部类.super.结构
- 开发中内部类的使用
- 局部内部类