复习
- static
- 可以修饰变量、方法、代码块以及内部类
- static修饰的变量称之为静态变量,是在类加载的时候存储到方法区,因此静态变量是先于对象存在,可以不通过对象而通过类名来调用。实际过程中,如果某一些属性是所有对象共享的,那么此时需要将这个属性设置为静态的
- static修饰的方法称之为静态方法,也是在类加载的时候存储到方法区,此时没有执行,而是等到方法被调用的时候才会到栈内存中执行。静态方法中不能直接使用本类中的非静态属性和非静态方法
- static修饰的代码块称之为静态代码块。特点是只在类加载的时候执行一次
- 执行顺序:父类静态 -> 子类静态 -> 父类非静态 -> 子类非静态
- final
- 可以修饰属性、方法和类
- final修饰的属性称之为常量。常量赋值之后不能改变 - 基本类型指的是具体的数据不能改;引用类型指的是地址不能改变
- final修饰的方法称之为最终方法。最终方法不能被重写,可以被继承可以被重载
- final修饰的类称之为最终类。最终类不能被继承
- abstract
- 可以修饰方法和类。修饰的方法称之为抽象方法,修饰的类称之为抽象类
- 抽象方法没有方法体,必须放在抽象类中。抽象方法不能被final、static、private修饰
- 抽象类不能被实例化,不能被final修饰
面向对象
- 可以修饰变量、方法、代码块以及内部类
- static修饰的变量称之为静态变量,是在类加载的时候存储到方法区,因此静态变量是先于对象存在,可以不通过对象而通过类名来调用。实际过程中,如果某一些属性是所有对象共享的,那么此时需要将这个属性设置为静态的
- static修饰的方法称之为静态方法,也是在类加载的时候存储到方法区,此时没有执行,而是等到方法被调用的时候才会到栈内存中执行。静态方法中不能直接使用本类中的非静态属性和非静态方法
- static修饰的代码块称之为静态代码块。特点是只在类加载的时候执行一次
- 执行顺序:父类静态 -> 子类静态 -> 父类非静态 -> 子类非静态
- 可以修饰属性、方法和类
- final修饰的属性称之为常量。常量赋值之后不能改变 - 基本类型指的是具体的数据不能改;引用类型指的是地址不能改变
- final修饰的方法称之为最终方法。最终方法不能被重写,可以被继承可以被重载
- final修饰的类称之为最终类。最终类不能被继承
- 可以修饰方法和类。修饰的方法称之为抽象方法,修饰的类称之为抽象类
- 抽象方法没有方法体,必须放在抽象类中。抽象方法不能被final、static、private修饰
- 抽象类不能被实例化,不能被final修饰
一、interface
- interface在Java中用于定义接口的
- 由于接口中默认定义的方法是抽象方法,所以可以不用写abstract
- 在接口中,所有的方法和属性默认是也只能是public修饰的,所以public可以省略不写
- 接口不能创建对象
- 一个类通过implements关键字来实现接口 - 类和类之间是单继承,类和接口是多实现
- 一个类实现接口之后需要覆盖这个接口中的抽象方法
- 从JDK1.8开始,允许在接口中来定义属性和实体方法。定义在接口中的属性默认是使用public static final修饰的。定义在接口中的实体方法必须用public static来修饰
- 虽然从JDK1.8开始,接口中允许定义实体方法,但是实际开发中一般不会去定义
二、内部类(了解即可)
- 内部类,顾名思义,值得是定义在类中的类。根据内部类的定义位置和修饰符不同,将内部类划分为四种:方法/局部内部类,成员内部类,静态内部类,匿名内部类
- 方法内部类:定义在方法中的类。方法内部类中不能定义静态变量和静态方法,但是可以定义静态常量 - 方法内部类只能在定义它的方法内使用
- 成员内部类:定义在类内方法外的类。成员内部类中也不能定义静态变量和静态方法,但是依然可以定义静态常量
- 静态内部类:定义在类内方法外用static修饰的类。静态内部类不能直接使用外部类中的非静态属性和非静态方法。静态内部类中可以定义静态变量和静态方法
- 匿名内部类:指的是没有名字的类。通过抽象类或者接口来实例化获取到的就是匿名内部类
- 总结:
- 除了静态内部类以外,其他的内部类中都不能定义静态变量和静态方法,只能定义静态常量
- 除了静态内部类以外,其他的内部类可以直接使用外部类中定义的非静态属性和非静态方法
三、包
- 在Java中,通过package关键字来定义包。每一层包会对应的在磁盘上生成一层目录
- package语句必须放在Java文件的首行
- 在Java中,常见的包有三大类:java、javax和org
- java开头的包是Java的核心包 - 自己定义包的时候请不要使用java
- javax开头的包是Java的扩展包
- org/com是第三方厂商提供的,org一般是免费
- import:导包语句。需要将指定包下的某个类或者某些类导入当前的代码中来使用
- Java的核心包中经常使用的包
- java.lang:Java中的基础包。当Java程序运行的时候,ClassLoader自动将java.lang包下的所有的类加载到内存中。所以,在使用java.lang包下的类的时候不需要导包
- java.util:工具包。提供了大量便捷操作的工具类
- java.io:输入输出包。Java程序对数据的读写都是依靠这个包实现的
- java.math:提供了基本数据运算的包
- java.net:网络包。用于进行网络通信的
- java.sql:对数据库进行操作的包
- java.text:对数据进行格式化的。例如保留两位小数等
- java.time:JDK1.8提供的时间包
四、垃圾分代回收机制
- 当Java程序运行的时候,方法和变量会存储到栈内存中。当方法运行完成之后,会立即被移除出栈内存
- 在Java中,对象是存储到堆内存中的。对象被使用完成之后,不会立即移出堆内存,而是会在某一个时刻被垃圾回收器(GC - Garbage Collector)进行解析回收,此时对象所占用的内存才会被释放
- 堆内存对内存结构再次进行了逻辑划分,划分为了新生代/初生代(Young Generation)和老生代(Old Generation)。新生代被划分为了伊甸园区(Eden)和幸存区(Survivor)。Survivor分为两块:From Space和To Space
- 当对象刚被创建的时候,这个对象是放在伊甸园区的。默认情况下,堆内存使用达到了70%的时候,JVM启动了GC。GC启动之后会首先去扫描伊甸园区,将没有被使用的对象解析清理掉。扫描之后,会剩余的存活的对象放到幸存区。如果伊甸园区扫描完成之后,如果堆内存的使用率没有超过70%,那么GC的回收过程到此结束。如果伊甸园区被扫描完成之后,堆内存使用率依然超过了70%,GC就是试着扫描幸存区,然后将幸存区中没有被使用的对象解析回收掉。幸存区扫描完成之后,剩余存活的对象依然放在幸存区中。如果幸存区中的对象经过多轮扫描,对象依然存活,那么此时这个对象才会被放入老生代。老生代中的对象如果被回收,可能会引起系统的卡顿甚至崩溃
- 发生在新生代的回收称之为minor gc(初次回收),发生在老生代的回收称之为full gc(完全回收)
Object
- 在Java中,Object是所有类的根类 - 在Java中,所有的类的父类都是Object - Object是Java中的顶级父类
- 在Java中,被native修饰没有方法体的方法称之为本地方法。本地方法的方体是用其他语言实现的,绝大部分是C/C++
- 重要方法
| 方法 | 解释 |
| getClass | 获取对象的实际类型而不是声明类型 |
| hashCode | 获取对象的哈希码 |
| equals | 判断两个对象是否相等。默认是判断两个对象的地址,实际过程中需要重写这个方法 |
| toString | 将对象转化为字符串。打印对象的时候,默认调用这个对象的toString方法 |



