最近花了一周左右重新回顾了Java基础,深感路漫漫其修远兮,在此把个人认为有价值的点列出来,希望能加深记忆
1.Java运行机制
2.标识符命名规范
- 见名知意
- 类名、接口名:驼峰法(HelloWorld)
- 变量名、方法名:首字母小写,后面每个单词首字母大写
- 常量名:全部字母大写
3.数据类型
基本数据类型:byte short int long char boolean float double
引用类型:如String
基本类型转换(除Boolean
):
自动转换:容量小 >>> 容量大
byte<short(char)<int<long<float<double
强制转换:容量大 >>> 容量小(可能缺失精度)
默认int类型为赋值的字面值类型
当整数字面值没有超出byte、short、char
取值范围时,可直接赋值多种数据类型混合运算,先转换成容量最大的那种数据类型再做运算
4.运算符
^(异或) 两边只要不一样,结果为true
&&(短路与) 效率更高(推荐)
ll(短路或) 效率更高(推荐)
5.控制语句
switch()括号中的类型只能为int或String(byte short char可自转int)
6.方法
- 内存结构
堆内存和方法区内存各有一个。一个线程一个栈内存
栈内存(Stack):存储方法体中的局部变量
堆内存(Heap):存储new创建的对象
方法区内存:存储代码片段、静态变量
- 重载
同一个类中,方法名相同,参数列表不同,构成重载
- 递归(调用自身)
public static int sum(int n){
if(n==1){
return 1;
}
return n*sum(n-1);
}
7.面向对象
- 封装(属性加上
private
,通过setter
与getter
方法 访问) - 继承 (子类继承父类除构造函数以外的所有数据,是方法覆盖与多态机制的前提)
- 多态 (关键是理解Java程序有编译期与运行期两个阶段)
8.发生方法覆盖(override/overwrite)的条件
- 发生在具有继承关系的两个类之间
- 相同的方法名、返回值类型、参数列表,只有方法体不同
- 重写的方法不能比被重写的方法拥有更低的访问权限
- 重写的方法不能比被重写的方法抛出更宽泛的异常
- 私有方法不能被覆盖、静态方法不需要覆盖、构造方法不存在覆盖
- 覆盖和成员变量无关
9.static关键字
- 静态变量:当所有对象都有这个属性、并且这个属性对应的值都是一样的,这时声明为静态变量
静态变量在类加载时初始化,并且只初始化一次 - 静态方法:一般工具类采用静态方法,方便调用
- 静态代码块:static{},在类加载时执行。{}实例语句块,在构造方法调用之前执行
10.super关键字
定义:super指的是当前子类中的父类型特征
构造方法中的this与super:
- this:构造方法调用构造方法
- super:通过子类构造方法调用父类构造方法
语法规则:一个构造方法第一行如果没有this(...)也没有显式去调用super(...),系统会默认第一行调用super()
this与super的使用都是建立在对象的基础上,而static方法没有对象,所以不能用于static方法中
11.final关键字
final代表最终的、不可更改的
final修饰的变量一旦赋值不可改变
final修饰的方法无法被覆盖
final修饰的类无法被继承
12.抽象类(abstract)
语法规则:
- 无法被实例化
- 虽然无法实例化,但抽象类也有构造方法,是用于子类调用的
- 在抽象类中可定义抽象方法,抽象方法没有方法体
- 一个非抽象类继承抽象类,必须将父类中的抽象方法覆盖
13.接口(interface)
语法规则:
- 接口中只能出现常量(public static final)、抽象方法(public abstract),括号内容可直接省略
- 一个类可以实现多个接口
- 接口与接口之间,可多继承
- 一个非抽象类实现接口,必须将接口中所有方法实现(implements)
接口的作用:
- 可以使项目分层,所有层都面向接口开发,提升开发效率
- 接口使代码之间的耦合度降低,变得“可插拔”
For Example:
从以下代码可以发现,ServiceImpl与Test面向接口编程,互相分离
Engine.java(Service)
public interface Engine {
void start();
}
Honda.java/YAMAHA.java/.....(ServiceImpl)
public class Honda implements Engine {
@Override
public void start() {
System.out.println("Honda!!!");
}
}
public class YAMAHA implements Engine {
@Override
public void start() {
System.out.println("YAMAHA!!!!!");
}
}
Car.java(Test)
public class Car {
private Engine e;
public Car(Engine e){
this.e=e;
}
public void drive(){
e.start();
}
}
14.异常(Exception)
语法规则:
- throws(抛出异常,跟在方法名后),将异常推卸给上层
- try(可能会抛出异常的代码)...catch(具体异常)...finally(必定执行的代码),将异常捕捉并解决
- getMessage()返回异常关键信息,printStackTrace()返回异常的详细信息
For Example:自定义异常与手动抛出异常
IllegalText.java(自定义异常类)
public class IllegalText extends Exception {
//定义异常一般提供两个构造方法
public IllegalText(){}
public IllegalText(String msg){
super(msg);
}
}
CustomService.java(相关业务类)
public class CustomService {
public void register(String name) throws IllegalText{
if(name.length()<6){
IllegalText e = new IllegalText("长度底于6!");
throw e;
}
System.out.println("格式通过!");
}
}
Test.java(测试类)
public class Test {
public static void main(String[] args) {
String name="jack";
CustomService cs=new CustomService();
try{
cs.register(name);
}catch(IllegalText e){
System.out.println(e.getMessage());
}
}
}