1、包(package)
包(package)是Java中用于组织、管理相关类和接口的命名空间机制,相当于文件系统中的文件夹。
包的核心作用在于解决命名冲突、控制访问权限、组织代码结构以及提供全局唯一标识。
- 避免命名冲突:完整类名是包名.类名,比如java.util.Date类
- 声明:Java源文件的第一行(注释除外)使用
package 关键字声明类所属的包,例如 package com.example.util;
- 未声明:类属于默认包,非常容易引起名字冲突,不推荐
- 控制访问权限:与Java的访问控制修饰符结合
- private(私有):仅在当前类内部可见。
- default(默认权限 / 包私有权限):仅在当前包内可见(同包内的类可以访问)
- protected(受保护权限):同包内可见,且不同包中的子类可见(通过继承关系访问,不能通过父类引用跨包访问)。
- 同一个包:任何类都可以通过
new 父类().protectedMember访问,因为protected对同包可见。
- 跨包子类:使用继承关系(
super.或this.)访问protected成员。
- this.成员:访问当前子类对象的成员。如果子类没有定义,则沿继承链向上查找父类的。
- 跨包子类:不能通过“父类的引用”(即
new 父类().protectedMember)来访问,创建的是一个独立的父类对象。
- public(公共权限):全局可见。
- 组织代码:按功能、模块对代码进行分组
- 提供唯一标识:通过反转域名(如
com.example.util)命名,保证包名的全局唯一性
- 导入:import java.util.ArrayList;
2、类
类与对象介绍:参考Python的OOP介绍
- final修饰:类不能被继承、方法不能被重写、常量值不能改变。
- static修饰:变量和方法可通过类名访问。
- 测试框架中接口用途:定义测试模板方法为接口,让不同的测试类实现自己的测试逻辑。
- 测试框架中抽象类用途:抽取公共的测试准备和清理代码 定位为抽象类,避免重复。
|
类的声明:
[访问修饰符] class 类名 [extends 父类] [implements 接口列表] { ... }
- extends:指定当前类继承的父类(单继承)。
- implements:用于实现接口,一个类可以实现多个接口,接口名之间用逗号分隔。
抽象类:public abstract class 类名(使用 abstract 关键字声明)
- 抽象类不能被实例化,可以包含抽象方法(无方法体)和具体方法
- 抽象方法:没有方法体、没有具体的实现
类的成员声明:
成员变量:[访问修饰符] [static] [final] 数据类型 变量名 [= 初始值];
构造方法:与类同名,无返回值(不能写 void),用于初始化对象状态,支持重载。
--public class_name(){}
成员方法:[访问修饰符] [abstract] [static] [final] 返回值类型 方法名(参数列表) { 方法体 }。
- 形参:定义方法使用的参数,String name(需要指定类型)
- 实参:调用方法使用的参数,"张三"(不需要指定类型)
- 返回值:return xx(void 不用return)
- 方法重写:方法体一般不同(方法名、参数、返回值相同)
- 方法重载:参数不同(个数,类型,顺序),方法名相同
|
// 文件名: PersonTest.java
// 这个文件包含了 Person 类的定义和包含 main 方法的启动类// ---------- Person 类的定义 ----------
// 类名通常首字母大写
class Person {
// 成员变量 (属性)
private String name;
private int age;
// 常量 (使用 final 关键字)
public static final String SPECIES = "智人";
// 无参构造方法
public Person() {
this.name = "未知";
this.age = 0;
}
// 有参构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 方法 (行为)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void introduce() {
System.out.println("我是"+ name+",今年" + age + "岁。");
}
// 静态方法
public static void sayHello() {
System.out.println("你好,我是人类。");
}
}
// ---------- 包含 main 方法的启动类 ----------
// 这个类是程序的入口,用于测试 Person 类
public class PersonTest {
public static void main(String[] args) {
// 1. 测试无参构造创建对象
Person person1 = new Person();
System.out.print("person1: ");
// 输出:我是未知,今年0岁。
person1.introduce();
// 2. 测试有参构造
Person person2 = new Person("李四", 25);
System.out.print("person2: ");
// 输出:我是李四,今年25岁。
person2.introduce();
// 3. 测试setter和getter
person1.setName("王五");
// 输出:王五
System.out.println("修改后的名字: " + person1.getName());
// 4. 测试静态方法和常量
// 输出:智人
System.out.println("人类物种: " + Person.SPECIES);
// 输出:你好,我是人类。
Person.sayHello();
}
}
|
|
接口的声明:
[访问修饰符] interface 接口名 [extends 父接口列表] { ... }
- extends:接口支持多继承(即一个接口可以继承多个父接口,用逗号分隔)。
接口的成员:
- 主要由常量和抽象方法组成(Java 8 及以后支持默认方法和静态方法,Java 9 及以后支持私有方法)
- 常量:
int MAX_SIZE = 100; 等价于 public static final int MAX_SIZE = 100;
- 抽象方法:
void doSomething(); 等价于 public abstract void doSomething();
- 默认方法:default void log() { ... }、必须提供方法体
- 静态方法:static void print() { ... }、必须提供方法体
|
// 接口通常以 I 开头或以 able 结尾
public interface IEatable {
// ---------- 接口中的变量默认是 public static final (全局常量)
String MEAL_TYPE = "食物"; // 等价于 public static final String MEAL_TYPE = "食物";
// ---------- 抽象方法 (默认 public abstract,无需显式写) ------
void eat(); // 只声明,不实现
// ---------- 默认方法 (Java 8 新增,允许接口有默认实现) --------
// 相当于给接口方法一个“兜底”实现,实现类可以选择覆盖或不覆盖
default void chew() {
System.out.println("默认咀嚼方式。");
}
// ---------- 静态方法 (Java 8 新增,通过接口名调用) ----------
static void digest() {
System.out.println("人类需要消化食物。");
}
}
|