JavaSE和JavaWeb基础
Ⅰ、JavaSE
一、Java
1、JDK、JRE和JVM
JRE = JVM + Java标准类库
JDK = JRE + 开发工具集(Javac等编译工具)
2、JavaSE、JavaEE、JavaME
JavaSE:Java标准版
JavaEE:Java企业版
JavaME:为移动设备提供了基于Java环境的开发和应用平台
3、Java程序执行流程
源文件->编译器->字节码文件->解释器->program
二、Java常量和变量
变量和常量注意命名规则,变量的命名必须是小写开头,后面的字母全部大写开头,常量字母必须全部是大写。
1、标识符命名规则
- 必须由字母、数字、下划线和美元符组成
- 首字母只能是字母、下划线和美元符
- 不能是关键字和保留字
- 严格区分大小写
- 要有意义
2、关键字
abstract | boolean | break | byte | case | catch |
---|---|---|---|---|---|
char | class | continue | default | do | double |
else | extends | false | final | finally | float |
for | if | implements | import | native | int |
interface | long | instanceof | new | null | package |
private | protected | public | return | short | static |
super | switch | synchronized | this | throw | throws |
transient | true | try | void | volatile | while |
3、数据类型
-
数据类型:
1、基本数据类型
2、引用数据类型 -
基本数据类型:
1、数值型
2、字符型(char)
3、布尔型(boolean) -
数值型:
1、整数类型(byte、short、int、long)
2、浮点类型(float、double) -
引用数据类型:
1、类(class)
2、接口(interface)
3、数组
4、变量的定义和初始化
变量的三个元素:变量类型、变量名和变量值。
变量名的命名规则:1、满足标识符命名规则,2、符合驼峰法命名规则,3、尽量简单,做到见名知意,4、变量名的长度没有限制
5、基本数据类型字面值
数据类型 | 说明 | 字节 |
---|---|---|
byte | 字节型 | 1 |
short | 短整型 | 2 |
int | 整型 | 4 |
long | 长整型 | 8 |
float | 单精度浮点型 | 4 |
double | 双精度浮点型 | 8 |
char | 字符型 | 2 |
boolean | 布尔型 | 1 |
浮点型字面值默认情况表示double类型,也可以在值后面加d或者D,如123.43d或者123.43D
如表示float类型,则需要在字面值后加f或F
6、ASCII码和Unicode编码
ASCII码是美国标准信息交换码
Unicode编码又称为统一码、万国码
char c = '\u005d'
Unicode表示法,在值前缀加上\u
7、类型转换
类型转换分为自动类型转换和强制类型转换
三、Java运算符
1、表达式
2、运算符
四、Java流程控制
1、流程控制语句:顺序、选择、循环
2、选择结构:
if语句
if-else语句
多重if-else语句
嵌套if-else语句
switch语句
3、循环结构:
while循环
do-while循环
for循环
嵌套循环
break语句和continue语句
五、方法
1、方法的声明格式
访问修饰符 返回类型 方法名(参数列表){
方法体;
}
2、方法调用
Demo d = new Demo();
d.show();
3、方法重载
方法名相同,参数列表不同
4、可变参数列表
- 可变参数一定是方法中的最后一个参数
- 数组可以传递给可变参数的方法,反之不行
- 在重载中,含有可变参数的方法是最后被选中的
5、方法的传值问题
基本数据类型传值
- 方法中对参数的修改,不会对主方法中传来的变量值产生影响
引用数据类型传值
-
方法中对数组的改变,会影响主方法中传来的数组
-
无参无返回值方法
public void getNum(){} -
无参有返回值方法
public int getNum(){} -
有参无返回值方法
public void getNum(int a,int b){} -
有参有返回值方法
public int getNum(int a,int b){} -
数组作为方法参数
public void printArray(int[] arr){}
六、面向对象
1、理解面向对象
关注现实存在的事物的各方面的信息,从对象的角度出发,根据事物的特征进行程序设计
对象:用来描述客观事物的一个实体
类:具有相同属性和方法的一组对象的集合
对象有作用域的。作用域决定了在该范围内定义的变量名的可见性和生存周期。
2、对象实例化
实例化对象的过程可以分为2个部分:
声明对象--放在栈内存中
实例化对象--放在堆内存中
3、this关键字
this:当前对象的默认引用
this的使用
调用成员方法
调用重载的构造方法
七、Java封装
1、理解封装
- 通关该类提供的方法来实现对隐藏信息的操作和访问
- 隐藏对象的信息
- 留出访问的接口
特点:
- 只能通过规定的方法访问数据
- 隐藏类的实现细节,方便修改和实现
2、包
- 管理Java文件
- 解决同名文件冲突
定义包:
package com.xx.animal
- 必须放在源文件的第一行
- 一个Java源文件只能有一个package语句
- 包名全部英文小写
- 命名方式:域名倒叙+模块+功能
2、static
- static+属性
- static+方法
- static+类
- static+方法内局部变量
- static+代码块
八、Java继承
1、理解继承
概念:
- 一种类与类之间的关系;
- 使用已存在的类的定义作为基础建立新类;
- 新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。
特点:
- 利于代码复用;
- 缩短开发周期
语法:
使用extends继承父类
单一继承,只能有一个父类
2、继承后的初始化顺序
父类静态成员->子类静态成员->父类对象构造->子类对象构造
3、super
- 子类的构造过程中必须调用其父类的构造方法,默认调用无参的构造方法。
- 如果子类构造方法中既没有显示标注,而父类又没有无参构造方法。则编译出错。
- 使用super调用父类指定的构造方法,必须在子类的构造方法的第一行。
4、super和this
this:当前对象的引用
- 访问当前类的成员方法
- 访问当前类的成员属性、
- 访问当前类的构造方法
- 不能在静态方法中使用
super:父类对象的引用
- 访问父类的成员方法
- 访问父类的成员属性
- 访问父类的构造方法
- 不能在静态方法中使用
构造方法调用时,super和this不能同时出现。
5、方法重写和方法重载
方法重写:
- 在满足继承关系的子类中
- 方法名、参数列表与父类相同
- 返回值小于等于父类(即可以是子类)
- 访问修饰符的限定范围大于等于父类方法
方法重载:
- 在同一个类中
- 方法名相同
- 参数个数、顺序、类型不同
- 返回值类型、访问修饰符任意
6、访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | true | false | false | false |
默认 | true | true | false | false |
protected | true | true | true | false |
public | true | true | true | true |
7、Object类
- Object类是所有类的父类
- Java的每个类都可以使用Object中定义的方法
- equals()
- toString()
8、final
- 修饰类表示不允许被继承
- 修饰方法表示不允许被子类重写
- 修饰变量表示不允许被修改
- 可配合static使用
注意:
final修饰的方法可以被继承
引用类型的变量:初始化之后不能再指向另一个对象,但指向的对象的内容是可变的。
9、注解
可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用对这些元素进行说明、注释。
按照运行机制分:
- 源码注解
- 编译时注解
- 运行时注解
按照来源份:
- 根据JDK的注解
- 来自第三方的注解
- 我们自己定义的注解
九、Java多态
1、理解多态
-
编译时多态(设计时多态):方法重载
-
运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。
-
我们平时说的多态,多指运行时多态。
-
向上类型转换:将子类型转换为父类型
- 隐式/自动类型转换,是小类型到大类型的转换。
-
向下类型转换:将父类型转换为子类型
- 强制类型转换,是大类型到小类型
-
通过instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题,提高代码的强壮性。
2、抽象类和抽象方法
应用场景:
某个父类只是限定其子类应该包含怎样的方法,但是不需要准确知道这些类如何实现这些方法。
抽象类
public abstract class Animal{
}
抽象方法
public abstract void eat();
注意:
- 抽象类不能直接实例化
- 子类如果没有重写父类所有的抽象方法,则也要定义为抽象类
- 抽象方法所在的类一定是抽象类
- 抽象类中可以没有抽象方法
3、接口
- 接口定义了某一批类所需要遵守的规范
- 接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法
语法:
修饰符+interface+接口名[extends 父接口1,父接口2]{}
注意:
- 接口可以实现多继承,即一个子接口可以同时继承多个父接口
- 实现接口的类如果不能实现所有接口中待重写的方法,则必须设置为抽象类
- 一个类可以继承自一个父类,同时实现多个接口
4、内部类
- 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
- 与之对应,包含内部类的被称为外部类
内部类的分类
- 成员内部类
- 静态内部类
- 方法内部类
- 匿名内部类
内部类的优势:
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包的其他类访问该类,更好的实现了信息隐藏。
十、Java异常
1、程序中的异常
- 在程序运行过程中,意外发生的情况,背离我们程序本身意图的表现,都可以理解为异常。
- 利用Java的异常机制,我们可以更好地提升程序的健壮性。
- 在Java中,通过Throwable及其子类描述各种不同的异常类型。
2、异常处理
在Java应用程序中,异常处理机制为:抛出异常,捕捉异常。
通过5个关键字来实现:try、catch、finally、throw、throws
3、try-catch-finally
实际应用中的经验和总结:
- 处理运行时异常时,采用逻辑去合理规避同时辅助try-catch处理
- 在多重catch块后面,可以加一个catch(Exception)来处理可能会被遗漏的异常。
- 对于不确定的代码,也可以加上try-catch,处理潜在的异常
- 尽量去处理异常,切忌只是简单地调用printStackTrace()去打印输出
- 具体如何处理异常,要根据不同的业务需求和异常类型去决定
- 尽量添加finally语句块去释放占用的资源
4、throw-throws
- 可以通过throws声明将要抛出何种类型的异常,通过throw将产生的异常抛出
- 如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处用throws字句来声明抛出异常。
注意:
当子类重写父类抛出异常的方法时,声明的异常必须是父类方法所声明异常的同类或者子类。
5、自定义异常
- 可以通过自定义异常描述特定业务产生的异常类型
- 所谓自定义异常,就是定义一个类,去继承Throwable类或者它的子类
5、异常链
- 当捕获一个异常后再抛出另一个异常时,如果希望将异常发生的原因一个传一个串起来,即把底层的异常信息传递给上层,就形成了异常链。
十一、Java包装类
基本类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
十二、Java字符串
- String和StringBuilder、StringBuffer
清楚String三者的区别,String是不可变的,StringBuilder和StringBuffer都是可变的 - 两个类的常用方法
- 在String中的 == 和 equals()方法的区别
- String和StringBuilder的区别,主要是不可变性