Java Basics Part 20/20 - Inner Classes

本文深入讲解Java内部类的概念、分类及应用,包括非静态内部类、静态嵌套类、方法内部类、匿名内部类等,并提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java Basics Part 20/20 - Inner Classes

目录


嵌套类

在 Java 中,在类中可以编写另外一个类。类中的类就叫做嵌套类(nested class),包含内部类的类就叫做外部类(outer class)。

语法

编写内部类的语法如下:

class Outer_Demo{
   class Nested_Demo{   
   }   
}

嵌套类分成两种形式:

  • 非静态内部类:这些是类的非静态成员
  • 静态内部类:这些是类的静态成员。

Inner classes


非静态内部类

内部类是 Java 安全机制的一种。Java 的类不可以有 private 这种访问级别,但是如果一个类中存在内部类,那么内部类就可以使 private 的了。

根据内部类定义的位置,可以分为三类:

  • 内部类
  • 方法内部类
  • 匿名内部类

内部类

创建一个内部类是很easy的,只需要在类中编写另外一个类即可,但是与普通的类不同,内部类可以是 private 的,一旦将内部类声明为 private,那么在外部类类外部就无法访问这个内部类了。

例如下面这个程序,将内部类定义成 private 的,通过方法访问这个 private 的内部类:

class Outer_Demo{
   int num;
   //inner class
   private class Inner_Demo{
      public void print(){     
         System.out.println("This is an inner class");
      }
   }
   //Accessing he inner class from the method within
   void display_Inner(){
      Inner_Demo inner = new Inner_Demo();
      inner.print();
   }
}

public class My_class{
   public static void main(String args[]){
      //Instantiating the outer class 
      Outer_Demo outer = new Outer_Demo();
      //Accessing the display_Inner() method.
      outer.display_Inner();
   }

}

// output 
This is an inner class.
访问私有成员

内部类还可以用来访问外部类的私有成员。在内部类中,定义一个方法 getValue() 来返回外部类的私有成员,然后第三方的类就可以使用 内部类的 getValue() 方法来访问外部类的私有成员了。

为了实例化内部类,要先实例化外部类,然后使用外部类对象的引用来实例化内部类。

Outer_Demo outer=new Outer_Demo();
Outer_Demo.Inner_Demo inner=outer.new Inner_Demo();

下面这个例子表明演示了怎样通过内部类来访问外部类的私有成员:

class Outer_Demo {
   //private variable of the outer class
   private int num= 175;  
   //inner class   
   public class Inner_Demo{
      public int getNum(){
         System.out.println("This is the getnum method of the inner class");
         return num;
      }
   }
}

public class My_class2{
   public static void main(String args[]){
      //Instantiating the outer class
      Outer_Demo outer=new Outer_Demo();
      //Instantiating the inner class
      Outer_Demo.Inner_Demo inner=outer.new Inner_Demo();
      System.out.println(inner.getNum());
   }
}

// output
The value of num in the class Test is: 175

方法内部类

在 Java 中,我们甚至可以在方法中编写一个类,那么这个类就变成了一个局部类型,就像局部变量一样,这个类的作用范围就是在方法中。

一个方法内部类只能在定义它的方法中实例化。举例:

public class Outerclass{

   //instance method of the outer class 
   void my_Method(){
      int num = 23;

      //method-local inner class
      class MethodInner_Demo{
         public void print(){
            System.out.println("This is method inner class "+num);     
         }   
      }//end of inner class

      //Accessing the inner class
      MethodInner_Demo inner = new MethodInner_Demo();
      inner.print();
   }

   public static void main(String args[]){
      Outerclass outer = new Outerclass();
      outer.my_Method();           
   }
}

// output
This is method inner class 23

匿名内部类

顾名思义,没有名字的类就是匿名内部类,匿名内部类的声明和实例化是同时进行的。一般情况下,当需要重写一个类或者接口的方法时,需要用到匿名内部类。

AnonymousInner an_inner = new AnonymousInner(){
   public void my_method(){
   ........
   ........
   }        
};

下面的例子演示了怎样使用匿名内部类来重写一个类的方法:

abstract class AnonymousInner{
   public abstract void mymethod();
}

public class Outer_class {
   public static void main(String args[]){
      AnonymousInner inner = new AnonymousInner(){
         public void mymethod(){
            System.out.println("This is an example of anonymous inner class");        
         }      
      };
      inner.mymethod(); 
   }
}

// output
This is an example of anonymous inner class

同样,可以使用匿名内部类来重写一个接口实现类的方法。

使用匿名内部类作为参数

一般情况下,如果一个方法接收一个接口/抽象类/具体类的对象作为参数,那么我们就可以实现接口,继承抽象类,然后把对象传递给方法。但是如果它是一个类,那么我们可以直接传递给方法。

针对以上三种情况,均可以传递匿名内部类给方法。下面是语法:

obj.my_Method(new My_Class(){
   public void Do(){
   .....
   .....
   }
});

使用如下:

//interface
interface Message{
   String greet();  
}

public class My_class {
   //method which accepts the object of interface Message
   public void displayMessage(Message m){
      System.out.println(m.greet() +", This is an example of anonymous inner class as an argument");       
   }

   public static void main(String args[]){
      //Instantiating the class
      My_class obj = new My_class();

      //Passing an anonymous inner class as an argument
      obj.displayMessage(new Message(){
         public String greet(){
            return "Hello";            
         }
      });
   }
}

// output
Hello This is an example of anonymous inner class as an argument

静态嵌套类

静态内部类就相当于外部类的静态成员。与使用一般静态成员一样,不用实例化外部类就可以访问。同样,静态嵌套类不可以访问外部类的实例变量和实例方法。静态嵌套类的语法如下:

class MyOuter {
   static class Nested_Demo{
   }
}

实例化一个静态嵌套类与实例化内部类有点不同,如下:

public class Outer{
   static class Nested_Demo{
      public void my_method(){
         System.out.println("This is my nested class");
      }
   }

   public static void main(String args[]){
      Outer.Nested_Demo nested = new Outer.Nested_Demo();    
      nested.my_method();
   }   
}

// output
This is my nested class
<think>我们正在处理一个关于使用SeaChest工具将固件下载到设备的问题。 根据用户的问题:他想使用SeaChest工具将指定固件(FWname)下载到设备/dev/sda。 首先,我们需要明确SeaChest工具的使用方法。SeaChest是由Seagate提供的一套命令行工具,用于管理Seagate和Samsung的硬盘驱动器。其中,SeaChest_Firmware是用于固件操作的工具。 命令的基本格式应该是: SeaChest_Firmware [选项] --downloadFW [固件文件] --device [设备路径] 但是,请注意,固件升级是一个高风险操作,必须确保: 1. 固件文件是适用于目标设备的。 2. 在升级过程中不能断电,否则可能导致设备损坏。 因此,具体的命令可能如下: SeaChest_Firmware -d /dev/sda --downloadFW FWname.bin 然而,请注意,固件文件通常是一个二进制文件(.bin),所以用户需要提供正确的固件文件路径。这里的“FWname”应该替换为实际的固件文件名(包括路径)。 另外,根据引用[4]:Linux下所有的硬件设备都是用文件来表示的,在/dev目录下。因此,我们使用/dev/sda作为设备路径。 但是,我们也要注意权限问题。通常,这类工具需要以root权限运行。 因此,完整的步骤可能如下: 1. 确保已经下载了适用于/dev/sda设备(即目标硬盘)的固件文件,并知道其路径(例如,假设固件文件名为FWname.bin,放在当前目录下)。 2. 打开终端,使用sudo运行命令。 示例命令: sudo SeaChest_Firmware -d /dev/sda --downloadFW FWname.bin 注意:不同的SeaChest版本可能命令参数有所不同,建议查看具体版本的帮助文档。可以通过以下命令查看帮助: SeaChest_Firmware --help 另外,根据引用[2]中提到,设备文件(如/dev/sda)可以被操作,但操作设备文件需要谨慎。 重要提示:在执行固件升级之前,请备份重要数据,并确保电源稳定。 由于用户问题中只给出了“FWname”而没有具体的文件扩展名和路径,我们假设用户已经将固件文件放在当前目录,并且文件名为FWname.bin。如果实际情况不同,请用户替换为实际路径和文件名。 因此,我们给出如下命令: sudo SeaChest_Firmware -d /dev/sda --downloadFW ./FWname.bin 或者,如果固件文件在其他路径,比如在/home/user/firmware目录下,则命令为: sudo SeaChest_Firmware -d /dev/sda --downloadFW /home/user/firmware/FWname.bin 注意:具体参数请以实际工具帮助为准。 如果用户没有提供固件文件的扩展名,那么用户需要根据实际文件名填写。 此外,我们还需要确保设备/dev/sda确实存在并且是Seagate或Samsung的硬盘。可以使用以下命令查看设备信息: sudo SeaChest_Basics -d /dev/sda -i 最后,再次强调:固件升级有风险,请务必谨慎操作。</think>### SeaChest 工具固件下载指南 要使用 SeaChest 工具将固件 `FWname` 下载到设备 `/dev/sda`,请按以下步骤操作: 1. **确认设备路径** Linux 系统通过 `/dev/` 目录下的设备文件访问硬件(如 `/dev/sda` 表示第一块 SATA 硬盘)[^4]。执行命令确认设备存在: ```bash ls -l /dev/sda ``` 输出示例:`brw-rw---- 1 root disk 8, 0 Jul 30 09:00 /dev/sda` 2. **获取管理员权限** 硬件操作需要 root 权限,使用 `sudo` 或切换到 root 用户: ```bash sudo -i ``` 3. **执行固件下载命令** 使用 `SeaChest_Firmware` 子工具的核心命令格式: ```bash SeaChest_Firmware -d /dev/sda --downloadFW "FWname" ``` * `-d /dev/sda`:指定目标设备 * `--downloadFW`:固件下载指令 * `"FWname"`:固件文件名(需包含完整路径,如 `/firmware/FWname.bin`) 4. **关键注意事项** - ✅ **固件兼容性**:确保 `FWname` 是适用于该硬盘型号的官方固件 - ⚠️ **风险警告**:固件更新可能使硬盘变砖,操作前务必备份数据 - 🔌 **电源保障**:更新过程中禁止断电(建议使用 UPS) - 🔒 **独占访问**:确保没有其他进程访问 `/dev/sda`(可先用 `umount` 卸载分区) 5. **验证更新结果** 更新后检查固件版本: ```bash SeaChest_Basics -d /dev/sda --showFWVersion ``` > ⚠️ **重要提醒**:不同型号硬盘的 SeaChest 命令参数可能略有差异,建议先查阅手册: > ```bash > SeaChest_Firmware --help > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值