类型转换
自动转换
低到高
强制转换
int a = 0;
long b = (long) a;
for循环
for(int i = 0;i < 5;i++){...
}
增强for
int []a = new int [10];
for(int x:a)(sout(x);
)
方法
public static int max(int n1,int n2){return (n1 > n2 ? n1 : n2);
}
方法重载
//相同名字,不同参数列表
public static int max(int n1){return;
}
类与对象
Java类与对象详解
1. 类(Class)
-
定义:类是对象的蓝图或模板,用于描述一类对象的共同属性和行为。
-
组成:
- 属性(成员变量):描述对象的特征(如颜色、品牌)。
- 方法(成员函数):定义对象的行为(如加速、刹车)。
- 构造方法:用于初始化对象(与类同名,无返回值)。
-
示例:
public class Car {// 属性private String color;private String brand;private int speed;// 构造方法public Car(String color, String brand) {this.color = color;this.brand = brand;this.speed = 0;}// 方法public void accelerate(int increment) {if (increment > 0) {speed += increment;}}public void displayInfo() {System.out.println("品牌:" + brand + ",颜色:" + color + ",当前速度:" + speed + "km/h");} }
2. 对象(Object)
-
定义:对象是类的实例,拥有类中定义的属性和方法。
-
创建对象:使用
new
关键字调用构造方法。Car myCar = new Car("红色", "丰田"); // 创建一个Car对象
-
访问属性和方法:通过点号
.
操作。myCar.accelerate(20); // 调用方法 myCar.displayInfo(); // 输出:品牌:丰田,颜色:红色,当前速度:20km/h
3. 类与对象的关系
-
类比:类像建筑设计图,对象是按图纸建成的房子。
-
独立性:不同对象属性独立。例如:
Car yourCar = new Car("蓝色", "本田"); yourCar.accelerate(30); // myCar和yourCar的速度互不影响
4. 封装(Encapsulation)
-
目的:保护数据,隐藏实现细节。
-
实现:将属性设为
private
,通过公有方法访问。public class Car {private int speed;// Getter方法public int getSpeed() {return speed;}// Setter方法(带校验)public void setSpeed(int speed) {if (speed >= 0) {this.speed = speed;}} }
5. 静态成员(static)
-
归属:属于类本身,而非对象。
-
示例:
public class Car {private static int numberOfCars = 0;public Car() {numberOfCars++; // 每创建一个对象,计数器+1}public static int getTotalCars() {return numberOfCars;} }
System.out.println("已创建汽车数量:" + Car.getTotalCars()); // 直接通过类名访问
6. 完整示例
public class Main {public static void main(String[] args) {Car myCar = new Car("红色", "丰田");myCar.accelerate(20);myCar.displayInfo(); // 输出:品牌:丰田,颜色:红色,当前速度:20km/hCar yourCar = new Car("蓝色", "本田");yourCar.accelerate(30);yourCar.displayInfo(); // 输出:品牌:本田,颜色:蓝色,当前速度:30km/h}
}
7. 关键区别
类(Class) | 对象(Object) |
---|---|
抽象模板(定义属性/方法) | 具体实例(占用实际内存) |
程序编译时存在 | 程序运行时动态创建 |
通过 class 关键字定义 |
通过 new 关键字实例化 |
接口
一、接口是什么?
想象你要造一台手机,先列出一个「必须有的功能清单」:
- 打电话
- 发短信
- 能充电
这个清单就是「接口」!它不管手机怎么实现这些功能,只规定「必须要有这些功能」。
用代码表示:
// 定义接口(功能清单)
interface Phone {void call(); // 打电话(没有具体实现)void sendSMS();// 发短信void charge(); // 充电
}
二、接口怎么用?
假设你要造一个华为手机,必须按照接口的清单实现所有功能:
// 实现接口(具体造手机)
class HuaweiPhone implements Phone {// 必须实现接口的所有方法!public void call() {System.out.println("用5G打电话");}public void sendSMS() {System.out.println("发送带表情的短信");}public void charge() {System.out.println("超级快充");}
}
三、为什么要用接口?
场景1:统一标准
- 所有手机都必须实现相同的功能,但实现方式不同
- 比如苹果手机的充电方式可能和华为不同
场景2:灵活扩展
- 你可以同时让手机支持「拍照功能」的接口
class HuaweiPhone implements Phone, Camera {// 实现两个接口的功能
}
场景3:隐藏细节
- 用户只需要知道「能打电话」,不需要关心是4G还是5G实现的
四、接口的特性(记住这3点)
-
不能直接创建对象(就像不能直接使用「功能清单」打电话)
// 错误! Phone p = new Phone(); // 正确:用实现了接口的类 Phone p = new HuaweiPhone();
-
所有方法默认是抽象的(Java 8前)
- 没有方法体(即没有
{}
中的具体代码) - 实现类必须重写所有方法
- 没有方法体(即没有
-
变量默认是常量(自动加
public static final
)interface USB {int VERSION = 3; // 等同于 public static final int VERSION = 3; }
五、接口 vs 抽象类
最容易混淆的问题!一张表看懂:
接口(interface) | 抽象类(abstract class) | |
---|---|---|
方法 | 默认全是抽象方法 | 可以有抽象和具体方法 |
变量 | 只能是常量 | 可以是普通变量 |
继承 | 类可以实现多个接口 | 类只能继承一个抽象类 |
设计理念 | 「能做什么」的能力 | 「是什么」的层级关系 |
通俗理解:
- 抽象类:比如「动物」抽象类,派生出「猫」「狗」
- 接口:比如「会游泳的」「会飞的」,不同动物可以选择实现
六、实际例子:USB接口
1. 定义USB标准
interface USB {void transferData(); // 传输数据void plugIn(); // 插入
}
2. 不同设备实现
class Mouse implements USB {public void transferData() {System.out.println("传输鼠标移动数据");}public void plugIn() {System.out.println("USB-A接口接入");}
}class SSD implements USB {public void transferData() {System.out.println("高速传输文件");}public void plugIn() {System.out.println("USB-C接口接入");}
}
3. 使用接口
public class Computer {public static void main(String[] args) {USB device1 = new Mouse();USB device2 = new SSD();device1.plugIn(); // 输出:USB-A接口接入device2.transferData(); // 输出:高速传输文件}
}
七、Java 8 后的新特性
为了不增加初学者的负担,你只需要知道:
-
默认方法(default methods)
接口中可以写具体实现的方法,用default
修饰interface USB {default void showVersion() {System.out.println("USB 3.0");} }
-
静态方法
直接用接口名调用interface USB {static void description() {System.out.println("通用串行总线");} }// 使用 USB.description();
八、练习小任务
- 定义一个「动物」接口,要求有
eat()
和sleep()
方法 - 创建「猫」和「狗」类实现这个接口
- 尝试让「狗」类同时实现「会游泳」的接口