当前位置:

首页 > 编程开发 > 如何使用Java内部类

如何使用Java内部类

一.内部类简介1.概念在Java中,我们通常是把不同的类创建在不同的包里面,对于同一个包里的类来说,它们都是同一层次的。但其实还有另一种情况,有些类可以被定义在另一个类的内部,我们把在一个类里面定义的类称为内部类(InnerClass)或嵌套类,把外面定义的类称为外部类(OutClass)或宿主类。也就是说,在类的内部既可以定义成员变量和方法,也可以定义其他的类。定义内部类的常见格式如下:classOuter{//外部类classInner{//内部类//方法和属性}}上面的代码中,Outer是普通的外部

本文目录

      一. 内部类简介

      1. 概念

      在Java中,我们通常是把不同的类创建在不同的包里面,对于同一个包里的类来说,它们都是同一层次的。但其实还有另一种情况,有些类可以被定义在另一个类的内部,我们把在一个类里面定义的类称为内部类(InnerClass)或嵌套类,把外面定义的类称为外部类(OutClass)或宿主类。 也就是说,在类的内部既可以定义成员变量和方法,也可以定义其他的类。定义内部类的常见格式如下:

      class Outer {//外部类
          
          class Inner {//内部类
              
              //方法和属性
          }
          
      }

      上面的代码中,Outer是普通的外部类,Inner就是内部类。它与普通外部类最大的不同,在于其实例对象不能单独存在,必须依附于一个外部类的实例对象。

      内部类可以很好地实现隐藏,一般的非内部类是不允许有private 与 protected权限的,但内部类却可以,而且内部类还拥有外部类中所有元素的访问权限。总之,对内部类的很多访问规则都可以参考变量和方法。

      但是要注意,虽然我们使用内部类可以使程序结构变得更加紧凑,但却在一定程度上破坏了面向对象的思想。

      2. 优点

      内部类的存在,具有如下优点:

      • 内部类使得多继承的解决方案变得更完整:每个内部类都能独立的实现接口,无论外部类是否已经实现了接口或继承了父类,对于内部类都没有影响;

      • 既可以方便地将存在一定逻辑关系的类组织在一起,又可以对外界隐藏;

      • 方便各类编写事件驱动程序;

      • 方便编写线程代码。

      3. 分类

      Java中的内部类可以分为如下几种类型:

      • 成员内部类

      • 静态内部类

      • 局部内部类

      • 匿名内部类

      虽然大多数时候,内部类用得并不多,但我们也有必要了解它们是如何具体使用的。

      4. 内部类的特点

      内部类相比外部类,具有如下特点:

      • 内部类可以访问外部类的私有成员,且不破坏封装性;

      • 内部类仍是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但前面会冠以外部类的类名和$符号,该文件名的格式是外部类名$内部类名.class;

      • 因为内部类是外部类的一个成员,所以内部类不能用普通的方式访问,但内部类可以自由地访问外部类里的成员变量,无论是否被private修饰;

      • 如果是静态内部类,我们不能随便访问外部类的成员变量,只能访问外部类的静态成员变量。

      5. Java类的创建要求

      我们在创建定义Java类时,应该遵循如下要求:

      • 一个java文件中可以编写多个类,但只能有一个类使用public关键词进行修饰,这称之为主类;

      • 主类名必须与文件名一致,在开发中,应尽量只在一个java文件中编写一个类;

      • 外部类只有两种访问级别:public 和默认;内部类则有 4 种访问级别:public、protected、 private 和默认;

      • 在外部类中,可以直接通过内部类的类名来访问内部类;

      • 在外部类以外的其他类中,需要通过内部类的完整类名来访问内部类;

      • 内部类与外部类不能重名。

      接下来我们就针对上面提到的几种内部类,分别给大家讲解这几种内部类的用法。

      二. 成员内部类

      1. 概念

      成员内部类就是指没有被static修饰的内部类,也可以称为非静态内部类。

      2. 特点

      成员内部类具有如下特点:

      • 在早期的jdk版本中,成员内部类中只能定义非静态的属性和方法,除非同时使用final和static进行修饰;

      • 在新版的jdk中,成员内部类中也可以定义静态的属性和方法;

      • 成员内部类可以访问外部类的所有成员,包括私有和静态的成员,即使是多层嵌套时也如此;

      • 外部类不能直接访问内部类的成员,必须通过内部类的实例对象访问;

      • 在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例对象;

      • 外部类的实例与内部类实例是一对多的关系,即一个内部类实例只对应一个外部类实例,但一个外部类实例则可以对应多个内部类实例。

      3. 语法

      如果是在外部类中,创建成员内部类对象的基本语法格式如下:

      内部类 对象名 = new 内部类();

      如果是在外部的其他类中,或者是在外部类的静态方法中,创建成员内部类对象的基本语法格式如下:

      内部类 对象名 = new 外部类().new 内部类();

      4. 案例

      4.1 定义成员内部类

      /**
       * 成员内部类
       */
      public class OuterClass {
      
      	// 外部类的非静态成员
      	String name = "一一哥";
      	private String hobby = "撸码";
      	static int age = 30;
      
      	// 非静态方法
      	public void show() {
      		//这里的this是指OuterClass对象
      		System.out.println("show方法...name="+this.name);
      
              //如果是在外部类里面创建内部类的对象,就不需要创建外部类实例,可以直接new 内部类()
      		//InnerClass inner = new InnerClass();
      	}
      
      	// 定义一个成员内部类
      	public class InnerClass {
      		// 也可以定义私有属性
      		private int a = 10;
      
      		//在早期的JDK中,成员内部类中不能定义静态变量;但在新版JDK中,成员内部类中可以定义静态变量
      		static int b = 20;
      
      		// 非静态方法
      		public void m1() {
      			// 这里的this对象是InnerClass内部类对象
      			System.out.println("成员内部类的成员变量:" + this.a);
      			
      			//外部类.this.属性或方法,这个this是外部类对象
      			System.out.println("外部类的成员变量:" + OuterClass.this.name);
      			
                  //内部类中可以访问外部类的私有成员和静态成员
      			System.out.println("外部类的私有成员变量:" + hobby);
      			System.out.println("外部类的静态变量:" + age);
      		}
      
      		//在早期的JDK中,成员内部类中不能定义静态方法;但在新版JDK中,成员内部类中可以定义静态方法
      		public static void m2() {
      			System.out.println("调用成员内部类的静态变量:" + b);
      			System.out.println("调用外部类的静态变量:" + age);
      
                  //在静态方法中创建内部类对象,也要通过内部类 对象名 = new 外部类().new 内部类();的格式
      			//InnerClass innerClass = new OuterClass().new InnerClass();
      		}
      
      	}
      
      }

      我们要注意,在早期的JDK中,成员内部类中不能定义静态属性和方法;但在新版JDK中,成员内部类中可以定义静态的属性和方法。并且我们要搞清楚在不同的位置上,创建内部类对象的方式,以及this的具体含义。

      4.2 定义测试类

      我们在外部的其他类中,要想创建出一个成员内部类的对象,需要通过如下形式:

      内部类 对象名 = new 外部类().new 内部类();

      public class InnerClassTest {
      
      	public static void main(String[] args) {
      		
      		//在外部的其他类中,不能直接创建内部类对象,否则:
      		//No enclosing instance of type OuterClass is accessible. 
      		//Must qualify the allocation with an enclosing instance of type OuterClass 
      		//(e.g. x.new A() where x is an instance of OuterClass).
      		//InnerClass inner=new InnerClass();
      
              //在外部的其他类中创建内部类对象,需要通过如下格式:
      		//内部类 对象名 = new 外部类().new 内部类();
      		//InnerClass inner=new OuterClass().new InnerClass();
      		
      		//也可以拆分成如下格式:
      		OuterClass outer=new OuterClass();
      		InnerClass inner=outer.new InnerClass();
      		
      		inner.m1();
      		
      		InnerClass.m2();
      		
      	}
      }

      5. 访问方式小结

      学习到这里,你可能会被内部类与外部类之间的调用访问关系整蒙圈,所以给大家梳理了一下访问方式:

      • 成员内部类 访问 外部类的成员(属性、方法),可以【直接访问使用】;

      • 外部类 访问 成员内部类,需要【直接创建内部类对象后再访问】,即 new InnerClass();

      • 外部的其他类 访问 成员内部类,需要【创建外部类对象,再创建内部类对象后访问】,即 InnerClass inner=new OuterClass().new InnerClass();

      6. 关于this的注意事项

      在之前给大家讲过this的作用和用法,但在内部类中,关于this,我们需要注意以下两点:

      如果同时存在外部类和内部类,那么this在哪个类中使用,this就代表哪个类的对象;

       如果内部类想要通过this来调用外部类的属性和方法,需要使用外部类名.this.属性或者方法名。

      三. 局部内部类

      1. 概念

      局部内部类是指在方法中定义的内部类。

      2. 特点

      局部内部类具有如下特点:

      • 局部内部类只能在方法中定义和创建对象,也只在当前方法中有效;

      • 局部内部类中可以访问外部类的所有成员;

      • 局部内部类与局部变量一样,不能使用访问控制修饰符(public、private和protected)和static修饰符;

      • 在jdk 7版本中,如果局部变量是在局部内部类中使用,必须显式地加上final关键字;在jdk 8版本中,会默认添加final关键字;

      • 局部内部类只能访问当前方法中final类型的参数与变量。如果方法中的成员与外部类的成员同名,可以使用 .this. 的形式访问外部类成员;

      • 局部内部类中还可以包含内部类,但这些内部类也不能使用访问控制修饰符(public、private 和 protected) 和 static修饰符;

      • 局部变量在方法执行结束后会被销毁,而局部内部类的对象会等到内存回收机制进行销毁。如果是局部内部类里的常量,该常量会被存放在常量池中。

      3. 语法

      创建局部内部类对象的基本语法格式如下:

      public class PartClass {
          
          public void method() {
              //在方法中定义的内部类,就是局部内部类
              class Inner {
                  //属性
      
                  //方法
              }
          }
          
      }

      4. 案例

      4.1 定义局部内部类

      我们来定义一个局部内部类的案例代码。

      /**
       * 
        * 局部内部类---定义在方法中的内部类
       */
      public class PartOuterClass {
      
      	//类的成员变量
      	String name="一一哥";
          private int age=30;
          static String hobby="java";
          
          public void show() {
          	//局部变量
              //JDK 7之前,匿名内部类和局部内部类中访问外部的局部变量时,该变量需要明确地带有final修饰符
              //final int num = 10;
              
              //Effectively final特性
              int num = 10;
              
              //局部内部类,类似于是方法中的局部对象
              class PartInnerClass{
              	
              	//内部可以正常定义方法
                  public void m1() {
                  	//访问外部类的非静态成员,可以使用OuterClass.this.成员的格式,也可以直接访问
                  	//System.out.println("外部类的成员变量"+name);
                      System.out.println("外部类的成员变量"+PartOuterClass.this.name);
                      System.out.println("外部类私有的成员变量"+age);
                      System.out.println("外部类的静态变量"+hobby);
                      
                      //局部内部类,可以直接访问方法中的局部变量
                      System.out.println("访问局部变量"+num);
                  }
                  
                  //在新版的jdk中,也可以定义静态的属性和方法,老版的jdk则不行
                  static int b=10;
                  
                  public static void m2() {
                  	System.out.println("外部类的静态变量,hobby="+hobby+",b="+b);
                  }
              }
              
              //创建局部内部类对象
              PartInnerClass inner = new PartInnerClass();
              inner.m1();
              
              //在当前类中,局部内部类可以直接访问静态成员
              PartInnerClass.m2();
              
          }    
          
      }

      在JDK 7之前,匿名内部类和局部内部类中访问外部的局部变量时,该变量需要明确地带有final修饰符。但从JDK 8之后,我们可以不带final修饰符,而是由系统默认添加了。

      4.2 定义测试类

      接下来我们对上面的案例进行测试。

      public class PartInnerClassTest {
      
      	public static void main(String[] args) {
      		//创建外部类对象,调用方法,执行局部内部类
      		PartOuterClass outer=new PartOuterClass();
      		outer.show();
      	}
      }

      4.3 Effectively final特性

      一般情况下,Java中的局部内部类和匿名内部类访问局部变量时,该变量必须由 final修饰,以保证内部类和外部类的数据一致性。但从 Java 8开始,我们可以不加 final修饰符,而是由系统默认添加,当然这在 Java 8以前是不允许的。Java将这个新的特性称为 Effectively(有效的、实际的) final 功能。

      另外在 Lambda表达式中,使用局部变量时也要求该变量必须是 final 修饰的,所以 effectively final特性在 Lambda表达式的上下文中非常有用。

      其实effectively final特性,只是让我们不用显式地把变量声明为final修饰的,它给我们自动添加了final修饰词,但并没有取消final,主要是减少了一点不必要的操作,给开发节省了点时间。

      四. 匿名内部类

      1. 概念

      匿名内部类就是指没有类名的内部类,必须在创建时使用 new 语句来声明。匿名内部类不能在Outer Class外部类中定义,而是要在某个方法的内部,通过匿名类(Anonymous Class)的形式来定义。 匿名内部类本身就是一个对象。

      通常情况下,如果一个方法的参数是接口类型,且该接口只需要实现一次,那么我们就可以通过匿名内部类的形式来进行定义。另外如果该接口的实现每次都不同,也可以使用匿名内部类的形式进行定义。我们也可以把这种定义形式叫做 “接口回调” 。匿名内部类的代码格式使得代码更加简洁、紧凑,模块化程度也更高。

      2. 特点

      匿名内部类具有如下特点:

      • 匿名内部类本身就是一个对象;

      • 一般在匿名内部类中不会定义属性和方法,因为没有意义;

      • 匿名内部类的父类一般都是抽象类或者是接口;

      • 匿名内部类和局部内部类一样,可以访问外部类的所有成员;

      • 如果匿名内部类位于方法中,则该类只能访问方法中 final 类型的局部变量和参数;

      • 匿名内部类中允许使用非静态代码块对成员进行初始化操作;

      • 匿名内部类的非静态代码块会在父类的构造方法之后被执行。

      3. 语法

      通常匿名内部类有两种实现方式:

      • 继承一个类,重写其方法;

      • 实现一个或多个接口,并实现其方法。

      创建匿名内部类对象的基本语法格式如下:

      new <类或接口> (){
      重写类或接口的方法
      }

      4. 案例

      为了给大家演示匿名内部类的用法,接下来壹哥设计一个用于模拟按钮点击事件的案例。当我们进行安卓等设备开发时,面板上有个按钮,点击该按钮,如何监听点击事件?在Android系统中提供了各种对应的按钮点击监听事件。所以这里壹哥就通过实现接口的形式来定义匿名内部类,模拟一个单击事件。

      4.1 定义接口

      首先我们需要定义一个接口,表示单击监听,内部有个点击事件。

      /**
       * 点击监听事件
       */
      public interface OnClickListener {
      
      	//点击事件
      	void onClick();
      	
      }

      4.2 定义Button按钮类

      然后定义一个Button按钮类,给Button按钮安排一个点击监听方法。

      /**
       * 
       * 局部内部类---定义在方法中的内部类
       */
      public class Button {
      
      	//处理案例点击的监听事件
          public void setOnClickListener(OnClickListener listener) {
          	
          	listener.onClick();
          }
          
      }

      4.3 定义测试类

      接下来我们就测试运行上面的代码。

      /**
       * 匿名内部类测试
       */
      public class AnonyInnerClassTest {
      
      	public static void main(String[] args) {
      		//外部变量
      		int num=20;
      		
      		//测试匿名内部类
      		Button btn=new Button();
      		
      		//模拟处理按钮的点击事件
      		btn.setOnClickListener(new OnClickListener() {//这里就是一个匿名内部类
      			
      			//在匿名内部类中,可以允许使用非静态代码块进行成员初始化操作。
      			int i; 
      			
      			{    // 非静态代码块,在构造方法之后执行
      		        i = 100;    //成员初始化
      		    }
      			
      			@Override
      			public void onClick() {
      				System.out.println("按钮被点击啦...i="+i+",num="+num);
      			}
      		});
      		
      	}
      }

      根据上面的案例可知:

      • 在匿名内部类中,可以允许使用非静态代码块进行成员初始化操作;

      • 匿名内部类的非静态代码块,会在构造方法之后执行;

      • 匿名内部类也可以直接使用外部类的成员。

      五. 静态内部类

      1. 概念

      静态内部类和成员内部类的定义类似,但要使用static修饰,所以称为静态内部类(Static Nested Class)。

      静态内部类和成员内部类有很大的不同,它不再依附于Outer的实例,而是一个完全独立的类,因此无法引用Outer.this的方式调用。但它可以访问Outer类的private静态字段和静态方法,如果我们把静态内部类移到Outer类之外,就失去了访问private的权限。

      2. 特点

      静态内部类中可以定义非静态的属性和方法,也可以定义静态的属性和方法;

      静态内部类中只能访问静态外部类的静态属性和方法。

      3. 语法

      创建静态内部类对象的基本语法格式如下:

      内部类 对象名 = new 外部类.内部类();

      4. 案例

      4.1 定义静态内部类

      这里我们先简单定义一个静态内部类,后面我们在学习内部类时再专门讲解。在这个静态内部类中,定义了一个方法,来访问外部类中的普通属性和静态属性。我们要记住以下几点:

      • 静态内部类访问外部类的成员变量时,需要先创建外部类对象;

      • 非静态内部类可以直接访问使用外部类的成员变量,如同使用本类中的变量;

      • 所有的内部类访问外部类的静态变量时,可以直接通过"外部类.静态变量"的形式访问。

      /**
       * 外部类和内部类
       */
      public class OuterClass {
      	
      	//普通属性,属于外部类
      	static int outerNum=10;
      	
      	//定义一个静态的内部类,如果不带static,就是一个普通的内部类。
      	//内部类的使用,和普通类一样,里面可以正常定义属性、方法、构造方法等。
          //static前面可以带public等任意访问修饰符,也可以不带!
      	static class InnerClass{
      		//私有属性无法在类的外部直接访问
      		//private int innerNum=20;
      		
      		int innerNum=20;
      		
      		public void printNum() {
      			//定义外部类对象
      			OuterClass outer=new OuterClass();
      
                  //这里的this是指InnerClass内部类对象!
      			System.out.println("innerNum="+this.innerNum+",outerAge="+outer.outerAge+",outerNum="+OuterClass.outerNum);
      		}
      	}
      
      }

      对于静态内部类而言,static前面可以带public等任意访问修饰符,也可以不带!

      4.2 定义测试类

      我们再定义一个测试类,看看内部类对象是怎么调用的。

      /**
       * 测试访问内部类
       */
      public class InnerClassTest {
      	
      	public static void main(String[] args) {
      		//创建内部类对象,格式为“外部类.内部类 对象名 = new 外部类.内部类的构造方法”
      		OuterClass.InnerClass inner = new OuterClass.InnerClass();
      		
      		//调用内部类的方法
      		inner.printNum();
      		
      		//访问外部类属性
      	    System.out.println("outerNum="+OuterClass.outerNum);
      	    
      	    //访问内部类属性
      	    System.out.println("innerNum="+inner.innerNum);
      	}
      
      }

      5. 访问方式小结

      对于静态内部类的访问要求,给大家总结如下:

      • 静态内部类中可以直接访问外部类的所有静态方法,包含私有的,但不能直接访问非静态成员;

      • 静态内部类可以添加任意访问修饰符(public、protected、默认、private),因为它的地位就是一个成员;

      • 如果静态内部类 访问 外部类 的静态属性、静态方法等,访问方式是【直接访问】;

      • 如果外部类或外部的其他类来 访问 静态内部类,访问方式是【外部类.内部类 对象名 = new 外部类.内部类的构造方法】,创建出内部类对象后再访问。

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。