1. 安装jdk
一般是安装java8,大部分使用的版本是java8;
然后需要部署java环境变量
2. 编译class文件
javac 文件名.java
3. 执行class文件
编译命令为
java 文件名
配置classpath
路径为.\为当前路径下的class文件名
4. 变量
成员变量:类里面的变量
局部变量:方法里面的变量
变量不能重复定义,在上一级作用域中已经声明的变量在该作用域里不能再次声明该变量
5. 类型
八大基本数据类型↓
6. X进制之间的转换
多少进制就是多少进1;我们日常用的是十进制
进制转换:
二进制1101转十进制为 13
十进制13转二进制为 1101
8进制转换
7. 在不同类型之间运算时,会按照类型级别由高到低地统一为统一为最高级的类型
运算时的类型转换
8. 数组
存储多个相同类型数据的存储模型,数组在初始化时会为储存空间添加默认值
静态初始化:int[] arr = new int[]{ 1,2,3}; 简化格式:int[] arr = { 1,2,3 };
动态初始化:int[] arr = new int[];
数组操作的两个常见问题:
- 索引越界: 访问了数组中不存在的索引对应的元素,造成索引越界;
- 空指针异常: 访问的数组已经不再指向堆内存的数据,造成空指针异常;
- null: 控制,引用数据类型的默认值,表示不再指向任何有效对象;
9. 内存
栈内存:存储局部变量 例如定义在方法中的变量
堆内存:存储new出来的内容(实体, 对象)
栈是临时存储空间,也是方法和变量调用时的临时空间
当new一个对象/数组时,堆里就会创建一个新的地址;
int[] arr = new int[3]
// 栈内存里的arr[0]对应堆内存的new int的堆内存地址“001”
int[] arr2 = arr;
arr2[0] = 100;
// 这里arr[0]也会变为100
10. 方法
- 调用: main(): void类型的方法可以直接调用;非void类型的方法,使用变量接收调用;
- 定义:public static void xxx(){}
- 如果方法没有返回值则使用void声明,有返回值需要声明对应的数据类型并返回数据;如:public static int xxx(){ return 100; }
- 方法重载:类里具有多个相同方法的方法名,且参数不同,则形成方法重载;
11. private
在类中使用private String name被privave定义的name属性,只能通过类内部定义的方法获取和使用,不能被外部访问;
12. this
在类中的方法里存在,this等于当前调用他的对象;
13. 构造方法
无参构造方法 public 类名(){}
有参构造方法 public 类名(int 100){}
无论是否有参最好都在类里声明无参构造方法
14. 一个标准的类应该含有的属性
15. String
String类在java.lang包下,Java程序中所有的双引号字符串,都是String类的对象
JVM只会创建一个String对象,并在字符串池中维护
new出来的string都有自己的堆内存空间,直接赋值的string值存在常量池里,直接调用并共用一个常量池,没有新堆内存
字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])
↑JDK8以前是字符数组,JDK9以后是字节数组
16. StringBuilder
String s = "ni";
s += "hao"
// 在常量池里会创建 ni hao nihao 三个内存地址
StringBuilder s = new StringBuilder;
// 此时s的内容可以随意改变
字符串每次拼接都会构建一个新的String对象,耗时耗内存,使用StringBuilder
解决字符串拼接问题;
八大基本数据类型↓
17. 集合
集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生变化;
- ArrayList<>接收一个泛型,可以根据传入的类型而指定类型;
ArrayList<String> array = new ArrayList<>()
18. 继承
子类被称为派生类
,父类称为基类,超类
// public class 子类名 extends 父类名 {}
public class Zi extends Fu {}
- 好处:提高了代码的复用性,提高了代码的维护性;
- 坏处:增加了类的耦合,削弱了子类的独立性;
- super关键字: 当前对象访问
父类成员属性
的方式,super.成员变量->用来访问父类的成员变量; - 继承中的构造方法: 子类有可能会使用父类的数据,子类初始化之前一定要
先完成父类
的数据初始化,每一个子类构造方法的第一条语句默认都是:super(); - 方法重写:子类可以重写父类中相同名字的成员方法(父类私有方法不能被重写,父类私有成员子类不能继承)
19. 包-就是文件夹,对类的分类
无论是否有参最好都在类里声明无参构造方法
- 权限修饰符
- final: 结扎修饰符,被final修饰的类不能被
继承
;方法不能被重写
;变量不能再次被赋值
基本类型的变量变常量,引用类型的变量地址值不会变地址内容可以改变; - static: 静态修饰符,被类的所有对象共享;静态成员方法只能访问静态成员;
20. 多态
多态的前提
(1)有继承或者实现关系
(2)有方法重写
(3)有父类/接口引用指向子类对象
多态的分类
- 编译型多态:也称为静态多态性或早期绑定(Early Binding)。编译时多态性发生在编译时,是通过函数重载和运算符重载来实现的。在编译时多态性中,编译器根据方法的签名(参数类型和数量)来确定要调用哪个方法。
- 运行时多态:也称为动态多态性或晚期绑定(Late Binding)。运行时多态性发生在程序运行时,是通过方法覆盖(重写)来实现的。在运行时多态性中,程序在运行时根据对象的实际类型来确定要调用的方法。
- 多态的转型:类型转换是将一个引用从其原始类型转换为其父类类型或接口类型的操作
(1)向上转型:将一个子类对象引用赋给一个父类类型的引用变量的过程
(2)向下转型:向下转型是将一个父类类型的引用变量转换为一个子类类型的引用变量的过程,通常需要使用instanceof运算符来检查对象的类型,以避免ClassCastException异常
21. 抽象类
抽象类和抽象方法必须使用abstract
关键字修饰
public abstract class 类名 {}
public abstract void eat();
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
22. 抽象类成员特点
- 有
构造方法
但是不能实例化,用于子类访问父类数据的初始化 - 抽象方法:限定子类必须完成某些动作
- 非抽象方法:提高代码复用性
23. 接口
- 接口用关键字
interface
修饰
public abstract 接口名 {}
- 类实现接口用
implements
表示
public class 类名 implements 接口名 {}
24. 接口的成员特点
(1)成员变量
只能是常量:public static final
(2)构造方法
接口没有构造方法,因为接口主要是对行为进行抽象;一个类没有父类,默认继承Object类
(3)成员方法
只能是抽象方法:public abstract 接口名 {}
25. 抽象类和接口的区别
26. 匿名内部类
new 类名 () {
重写方法
}