Java基础:匿名内部类、Object方法、包装类与包权限详解

江岸
江岸
发布时间:2026-10-16| 6人浏览过
原创

本文详细讲解了Java基础进阶内容,包括利用匿名内部类简化代码、重写Object类核心方法以实现对象比较与展示、掌握基本数据类型与包装类的自动装箱拆箱及转换技巧,以及明确Java包的编译机制和private、protected等访问权限的实际应用场景。

1、匿名内部类的应用

内部类是指在另一个类的内部定义的类,而匿名内部类则是没有具体名称的内部类。通常在接口实现或抽象类继承的场景下,若某个子类仅需实例化一次,直接使用匿名内部类可以避免定义冗余的类文件。

第1步:基于接口的匿名内部类

目的:在不创建独立实现类的情况下完成接口方法的调用。

操作示例:传统方式需定义独立的 MessageImpl 类,使用匿名内部类可如下处理:

interface IMessage {
    public void print();
}
class Demo {
    public static void get(IMessage msg) {
        msg.print();
    }
}
public class TestDemo1 {
    public static void main(String args[]) {
        // 直接实例化接口并实现方法
        IMessage msg = new IMessage() {
            public void print() {
                System.out.println("hello,world!");
            }
        };
        Demo.get(msg);
    }
}

第2步:基于抽象类的匿名内部类

注意:只有抽象类和接口适合使用匿名内部类,普通类不建议这样继承。

abstract class Message {
    public abstract String getInfo();
    public void print() {
        System.out.print(this.getInfo());
    }
}
public class TestDemo1 {
    public static void main(String args[]) {
        // 传递匿名内部类对象
        Demo.get(new Message() {
            public String getInfo() {
                return "www.baidu.com";
            }
        });
    }
}

2、Object类核心方法重写

Java中所有类默认继承自 Object 类。在实际开发中,通常需要重写其 toString()、equals() 等方法以满足特定的对象状态输出和比较需求。

第3步:重写 toString() 获取对象信息

操作:自定义 Person 类并重写 toString,以便直接打印可读性强的信息。

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "name = " + this.name + ", age = " + this.age;
    }
}
// 测试: System.out.print(p.toString()); 输出格式化字符串

第4步:重写 equals() 进行逻辑比较

原理:Object默认的 equals 比较的是内存地址(同 ==),重写后通常用于比较对象的实际属性值。

@Override
public boolean equals(Object anObject) {
    if (anObject == null) return false;
    if (this == anObject) return true;
    if (!(anObject instanceof Person)) return false;
    Person per = (Person) anObject;
    return this.name.equals(per.name) && this.age == per.age;
}

注意:若参数类型定义为子类类型(如 equals(Person p)),则属于重载而非覆写,会导致多态失效。

3、包装类与自动装箱/拆箱

为了解决基本数据类型无法作为对象处理的问题,Java提供了八种包装类(Integer, Double, Boolean等)。JDK 1.5之后引入了自动装箱与拆箱机制。

第5步:理解装箱与拆箱

装箱:int 转为 Integer;拆箱:Integer 转回 int。

// 自动装箱与运算
Integer var = 10; 
int result = var; 
System.out.println(++var * result); // 可直接参与数学运算

陷阱提示:比较两个装箱后的数值时,== 可能返回意外结果(受缓存池影响),建议使用 equals()。

第6步:字符串与基本类型的转换

String 转 基本类型:使用各包装类的 parseXxx() 静态方法。

int num = Integer.parseInt("16");
double d = Double.parseDouble("16.");
boolean b = Boolean.parseBoolean("true");

基本类型转 String:

  • 拼接空字符串:String str = num + "";(不推荐,易产生垃圾)。
  • 推荐使用:String.valueOf(num)。

4、包管理、导入与访问控制权限

通过包(Package)组织类可以解决命名冲突,使用 package 声明目录结构,并通过 javac -d . 进行打包编译。

第7步:包的导入与潜在冲突

使用 import cn.mldn.util.*; 可导入指定包下所有类。若同时导入多个包含同名类的包(如 cn.mldn.info 和 cn.mldn.util),编译器会报错“引用不明确”,此时必须使用完整限定名(如 cn.mldn.util.Message)来指定类。

5、访问控制权限的深度解析

Java提供四种权限修饰符,其严格程度从高到低依次为:private, default(缺省), protected, public。

第8步:正确理解 Protected 权限

适用范围:同一包内所有类、不同包内的子类。

关键案例:若类A(位于包a)继承了父类B(位于包b),且在B中将变量标记为 protected,则在A的子类中可以直接访问该变量。但若在非子类且跨包的类中尝试访问,则会报错。

总结建议

  • 设计原则:成员属性一律使用 private 封装,对外提供 public 访问方法。
  • 慎用 protected:仅在需要被子类覆写或调用的特定场景下使用。
  • Jar打包:可使用 jar -cvf my.jar package_name 打包类文件,运行时需要配置好 CLASSPATH。

以上就是Java基础进阶之匿名内部类、Object方法及包装类等内容的详细内容,更多关于Java核心基础语法的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。