包装类 抽象类 内部类 接口
一、包装类
维度 | 内容 | ||||||||||||||||||||||
解释 | 把 8 种基本类型变成真正的对象,才能放进集合、调用工具方法。 | ||||||||||||||||||||||
语法规则 | 8 个类:Byte/Short/Integer/Long/Float/Double/Character/Boolean 装箱:Integer.valueOf(10) 或自动 Integer i = 10; 拆箱:i.intValue()或自动 int x = i; 常量池:IntegerCache 缓存 -128~127 工具方法:parseInt("123")、MAX_VALUE、MIN_VALUE | ||||||||||||||||||||||
必背代码 | int n = Integer.parseInt(args[0]); | ||||||||||||||||||||||
高频考点 | `==` 比较的是对象地址;`equals()` 比较的是数值;`Integer.valueOf(200) != Integer.valueOf(200)` (超出缓存范围)。 |
二、抽象类
维度 | 内容 | ||||||||||||||||||
解释 | 不能 new 的“半完成模板”,子类必须补全它的抽象方法。 | ||||||||||||||||||
语法规则 | 关键字:`abstract class` 抽象方法:`abstract void draw();` (无方法体)可以包含:普通方法、构造器、变量、 常量继承:子类必须实现所有抽象方法,否则子类也要声明为 `abstract`不能 `final`(自相矛盾) | ||||||||||||||||||
必背代码 | <br>abstract class Shape { <br> abstract double area(); <br>} <br>class Circle extends Shape { <br> double r = 1;<br> public double area() { return Math.PI*r*r; } <br>} <br> | ||||||||||||||||||
高频考点 | 抽象类有构造器,但只能被子类调用;抽象类 vs 接口:抽象类可保存状态,接口不能。 |
三、内部类
维度 | 内容 | ||
一句话 | 写在另一个类里面的类,逻辑上属于外部类,语法上可直接访问外部成员。 | ||
四大形态 | 1️⃣ 成员内部类(非 static) 2️⃣ 静态内部类(static) 3️⃣ 局部内部类(方法/代码块里) 4️⃣ 匿名内部类(一次性实现接口/抽象类) | ||
语法规则 | 成员内部类:`Outer.Inner in = new Outer().new Inner(); 静态内部类:`Outer.Inner in = new Outer.Inner(); 访问权限:成员内部类可访问外部私有变量;静态内部类只能访问外部静态成员 | ||
必背代码 | <br>class Outer { <br> private int x = 1; <br> class Inner { void print(){ System.out.println(x); } }<br>}<br>new Outer().new Inner().print(); // 输出 1<br> | ||
高频考点 | 匿名内部类常用于事件监听:`new Thread(() -> System.out.println("run")).start();` |
四、接口
1.接口的概念及定义
如果一个类中的全部方法都是抽象方法,全部属性都是全局常量,那么此时就可以将这个类定义成一个接 口。 定义格式:
interface 接口名称{ 全局常量 ; 抽象方法 ;
}
面向接口编程思想
接口是定义(规范,约束)与实现(名实分离的原则)的分离的思想。
优点:
降低程序的耦合性
易于程序的扩展
有利于程序的维护
因为接口本身都是由全局常量和抽象方法组成,所以接口中的成员定义可以简写: 1.全局常量编写时,可以省略 public static final 关键字,例如: public static final String INFO = "内容" ; 简写后:String INFO = "内容" ; 2.抽象方法编写时,可以省略 public abstract 关键字,例如: public abstract void print() ; 简写后:void print() ;
2.接口的实现 implements
接口可以多实现,格式:
class 子类 implements 父接口1,父接口2...{}
class 子类 extends 父类 implements 父接口1,父接口2...{}
如果一个接口要想使用,必须依靠子类。 子类(如果不是抽象类的话)要实现接口中的所有抽象方法。
3.接口的继承
接口因为都是抽象部分, 不存在具体的实现, 所以允许多继承,例如:
interface C extends A,B{}
继承相当于扩展了接口的方法
4.default方法
在接口中,可以定义default方法。例如,把Person中的say()方法改为default方法
实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。
// 定义一个可唱歌的接口
public interface Singer {// 抽象方法:具体怎么唱由实现类决定void sing();// 默认方法:提供一个通用的“练习”实现// 实现类可以直接使用,也可以按需重写default void practice() {System.out.println("Singer is practicing basic scales.");}
}// 实现类:只需关心 sing(),也可选择重写 practice()
class PopSinger implements Singer {@Overridepublic void sing() {System.out.println("🎤 PopSinger sings a love song.");}
}// 测试
public class SingerDemo {public static void main(String[] args) {Singer singer = new PopSinger();singer.sing(); // 调用实现类的方法singer.practice(); // 调用接口提供的默认方法}
}
5.接口与抽象类的区别
抽象类要被子类继承,接口要被类实现。
接口只能声明抽象方法,抽象类中可以声明抽象方法,也可以写非抽象方法。
接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
抽象类使用继承来使用, 无法多继承。 接口使用实现来使用, 可以多实现
抽象类中可以包含static方法 ,但是接口中不允许(静态方法不能被子类重写,因此接口中不能声明 静态方法)
接口不能有构造方法,但是抽象类可以有