特质(Traits)

优质
小牛编辑
126浏览
2023-12-01

特征是语言的结构构造,允许 -

  • Composition of behaviors.
  • 接口的运行时实现。
  • 与静态类型检查/编译的兼容性

它们可以被视为承载默认实现和状态的接口。 使用trait关键字定义特征。

下面给出了一个特征的例子 -

trait Marks {
   void DisplayMarks() {
      println("Display Marks");
   } 
}

然后可以使用implement关键字以与接口类似的方式实现特征。

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.Marks1 = 10; 
      println(st.DisplayMarks());
   } 
} 
trait Marks { 
   void DisplayMarks() {
      println("Display Marks");
   } 
} 
class Student implements Marks { 
   int StudentID
   int Marks1;
}

实现接口

Traits可以实现接口,在这种情况下,接口是使用implements关键字声明的。

下面给出了实现接口的特征的示例。 在以下示例中,可以注意以下关键点。

  • 使用DisplayTotal方法定义接口Total。

  • 特征Marks实现了Total接口,因此需要为DisplayTotal方法提供实现。

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      st.Marks1 = 10;
      println(st.DisplayMarks());
      println(st.DisplayTotal());
   } 
} 
interface Total {
   void DisplayTotal() 
} 
trait Marks implements Total {
   void DisplayMarks() {
      println("Display Marks");
   }
   void DisplayTotal() {
      println("Display Total"); 
   } 
} 
class Student implements Marks { 
   int StudentID
   int Marks1;  
} 

上述计划的输出将是 -

Display Marks 
Display Total

属性 Properties

特征可以定义属性。 下面给出了具有财产的特征的示例。

在以下示例中,integer类型的Marks1是一个属性。

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      println(st.DisplayMarks());
      println(st.DisplayTotal());
   } 
   interface Total {
      void DisplayTotal() 
   } 
   trait Marks implements Total {
      int Marks1;
      void DisplayMarks() {
         this.Marks1 = 10;
         println(this.Marks1);
      }
      void DisplayTotal() {
         println("Display Total");
      } 
   } 
   class Student implements Marks {
      int StudentID 
   }
} 

上述计划的输出将是 -

10 
Display Total

行为的构成

特征可用于以受控方式实现多重继承,从而避免钻石问题。 在下面的代码示例中,我们定义了两个特征 - MarksTotal 。 我们的Student类实现了两个特征。 由于学生类扩展了两个特征,因此可以访问两种方法 - DisplayMarksDisplayTotal

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      println(st.DisplayMarks());
      println(st.DisplayTotal()); 
   } 
} 
trait Marks {
   void DisplayMarks() {
      println("Marks1");
   } 
} 
trait Total {
   void DisplayTotal() { 
      println("Total");
   } 
}  
class Student implements Marks,Total {
   int StudentID 
}   

上述计划的输出将是 -

Total 
Marks1

延伸特征

特征可以扩展另一个特征,在这种情况下,您必须使用extends关键字。 在下面的代码示例中,我们使用Marks trait扩展Total trait。

class Example {
   static void main(String[] args) {
      Student st = new Student();
      st.StudentID = 1;
      println(st.DisplayMarks());
   } 
} 
trait Marks {
   void DisplayMarks() {
      println("Marks1");
   } 
} 
trait Total extends Marks {
   void DisplayMarks() {
      println("Total");
   } 
}  
class Student implements Total {
   int StudentID 
}

上述计划的输出将是 -

Total