记录学习Java基础中有关接口类和内部类的知识。
interface
关键字用于定义接口类,接口类是一系列方法的声明,一般只有方法的特征没有方法的实现,因此可以被不同的类接入实现,而这些实现可以具有不同的行为(功能)。
接口类似于抽象类(抽象类概念),其所有的方法默认是公开且抽象的(默认 public abstract
修饰),所有的成员变量默认是静态、不可变的常量( public static final
)。Java8开始,接口类也可以有非抽象的static静态方法和default方法,java9新增只能内部访问的private方法。
interface
关键字来定义一个接口。接口中所有的成员都是public的,即使不显式声明。
public interface InterfaceClass {
// 常量声明,默认public static final
int CONSTANT_VARIABLE = 10;
// 方法声明,默认是public abstract,可以省略
void someMethod();
// 默认方法default
default void myDefaultMethod() {
// ...
}
// 静态方法static
static void myStaticMethod() {
// ...
}
}
接口类方法:
public abstract
修饰符(即使没有声明),实现了该接口的类必须实现所有方法。(java8新增的方法除外)default
声明的方法,实现类可以直接使用或实现方法来覆写这类方法。static
声明的方法,实现类可以直接类名.方法名()调用,但不能实现。private
声明的方法,只能被本类其他默认方法或私有方法使用。静态常量:
implements
关键字来实现一个或多个接口,并提供接口中声明的所有抽象方法的实现。public class ImplClass implements InterfaceClass_1,InterfaceClass_2 {
@Override
public void someMethod() {
// 实现接口类中所有非静态的方法体
// 接口类中default声明的方法可选实现
}
}
规范合并,整合多个接口为同一个接口,便于子类实现。
1、接口不能创建对象
2、一个类实现多个接口,多个接口的规范不能冲突
2、一个类实现多个接口,多个接口中有同样的静态方法不冲突。(使用接口.方法名()调用)
3、一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。
4、一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
5、一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。
内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。
public class People{
// 内部类
public class Heart{
}
}
内部类的使用场景
基本作用
什么是静态内部类?
什么是成员内部类?
1. 使用场景:
2. 定义与创建:
匿名内部类的格式如下:
//创建方式,new+类名()
new 外部类名() | 实现接口名() | 抽象类名(){
// 实现父类方法或接口方法
// 可以定义自己的成员变量和方法
};
//引用给对象
类名 对象名 = new 外部类名() | 实现接口名() | 抽象类名(){...}
Class c = new Class(){
public void run(){
}
};
c.run();
例如,实现一个Runnable接口的匿名内部类:
new Runnable() {
@Override
public void run() {
System.out.println("Running in anonymous class");
}
}.run();
或者继承一个抽象类并覆盖其方法:
abstract class Animal {
abstract void sound();
}
new Animal() {
@Override
void sound() {
System.out.println("Animal makes a sound");
}
}.sound();
3. 特点:
4. 注意事项:
以下是一个实际案例,展示匿名内部类用于实现事件监听器:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// 假设我们有一个GUI组件(如按钮)
javax.swing.JButton button = new javax.swing.JButton("Click me!");
// 按钮需要一个ActionListener来响应点击事件
// 而我们并不需要多次复用这个监听器,因此可以使用匿名内部类
// 通过匿名内部类创建并实例化ActionListener
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 当按钮被点击时,执行的逻辑
System.out.println("Button is clicked!");
}
});
// 添加监听器到按钮上
frame.add(button);
// 显示GUI
// ...
在这个例子中,我们没有创建一个新的ActionListener子类,而是直接new一个临时的、未命名的类实现ActionListener
接口。这样做的好处是能够将与按钮相关的操作逻辑紧密地封装在一起,同时简化代码编写。
另外,匿名内部类也可以用来扩展具体的类,例如在Android开发中,经常会有这样的场景:
public class MainActivity extends AppCompatActivity {
private Button myButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = findViewById(R.id.my_button);
// 使用匿名内部类实现OnClickListener接口
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Button was clicked!", Toast.LENGTH_SHORT).show();
// 在这里处理按钮点击事件
}
});
}
}
在这个Android示例中,我们同样利用匿名内部类创建了一个OnClickListener对象,当myButton被点击时执行相应的逻辑。