Java基础重在理解设计原理与避坑:基本类型存值、引用类型存地址,导致==比较字符串易错;数组是对象,下标从0开始,越界抛异常,遍历优先用增强for。

直接上手练,比死记概念快得多。Java基础语法的核心不是背规则,而是理解“为什么这么设计”和“不这么写会出什么问题”。下面用真实开发中高频出现的场景,带你看清每个知识点怎么落地、怎么避坑。
变量与数据类型:别只声明,要懂内存里发生了什么
基本类型(int、boolean等)存值,引用类型(String、数组、类对象)存地址。这个区别决定你是否会在方法传参、判空、比较时踩坑。
- 写int a = 10;,a里直接放数字10;写String s = "hello";,s里放的是一串指向堆中字符数据的地址
- 所以s == "hello"可能为false——因为两个字符串字面量虽内容相同,但地址不同;必须用s.equals("hello")
- 声明Integer i;后直接用i.intValue()会抛NullPointerException,因为i是null,没指向任何对象
流程控制与数组:下标、长度、越界,三者必须闭环验证
数组是第一个暴露“Java是面向对象语言”的结构。它本身是对象,有length属性,不是函数,更不是基本类型。
- 定义int[] arr = new int[3];,arr.length就是3,最后一个合法下标是2——写arr[3]立刻ArrayIndexOutOfBoundsException
- 遍历推荐用增强for:for (int x : arr) { ... },安全、简洁;若需下标,用传统for,但循环条件必须是i ,不能写成i
- 二维数组本质是“数组的数组”,int[][] grid = new int[2][3];生成的是2行、每行3列的规则矩阵;而int[][] jagged = new int[2][];只分配了两行引用,每行还需单独new,否则访问jagged[0][0]直接空指针
面向对象三要素:封装不是加private就完事
封装的重点是“隐藏实现细节 + 提供可控访问”。很多初学者把字段全设private,再挨个加getter/setter,结果代码臃肿又没真正控住逻辑。
立即学习“Java免费学习笔记(深入)”;
- 比如学生类中的年龄字段,设为private后,setter里应校验:if (age 150) throw new IllegalArgumentException("年龄不合法");
- 继承不是为了复用代码,而是为了建立“is-a”关系。不要因为两个类都有name字段,就硬拉一个父类出来;只有当子类确实是父类的一种时(如Dog extends Animal),才用继承
- 多态体现在运行时绑定:父类引用指向子类对象,调用被重写的方法时,执行的是子类版本。这是Spring AOP、策略模式等高级特性的底层支撑
集合与泛型:ArrayList和HashMap不是万能容器
它们是日常开发最常写的类,但底层机制不清,容易写出低效甚至线程不安全的代码。
- ArrayList底层是动态数组,add()在末尾是O(1),但在中间插入是O(n)——因为要移动后续元素;频繁插入建议改用LinkedList(但注意随机访问变慢)
- HashMap默认初始容量16,加载因子0.75,超限会扩容(rehash)。如果已知要存1000条数据,构造时写new HashMap(1024)比默认更省时间
- 泛型是编译期特性,运行时被擦除。所以List
和List 在JVM里都是List,不能用instanceof判断泛型类型


















