Java基础:匿名内部类、Object方法、包装类与包权限详解
本文详细讲解了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核心基础语法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













