如何做网站结构优化,北京响应式网站,什么网站可以做拍a发布会,爱心代码编程python记录学习Java基础中有关接口类和内部类的知识。
1 接口
interface 关键字用于定义接口类#xff0c;接口类是一系列方法的声明#xff0c;一般只有方法的特征没有方法的实现#xff0c;因此可以被不同的类接入实现#xff0c;而这些实现可以具有不同的行为#xff08;功…记录学习Java基础中有关接口类和内部类的知识。
1 接口
interface 关键字用于定义接口类接口类是一系列方法的声明一般只有方法的特征没有方法的实现因此可以被不同的类接入实现而这些实现可以具有不同的行为功能。
接口类似于抽象类(抽象类概念)其所有的方法默认是公开且抽象的默认 public abstract 修饰所有的成员变量默认是静态、不可变的常量 public static final。Java8开始接口类也可以有非抽象的static静态方法和default方法java9新增只能内部访问的private方法。
1.1 接口类的声明
使用 interface 关键字来定义一个接口。接口中所有的成员都是public的即使不显式声明。 public interface InterfaceClass {// 常量声明默认public static finalint CONSTANT_VARIABLE 10; // 方法声明默认是public abstract可以省略void someMethod();// 默认方法defaultdefault void myDefaultMethod() {// ...}// 静态方法staticstatic void myStaticMethod() {// ...}
}接口类方法 接口中的所有方法默认具有 public abstract 修饰符即使没有声明实现了该接口的类必须实现所有方法。(java8新增的方法除外default方法从java8开始可以含default声明的方法实现类可以直接使用或实现方法来覆写这类方法。static静态方法从java8开始可以含static声明的方法实现类可以直接类名.方法名()调用但不能实现。private私有方法从java9开始可以含private声明的方法只能被本类其他默认方法或私有方法使用。 静态常量 接口中只能声明常量无需显式声明 public static final它们自动具有这些修饰符并且必须初始化赋值。
1.2 实现类的声明
使用 implements 关键字来实现一个或多个接口并提供接口中声明的所有抽象方法的实现。如果实现类不能实现接口的所有抽象方法这个类需要声明为抽象类。抽象类概念
public class ImplClass implements InterfaceClass_1,InterfaceClass_2 {Overridepublic void someMethod() {// 实现接口类中所有非静态的方法体// 接口类中default声明的方法可选实现}
}1.3 接口的实现对比抽象类的继承
类和类的关系单继承。类和接口的关系多实现。接口和接口的关系多继承一个接口可以同时继承多个接口。
1.4 接口多继承的作用
规范合并整合多个接口为同一个接口便于子类实现。
1.5 接口的注意事项
1、接口不能创建对象 2、一个类实现多个接口多个接口的规范不能冲突 2、一个类实现多个接口多个接口中有同样的静态方法不冲突。使用接口.方法名()调用 3、一个类继承了父类同时又实现了接口父类中和接口中有同名方法默认用父类的。 4、一个类实现了多个接口多个接口中存在同名的默认方法可以不冲突这个类重写该方法即可。 5、一个接口继承多个接口是没有问题的如果多个接口中存在规范冲突则不能多继承。
1.6 接口的作用
接口主要用于定义某种规范或者协议确保不同类的对象之间能够共享相同的行为特征。它们在设计模式中广泛用于实现松耦合和面向接口编程有助于提高代码的可重用性和可扩展性。
2 内部类
内部类就是定义在一个类里面的类里面的类可以理解成寄生外部类可以理解成宿主。
public class People{// 内部类public class Heart{}
}内部类的使用场景
场景当一个事物的内部还有一个部分需要一个完整的结构进行描述时。
基本作用
内部类通常可以方便访问外部类的成员包括私有的成员。内部类提供了更好的封装性内部类本身就可以用private protectecd等修饰封装性可以做更多控制
2.1 内部类的分类
静态内部类[了解]成员内部类非静态内部类 [了解]局部内部类[了解]匿名内部类重点
2.2 静态内部类[了解]
什么是静态内部类
有static修饰属于外部类本身。它的特点和使用与普通类是完全一样的类有的成分它都有只是位置在别的类里面而已。
2.3 成员内部类[了解]
什么是成员内部类
无static修饰属于外部类的对象。JDK16之前成员内部类中不能定义静态成员JDK 16开始也可以定义静态成员了。 答案heartbeat, this.heartbeat, People.this.heartbeat
2.4 局部内部类[了解] 2.5 匿名内部类【重点】
本质上是没有名字的局部内部类同时也是一个对象因此在创建时既声明又实例化。同时代表一个对象其对象类型为当前new的那个类的子类。匿名内部类通常用在只使用一次且不需要单独定义一个类的情况下简化代码编写。
1. 使用场景
当需要快速定义一个类来响应事件如Java Swing中的ActionListener。当需要临时实现一个接口而不想为此创建单独的类文件时。
2. 定义与创建 匿名内部类的格式如下
//创建方式new类名()
new 外部类名() | 实现接口名() | 抽象类名(){// 实现父类方法或接口方法// 可以定义自己的成员变量和方法
};
//引用给对象
类名 对象名 new 外部类名() | 实现接口名() | 抽象类名(){...}
Class c new Class(){public void run(){}
};
c.run();例如实现一个Runnable接口的匿名内部类
new Runnable() {Overridepublic void run() {System.out.println(Running in anonymous class);}
}.run();或者继承一个抽象类并覆盖其方法
abstract class Animal {abstract void sound();
}new Animal() {Overridevoid sound() {System.out.println(Animal makes a sound);}
}.sound();3. 特点
没有名称匿名内部类由于没有名字所以不能被引用只能通过其父类或接口类型引用。局部作用域匿名内部类可以访问包含它的外部类的所有成员包括私有成员同时也可以定义自己的局部变量但这些变量必须是final或者事实上是final的。构造器限制匿名内部类没有独立的构造函数初始化过程通过构造代码块完成即在类体中直接初始化成员变量。静态限制匿名内部类不能包含静态成员、静态初始化块和静态方法因为它们没有类名无法直接指向静态成员。生命周期依赖外部类匿名内部类的对象会隐式持有对外部类对象的引用其生命周期受外部类实例的影响。
4. 注意事项
如果匿名内部类要访问外部方法的参数或者局部变量那么这些变量必须是final或者实际上不可变的尽管在Java 8之后编译器允许省略final关键字但仍要求实际行为不变。
以下是一个实际案例展示匿名内部类用于实现事件监听器
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() {Overridepublic 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;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myButton findViewById(R.id.my_button);// 使用匿名内部类实现OnClickListener接口myButton.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, Button was clicked!, Toast.LENGTH_SHORT).show();// 在这里处理按钮点击事件}});}
}在这个Android示例中我们同样利用匿名内部类创建了一个OnClickListener对象当myButton被点击时执行相应的逻辑。