文章目录
- interface接口
- 定义接口
- 接口的格式与举例
- 静态方法
- 私有方法
- 接口的多继承
- 接口的默认方法冲突解决
- 接口与抽象类之间的对比
- 抽象类与抽象方法
- 抽象类
- 抽象类的定义
- 抽象方法
- 使用抽象类
- 参考链接
interface接口
接口是一种抽象的
数据类型
,它定义了一组方法,但没有提供方法的具体实现。在
Java中,接口是一种与类类似的结构,但它只包含常量
和抽象方法
的定义。类可以实现一个或多个接口,从而获得接口定义的方法。
定义接口
使用interface
关键字来定义接口,接口中的方法默认为抽象方法,可以包含常量和默认方法(在Java 8及以后版本)。
public interface MyInterface {// 抽象方法void myMethod();// 常量int MAX_VALUE = 100;// 默认方法(Java 8及以后版本)default void defaultMethod() {System.out.println("This is a default method.");}
}
接口的格式与举例
接口的格式如下:
public interface InterfaceName {// 常量// 抽象方法// 默认方法(Java 8及以后版本)// 静态方法(Java 8及以后版本)// 私有方法(Java 9及以后版本)
}
接口的举例:
// 定义接口
public interface Teacher {// 抽象方法void teach();// 默认方法default void greet() {System.out.println("Hello, I'm a teacher.");}// 常量int MAX_STUDENTS = 30;
}// 实现接口
public class MathTeacher implements Teacher {@Overridepublic void teach() {System.out.println("Teaching Math.");}
}// 使用接口
public class InterfaceExample {public static void main(String[] args) {// 创建实现接口的对象MathTeacher mathTeacher = new MathTeacher();// 调用抽象方法mathTeacher.teach();// 调用默认方法mathTeacher.greet();// 访问常量System.out.println("Maximum students: " + Teacher.MAX_STUDENTS);}
}
静态方法
Java 8及以后版本允许在接口中定义静态方法。静态方法可以通过接口名直接调用
,不需要实例化接口。
public interface MyInterface {// 静态方法static void staticMethod() {System.out.println("This is a static method.");}
}
私有方法
Java 9及以后版本允许在接口中定义私有方法,用于在接口内部复用代码。私有方法只能在接口内部调用
,不能在实现接口的类中使用
。
public interface MyInterface {// 默认方法default void defaultMethod() {// 调用私有方法System.out.println("Result: " + privateMethod());}// 私有方法private int privateMethod() {return 42;}
}
接口的多继承
一个类可以实现多个接口,从而具有多个接口的方法。这使得Java支持了一种接近多继承的机制。
public interface Teacher {void teach();
}public interface Singer {void sing();
}public class Musician implements Teacher, Singer {@Overridepublic void teach() {System.out.println("Teaching music.");}@Overridepublic void sing() {System.out.println("Singing a song.");}
}
接口的默认方法冲突解决
public interface A {default void myMethod() {System.out.println("Method in interface A");}
}public interface B {default void myMethod() {System.out.println("Method in interface B");}
}public class MyClass implements A, B {// 手动解决冲突@Overridepublic void myMethod() {A.super.myMethod(); // 或者 B.super.myMethod();}
}
接口与抽象类之间的对比
抽象类与抽象方法
抽象类
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用
。类的设计应该保证父类和子类能够共享特征
。有时将一个父类设计得非常抽象
,以至于它没有具体的实例,这样的类叫做抽象类
。
抽象类的定义
抽象类是用abstract
关键字声明的类,它可以包含抽象方法和具体方法。抽象类不能被实例化
,通常用作其他类的基类
。
public abstract class Shape {// 抽象方法public abstract double calculateArea();// 具体方法public void display() {System.out.println("This is a shape.");}
}
抽象方法
抽象方法是用abstract
关键字声明的方法,它没有方法体
,只有方法签名。抽象方法必须在抽象类中声明,由子类
提供具体实现。
public abstract class Animal {// 抽象方法public abstract void makeSound();// 具体方法public void sleep() {System.out.println("The animal is sleeping.");}
}
使用抽象类
使用抽象类时,通常需要创建其子类并实现其中的抽象方法。
// 抽象类 - 人员
public abstract class Person {private String name;private int age;// 构造方法public Person(String name, int age) {this.name = name;this.age = age;}// 抽象方法 - 获取角色public abstract String getRole();// 具体方法 - 显示基本信息public void displayInfo() {System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Role: " + getRole());}
}// 子类 - 老师
public class Teacher extends Person {private String subject;// 构造方法public Teacher(String name, int age, String subject) {super(name, age);this.subject = subject;}// 实现抽象方法@Overridepublic String getRole() {return "Teacher";}// 具体方法 - 显示老师信息public void teach() {System.out.println("Teaching " + subject);}
}// 子类 - 学生
public class Student extends Person {private String grade;// 构造方法public Student(String name, int age, String grade) {super(name, age);this.grade = grade;}// 实现抽象方法@Overridepublic String getRole() {return "Student";}// 具体方法 - 学习public void study() {System.out.println("Studying in grade " + grade);}
}// 使用抽象类的例子
public class SchoolExample {public static void main(String[] args) {// 创建老师对象Teacher teacher = new Teacher("Mr. Smith", 35, "Mathematics");teacher.displayInfo();teacher.teach();System.out.println();// 创建学生对象Student student = new Student("Alice", 15, "10th");student.displayInfo();student.study();}
}
Person
是一个抽象类,定义了人员的基本属性和方法,其中包括一个抽象方法getRole()
。Teacher
和Student
分别是Person
的子类,实现了getRole()
方法,并分别添加了特定的方法(teach()和study())。通过使用抽象类,我们可以将共有的行为和属性提取到父类中,实现了代码的重用和更好的组织结构。
参考链接
[1] w3cschool
[2] oracle