Java 入门通关秘籍——4
Java 入门通关秘籍 · Day 10一、 接口 (Interface)1. 概念定义接口是一种标准、规范是接口的实现者和接口的使用者都必须遵循的约定。本质它只规定“你能做什么”方法声明不关心“你怎么做”方法实现。2. 语法与特点关键字“interface”特点编译后生成独立的 “.class” 文件。不能创建对象不能 “new”但可以声明引用。属性默认是 “public static final”公开、静态、常量必须初始化。方法默认是 “public abstract”公开、抽象没有方法体。构造方法接口没有构造方法。3. 实现类语法“class 类名 implements 接口名 {}”规则如果实现类不想成为抽象类必须实现接口中所有的抽象方法。实现方法的访问修饰符必须是 “public”因为接口方法是 public实现不能缩小权限。接口可以多实现一个类可以同时实现多个接口“class A implements B, C {}”。4. 接口的继承多继承接口与接口之间是多继承关系“interface A extends B, C {}”。单继承类与接口之间是实现关系类单继承多实现。5. 接口的作用扩充子类能力弥补 Java 单继承的不足。降低耦合度将接口的定义与实现分离使用者只依赖接口不依赖具体实现。6. 接口回调概念先有接口的使用者再有接口的实现者。应用常用于解耦例如定义回调接口由第三方去实现具体逻辑。二、 总结接口 vs 抽象类记忆口诀接口是“规范”抽象类是“模板”。接口全抽象抽象类半抽象。接口无构造抽象类有构造。接口多实现抽象类单继承。Java 入门通关秘籍 · Day 11一、 内部类 (Inner Class)1. 概念定义定义在一个类内部的类。优势可以直接使用外部类的私有成员而不破坏外部类的封装性。分类成员内部类、静态内部类、局部内部类、匿名内部类。2. 成员内部类位置定义在类以内方法以外和成员变量同级。特点类似于实例变量。**创建对象依赖外部类对象**必须先有外部类对象才能创建内部类对象。Outer o new Outer();Outer.Inner i o.new Inner();访问外部成员可以直接访问外部类的私有成员。限制成员内部类中不能定义静态成员静态变量和静态方法。指代外部对象“外部类名.this” 代表当前外部类对象。3. 静态内部类位置定义在类以内方法以外同时被 “static” 修饰。特点类似于静态变量。创建对象不依赖外部类对象直接通过外部类名创建。Outer.Inner i new Outer.Inner();访问外部成员只能访问外部类的静态成员静态变量和静态方法。可定义静态成员内部可以定义静态变量和静态方法。4. 局部内部类位置定义在方法内部。特点类似于局部变量。创建位置必须在定义它的方法内部创建。访问限制可以访问外部类的成员。可以访问方法内的局部变量但局部变量必须是 “final” 修饰JDK 8.0 及以上版本默认隐含 “final”称为“语法糖”。5. 匿名内部类概念一个特殊的局部内部类。特点没有名字。必须继承一个类或实现一个接口。基于一个匿名内部类只能创建一个对象。语法接口名 引用名 new 接口名() {// 接口中需要实现的方法};优缺点优点减少代码量让编程思路连贯常用于事件监听、回调。缺点可读性差代码不易维护。6. 应用场景成员内部类需要访问外部类私有成员且对象生命周期与外部类关联紧密时。静态内部类只需要访问外部类静态成员且不希望依赖外部类实例时。局部内部类只在某个方法内部临时使用且仅使用一次时。匿名内部类快速实现接口或继承类通常用于简化代码如GUI 事件监听、线程创建。总结四种内部类对比Java 入门通关秘籍 · Day 12一、 Object 类 (所有类的老祖宗)1. 介绍位置位于 “java.lang” 包中。地位它是所有类的父类直接父类或间接父类。作用如果一个类没有显式继承其他类那么它默认继承 “Object”。因此Object 类中的方法所有类都可以直接使用。2. 常用方法“getClass()”作用返回对象的实际类型Class对象。应用常用于判断两个引用是否指向同一个具体类型。“hashCode()”作用返回对象的哈希码值整数。原理通常将对象在堆内存中的十六进制地址转换为十进制整数。不同对象哈希码一般不同。“toString()”作用返回对象的字符串表示形式。默认实现通常是 “类名哈希码”。开发建议子类通常会重写此方法以便返回更有意义的属性信息如 “return name “,” age;”。“equals(Object obj)”作用比较对象的内容是否相同。默认实现其实底层就是 “”即比较两个引用的地址是否相同。开发建议子类通常需要重写此方法用于比较对象内部的属性值是否一致。“finalize()”作用垃圾回收器回收垃圾对象时自动调用。注意开发者一般不重写此方法因为它执行时机不可控。3. 与 equals 的区别 (面试高频)“” (双等号)基本数据类型比较数值是否相等。引用数据类型比较地址是否相等即是否指向同一个对象。“equals()”默认行为继承自 Object等同于 “”比较地址。实际应用通常被重写用于比较对象的内容是否相等。重写原则先判断地址是否相同this obj再判断类型是否相同最后比较属性。二、 包装类 (Wrapper Class)1. 概念背景Java 是面向对象语言但基本数据类型int, char等不是对象。为了将它们纳入面向对象体系提供了对应的包装类。位置位于 “java.lang” 包自动导入。2. 基本数据类型与包装类对应表3. 数据转换 (装箱与拆箱)装箱 (Boxing)基本数据类型 - 包装类“Integer i new Integer(12);” // 手动装箱“Integer i 12;” // JDK5.0 自动装箱 (编译器自动转换)拆箱 (Unboxing)包装类 - 基本数据类型“int a i.intValue();” // 手动拆箱“int a i;” // JDK5.0 自动拆箱注意频繁装箱拆箱会影响性能。4. 字符串与基本数据类型的转换String - int“int num Integer.parseInt(“123”);”int - String“String s String.valueOf(123);” 或 “” 123注意字符串转数字时字符串必须是纯数字否则会报“NumberFormatException”。三、 String 类 (重点)1. 创建方式直接赋值“String s1 “hello”;”特点先去字符串常量池找如果有就直接引用没有才创建。节省内存。new 关键字“String s2 new String(“world”);”特点不管常量池有没有都会在堆内存开辟新空间创建对象。区别“s1 s2” 结果为 “false”因为它们指向不同的内存地址一个在池一个在堆。2. 常用方法“charAt(int index)”获取指定下标字符。“length()”获取字符串长度。“equals(Object obj)”比较内容是否相同重写了 Object 的方法。“contains(String str)”判断是否包含子串。“split(String regex)”切割字符串返回数组。“trim()”去除首尾空格。“indexOf()” / “lastIndexOf()”查找字符/子串位置。3. 字符串的特点不可变性一旦创建内容不能改变。每次拼接或修改都会生成新的对象。优缺点安全多线程但频繁修改效率低。四、 可变长的字符串 (StringBuilder StringBuffer)1. 为什么要用它们解决 String 不可变导致的频繁创建对象、效率低的问题。2. 区别StringBufferJDK 1.0 版本线程安全效率低。方法加了 synchronizedStringBuilderJDK 5.0 版本线程不安全效率高。推荐使用3. 常用方法“append(任意类型)”追加内容返回自身对象。“insert(int offset, 任意类型)”插入内容。“reverse()”反转字符串。五、 BigDecimal 类 (了解)1. 作用用于精确的浮点数计算解决 float/double 计算精度丢失问题如 “0.1 0.2 ! 0.3”。2. 常用方法加法“add()”减法“subtract()”乘法“multiply()”除法“divide()” 注意除法可能需要指定保留位数和舍入模式如 “divide(bd2, 2, BigDecimal.ROUND_HALF_UP)”3. 注意事项构造方法建议使用 “String” 参数传入如 “new BigDecimal(“0.1”)”而不是 “new BigDecimal(0.1)”后者仍可能有精度误差。