Java-语法速查:包(package)、类、public/private

1、包(package)

包(package)是Java中用于组织、管理相关类和接口的命名空间机制,相当于文件系统中的文件夹。

包的核心作用在于解决命名冲突、控制访问权限、组织代码结构以及提供全局唯一标识。

  • 避免命名冲突:完整类名是包名.类名,比如java.util.Date类
    • 声明:Java源文件的第一行(注释除外)使用 package 关键字声明类所属的包,例如 package com.example.util;
      • 一个文件只能有一个package声明。
    • 未声明:类属于默认包,非常容易引起名字冲突,不推荐
  • 控制访问权限:与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("人类需要消化食物。"); } }

 

posted @ 2026-07-30 14:21  FengweiTech  阅读(21)  评论(0)    收藏  举报