特征是语言的结构构造,允许 - 
它们可以被看作是承载默认实现和状态的接口。使用trait关键字定义 trait。
下面给出了一个特征的例子:
trait Marks {
   void DisplayMarks() {
      println("Display Marks");
   } 
}
然后可以使用 implement 关键字以类似于接口的方式实现 trait。
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 可以实现接口,在这种情况下,使用 interface 关键字声明接口。
下面给出了实现接口的特征的示例。在以下示例中,可以注意以下要点。
接口 Total 使用方法 DisplayTotal 定义。
特征 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
特征可以定义属性。下面给出了具有属性的trait的示例。
在以下示例中,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
特征可以用于以受控的方式实现多重继承,避免钻石问题。在下面的代码示例中,我们定义了两个特征 - Marks 和 Total。我们的 Student 类实现了两个特征。由于学生类扩展了这两个特征,它能够访问这两种方法 - DisplayMarks 和 DisplayTotal。
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 
}   
上述程序的输出将是 -
Marks1
Total 特征可能扩展另一个特征,在这种情况下,必须使用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