首页 > 基础资料 博客日记
【JavaSE】接口 详解(上)
2024-04-10 07:00:05基础资料围观243次
这篇文章介绍了【JavaSE】接口 详解(上),分享给大家做个参考,收藏Java资料网收获更多编程知识
前言
本篇会讲到Java中接口内容,概念和注意点可能比较多,需要耐心多看几遍,我尽可能的使用经典的例子帮助大家理解~
欢迎关注个人主页:逸狼
创造不易,可以点点赞吗~
如有错误,欢迎指出~
目录
接口
接口是公共的行为规范标准,在Java中,接口是多个类的公共规范,是一种引用数据类型。
语法
- 定义格式与类基本相同,将class关键字换成interface关键字
- 接口中的成员变量(习惯上是大写)默认为public static final 修饰的(写的时候可省略public static final),必须被初始化
- 接口中的方法默认只能是public abstract 修饰的(也可省略不写,不写默认也是抽象方法(不能有具体的实现,否则会报错),用其他修饰符会报错)
- 接口中使用default修饰的方法和static修饰的方法是可以有具体的实现的
- 接口中不能有静态代码块、示例代码块和构造方法。
- 接口虽然不是类,但编译完成后也是字节码文件(后缀名是.class)。
注意
- 创建接口时, 接口的命名一般以大写字母 I 开头
- 接口的命名一般使用 "形容词" 词性的单词.
- 阿里编码规范中约定, 接口中的方法和属性不要加任何修饰符号, 保持代码的简洁性.
代码理解
package demo2inter;
public interface ITestInterFace {
public static final int a=100;
int AGE=10;
abstract public void fun1();
void fun2();
default void func(){
System.out.println("default!");
}
public static void staticFunc(){
System.out.println("staticFunc!");
}
}
接口的简单使用
- 接口不能被实例化
- 接口需要被类实现,需要使用关键字implements来实现
- 当一个类实现类这个接口,那么这个类要重写这个方法
- 接口也可以发生向上转型、动态绑定和多态。
public interface ITestInterFace {
void draw();
}
class Rect implements ITestInterFace{
@Override
public void draw() {
System.out.println("画一个矩形!");
}
}
class Triangle implements ITestInterFace{
@Override
public void draw() {
System.out.println("画一个三角形!");
}
}
class Test{
public static void drawMap(ITestInterFace iTestInterFace){
iTestInterFace.draw();
}
public static void main(String[] args) {
drawMap(new Rect());//发生了向上转型和动态绑定
drawMap(new Triangle());
}
}
接口运用举例
请实现笔记本电脑使用USB鼠标、USB键盘的例子
- USB接口:包含打开设备、关闭设备功能
- 笔记本类:包含开机功能、关机功能、使用USB设备功能
- 鼠标类:实现USB接口,并具备点击功能
- 键盘类:实现USB接口,并具备输入功能
在包demo3中,创建3个类,一个接口
IUSB接口
package demo3;
public interface IUSB {
// USB接口
void openDevice();//打开服务
void closeDevice();//关闭服务
}
KeyBoard类
package demo3;
public class KeyBoard implements IUSB {
@Override
public void openDevice() {
System.out.println("打开键盘!");
}
@Override
public void closeDevice() {
System.out.println("关闭键盘!");
}
public void input(){
System.out.println("键盘输入!");
}
}
Mouse类
package demo3;
public class Mouse implements IUSB{
@Override
public void openDevice() {
System.out.println("打开鼠标!");
}
@Override
public void closeDevice() {
System.out.println("关闭鼠标!");
}
public void click(){
System.out.println("点击鼠标!");
}
}
Computer类
package demo3;
import demo2inter.ITestInterFace;
public class Computer {
public void powerOff (){
System.out.println("关闭电脑!");
}
public void powerOn(){
System.out.println("打开电脑!");
}
public void useDevice(IUSB usb){
usb.openDevice();
//这里要区分 USB引用了哪个对象
if(usb instanceof Mouse){
Mouse mouse =(Mouse) usb;//向下转型
mouse.click();
}
//调用键盘
if(usb instanceof KeyBoard){
KeyBoard keyBoard=(KeyBoard) usb;
keyBoard.input();
}
usb.closeDevice();
}
public static void main(String[] args) {
Computer computer=new Computer();
computer.powerOn();
computer.useDevice(new KeyBoard());//向上转型
computer.useDevice(new Mouse());
computer.powerOff();
}
}
多个接口
Java中不支持多继承,但是一个类可以实现多个接 口。接口表达含义是 具有**特性,可以帮助程序员忘掉类型,只关注特性。
代码理解(语法层面)
类TestDemo4实现了IA和IB接口
package demo4;
//多个接口
interface IA{
void testA();
}
interface IB{
void testB();
}
class TestDemo4 implements IA,IB{
@Override
public void testA() {
System.out.println("testA()");
}
@Override
public void testB() {
System.out.println("testB()");
}
}
public class Test4 {
public static void main(String[] args) {
TestDemo4 testDemo4=new TestDemo4();
testDemo4.testA();
testDemo4.testB();
}
}
接口解决多继承问题 代码示例
在demomoreinher包中有Animal抽象类,Duck,Fish类 以及IFly、IRunning、ISwimming接口
Animal类
IFly、IRunning、ISwimming等动物特性应该采用接口方式
package demomoreinher;
public abstract class Animal {
protected String name;
protected int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void eat();
//像跑 游泳 飞等动作不能写在这里,因为不是所有动物都会这些技能 应该写在接口中
}
IFly、IRunning、ISwimming接口
//注意:这里的代码是在不同IFly、IRunning、ISwimming接口文件中的
public interface IFly {
void fly();
}
public interface IRunning {
void run();
}
public interface ISwimming {
void swim();
}
Fish类
鱼只会游泳这项特性,所以接口ISwimming
package demomoreinher;
public class Fish extends Animal implements ISwimming{//如果这里游泳写出类,java是不支持多继承的,所有说接口解决了多继承问题
public Fish(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println(this.name+"吃鱼粮!");
}
@Override
public void swim() {
System.out.println(this.name+"游泳~");
}
}
Duck类
而鸭子游泳,跑,飞这3个技能都会,所以三个特性都接上
package demomoreinher;
public class Duck extends Animal implements ISwimming,IFly,IRunning{
public Duck(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println(this.name+"吃鸭粮!");
}
@Override
public void fly() {
System.out.println(this.name+"飞~~~");
}
@Override
public void run() {
System.out.println(this.name+"跑~~~");
}
@Override
public void swim() {
System.out.println(this.name+"游泳~~~");
}
}
再加上一个测试
package demomoreinher;
public class TestAnimal {
public static void eatFunc(Animal animal){
animal.eat();//实现eat的动态绑定
}
public static void walk(IRunning running){
running.run();//实现跑的动态绑定
}
public static void main(String[] args) {
walk(new Duck("唐老鸭",3));
eatFunc(new Fish("灵儿",2));
}
}
测试结果
接口间的继承
相当于将接口合并在一起了
代码理解
IC继承了IA和IB,使IC接口的功能包含了IA和IB的功能,当然类TestDeme在实现接口IC时,要将IA,IB和IC的方法一起都要重写
package demo5;
//接口继承问题
interface IA{
void testA();
}
interface IB{
void testB();
}
//IC接口不仅具备了自己的testC这个功能,还 扩展 了IA和IB的功能
interface IC extends IA,IB{
void testC();
}
class TestDemo implements IC{
@Override
public void testA() {
System.out.println("testA()");
}
@Override
public void testB() {
System.out.println("testB()");
}
@Override
public void testC() {
System.out.println("testC()");
}
}
文章来源:https://blog.csdn.net/2301_80898480/article/details/137365221
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: