类的定义
1. 成员变量(字段
2. 方法
3. 定义格式
public class 类名{
0-N个字段(成员变量)
0-N个方法;
}
对象的创建和使用
1. 创建方式 类名 类变量名 = new 类名();
Student stu = new Student();
2. 给对象成员变量设置值 类变量名.字段名=值
student.name="上云";
3. 获取成员变量的值,数据类型 变量名 = 类变量名.字段名
String name = student.name;
4. 实例方法的调用,类对象名.方法名
student.showInfo();
构造方法
1. 也叫构造器(构造方法),是用来创建对象的,当你创建对象时,一定执行
2. 构造方法:
- 也有修饰符
- 不具备方法的返回值类型
- 可以带参数
- 默认的构造方法,里面没有任何内容
- 构造方法可以重载
3. 构造方法,创建对象时,可以传参
Book book = new Book("E3层");
4. 注意:不提供构造方法时,默认提供一个不带参数的构造器
实例方法
1. 定义方式:
- 具有修饰类型
- 有返回值类型
- 有方法名和参数列表
2. 定义
修饰符 返回值类型 方法名(参数列表){
}
3. 调用方式,使用对象调用。
对象变量名.方法名
4. 空指针异常(没有去创建对象,就是调用对象的属性或者是方法)
导包
1. 如果存在重名的情况,需要去选择自己的包 alt + enter
方法
1. 生活中的方法:处理某件事或者解决某个问题的办法。
2. java中的方法:用来解决某件事情或者实现某个功能的办法。
3.方法的定义
修饰符 返回值类型 方法名(形式参数){
方法体
}
//实现从老代码迭代成新代码
//修饰符 方法无返回 方法名 参数列表
public static void print(String str) {
}
4. 带返回类型的方法定义
修饰符 返回值类型 方法名(形式参数){
方法体
return 返回值类型;
}
5. return 的作用:结束当前的方法,可以单独用,还可以带返回类型用
6. 返回类型:
- 八大基本数据类型
- 引用数据类型
- void(没有返回)
7. 需求:定义加法计算器,带两个参数的,方法返回类型为 int
public static int add(int num1,int num2){
int ret = num1 + num2;
return ret;
}
8. 需求:求5个数的和,返回类型 int
public static int addSum(int... nums) {
int sum = 0;
for (int num : nums) {
sum += num;
}
return sum;
}
9. 注意:方法的可变参数底层实际上就是数组
方法的重载
1. 需求1.0:
- 定义一个求浮点型 double 的计算器
- 定义方法分别去求 float 计算器
- 定义方法分别去求 short 计算器
- 定义方法区求 String 字符串的拼接
- 定义打印 String 类型的字符串方法
- 定义打印 int 类型的方法
- 定义:同一个类里面,方法允许存在一个以上的同名方法,要求参数列表不同
- 参数列表不同:
- 1.参数类型不同
- 2.参数顺序不同
- 3.参数个数不同
- 和返回值类型无关
JVM内存模型变化
1. 栈:是线程私有的,生命周期与线程相同,线程之间不共享,里面拥有多个栈帧
- 局部变量
- 方法内定义的局部变量
- 参数列表变量
- 对象引用(指向对象的引用地址)指向堆里面
2. 堆:是jvm 内存模型最大的一块,被所有共享,在jvm 启动时所创建。
- 存放对象实例(new 对象)并且会给初始值
- 需要垃圾回收机制回收垃圾,
- 配置大小:-Xmx -Xms
- 如果堆中的对象没有被栈引用时,会被垃圾回收器不定时回收。
3. 字符串常量池:存储在类加载完成,经过验证,解析阶段的一些常量字符串。
4. 程序计数器pc:
- 是一块很小的内存区域,记录当前线程执行的字节码的行号指示器,可以去通过计数器控制,指令,循环,跳转。
- 线程私有,每条线程都有自己的程序计数器
5. 方法区
- 类信息,记录类的字节码信息,常量池(String 和 包装类)
6. GC(垃圾回收器):不定时的回收垃圾,回收一些没有引用的堆内存的垃圾,不需要程序员手动操作。
jvm方法执行内存模型变化
方法的递归
1. 定义:方法自己调用自己
2. 需求:
- 不使用递归计算 5 的阶乘
int num = 5;
int ret = 1;
for (int i = 0; i < 5; i++) {
ret *= num--;
}
System.out.println(ret);
public static int recursion(int num) {
if (num == 1) {
return 1;
}
int recursion = recursion(num - 1);
int ret = num * recursion;
return ret;
}
static 关键字
1. static:是一个修饰符,表示静态的,可以用来修饰,方法、字段、代码块、内部类,最优先加载进内存的。
2. 注意:
- static 关键字,表示该资源属于类(而不是属于类对象)。只要使用 static 修饰的,直接使用类名.来调用,
不用创建对象 - 在非 static 方法中,可以去访问 static 方法,但是最好用类名.来调用。
- 在 static 方法中,不能直接访问普通方法
- 静态代码块优先于一切先执行
static {
System.out.println("static 修饰的代码块");
}
3. 什么时候使用 static 修饰的字段以及方法和代码块
- 在开发中,写工具类的时候。
- 资源加载,加载配置文件(mysql jdbc)
深入变量
变量的定义语法:
数据类型 变量名 = 值;
根据位置不同,分为两大类:
1. 成员变量
- 类成员变量(类名.字段名调用)
- 生命周期:从类加载到程序结束
- 使用 static 修饰的,直接定义到类里面的
- 实例成员变量
- 生命周期:从创建对象开始到GC垃圾回收器回收垃圾结束
- 直接定义到类里面的
2. 局部变量
- 生命周期:从变量定义开始,到最近的花括号结束}
- 方法内部的变量
- 参数列表
- 代码块里面的变量
3. 什么时候使用成员变量,什么时候使用局部变量?
- 考虑变量的生存时间(影响内存的开销)
- 能减少作用域都去减少(减少内存开销)
- 定义工具类时(static 用起来比较方便)成员变量封装好,利于我们方法使用
package
1. 类的全限定类名(反射使用)
抽象类
1. 需求:求圆(Circle),矩形(Rectangle)的面积
2. 使用 abstract 关键字修饰,并且没有方法体
3. 使用 abstract 修饰的类特点:
- 必须使用 abstract 关键字修饰,方法没有方法体,留给子类去实现/重写
- 不能使用 private 以及 static 和 final
- 抽象方法必须定义到抽象类中或者接口
- 不能实例化
- 抽象类可以有普通的方法
- 抽象类构造器不能够私有化
接口
1. 什么是接口
统一接口后的意义:根据规范设计产品,可以做到适配性。
- 硬件接口:两个设备之间的连接方式,包含数据传输协议
- type-c,usb,耳机接口
- 软件接口:程序代码,是一种规范
- 买鼠标不会去关心是哪家厂商的,是什么接口
JAVA 接口
1. 定义:使用 interface 关键字
//使用 interface 代替传统的 class
public interface 类名{
//都是抽象方法
void usb();
//定义常量
public static final int EANBLE = 1;
}
2. 注意:
- 接口里面只能去定义抽象方法
- 抽象方法默认提供了 public abstract 修饰符
- 接口不能实例化(和抽象类一样)
3. 接口怎么去实现
- 使用 implements 关键字
4. 接口支持多实现,分别把每个接口的抽象方法都去实现了
5. 接口的多继承
抽象类和接口怎么选择
1. 都可以使用
- 如果你不需要具体的实现时,就用接口。
- 如果说你除了定义规范还有一定的功能,你就用抽象类
模板方法设计模式需求:
1. 统计不同操作的时间用时。
- 使用 String 拼接一万次
- 使用 int 累加 一万次