Java 接口 及其在 Minecraft mod中相关应用

本文详细介绍了Java接口的使用,包括接口的定义、抽象方法、默认方法和静态方法。从Java8开始,接口可以包含默认方法和静态方法,解决了接口升级的问题。同时,接口中还可以定义常量。文中还通过实例展示了如何在实现类中重写接口方法以及如何使用接口的静态方法和常量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.接口简介

接口就是多个类的公共规范。只要符合规范标准,就可以大家通用。
接口是一种引用数据类型,最重要的内容就是其中的:抽象方法。

定义一个接口的格式:
    public interface 接口名称{
        //接口内容
    }
Note:换成了关键字interface之后,编译后所生成的字节码文件仍然是: .java --> .class。

Java 8中接口可以包含:

  1. 常量
    2.抽象方法工
    3.默认方法
    4.静态方法

如果是Java 9,还可以额外包含有:

  1. 私有方法

2.抽象方法

1.接口当中的抽象方法,修饰符是两个固定的关键字:public abstract
2.这两个关键字修饰符,可以选择性地省略。
3.方法的三要素,可以随意定义。

public interface MyInterfaceAbstract {
    //这是一个抽象方法
    public abstract void method1();
    
    //这也是抽象方法
    abstract void method2();
    
    //这也是抽象方法
    public void method3();
    
    //这也是抽象方法
    int method4();
}

在初期我们创建了 IHasModel 接口用于对模组中的物品模型进行注册

public interface IHasModel {
	
	public void registerModels();
	
}

在 ItemBase、ArmorBase等物品类中我们均为 IHasModel 接口的实现类,并对该类中的registerModels()方法进行了重写

public class ItemBase extends Item implements IHasModel
public class ArmorBase extends ItemArmor implements IHasModel
public class FoodBase extends ItemFood implements IHasModel

(@Override)重写registerModels()

	@Override
	public void registerModels() {
		Main.proxy.registerItemRenderer(this, 0, "inventory");
	}

3.接口使用步骤

  1. 接口不能直接使用,必须有一个"实现类"来"实现"该接口。
  2. 接口的实现类必须覆盖重写(@Override)接口中所有的抽象方法。实现:去掉abstract关键字,加上方法体大括号。 如果实现类并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类
  3. 创建实现类的对象,进行使用。
public class 实现类名称 implements 接口名称{
    //...
}

4.默认方法

从Java8开始,接口允许定义默认方法。接口当中的默认方法,可以解决接口升级的问题。

public default 返回值类型 方法名称(参数列表){
    //方法体
}

假如我们定义了一个接口 MyInterface

public interface MyInterface{
    //抽象方法
    public abstract void method();//新添加了一个抽象方法

    //添加一默认方法
    public default void methodDefault(){
        system.out.println("这是一个默认方法");
    }
}

创建一个实现类 MyInterfaceDefault

public class MyInterfaceDefault implements MyInterface {
    @Override
    public void method() {
        System.out.println("实现了抽象方法一");
    }
    
}

此时接口类中没有重写 MyInterface 中的methodDefault()方法,仍可以在Demo中创建对象并使用methodDefault()方法。

public class Demo{
    pubiic static void main(String[] args) {
    //创建实现类对象
    MyInterfaceDefault a = new MyInterfaceDefault();
    a.method(); //调用抽象方法,实际运行的是右侧实现类。
    
    //调用默认方法,如果实现类当中没有,会向上找接口
    a.methodDefault();
}
此时调用a.methodDefault()会输出默认方法字样
这是一个默认方法

当然我们可以在实现类中重写接口的默认方法

public class MyInterfaceDefault implements MyInterface {
    @Override
    public void method() {
        System.out.println("实现了抽象方法一");
    }
    
    //重写默认方法
    @Override 
    public void methodDefault() {
        System.out.print1n("实现类覆盖重写了接口的默认方法");
    }
}
此时调用a.methodDefault()会输出以下字样
实现类覆盖重写了接口的默认方法
所以对于接口的默认方法:
1.可以通过接口实现类对象,直接调用。
2.也可以被接口实现类进行覆盖重写。

5.静态方法

从Java 8开始,接口当中允许定义静态方法。(将abstract或者default换成static即可,带上方法体。)

public static返回值类型方法名称(参数列表){
    方法体
}

新建一个 MyInterfaceStatic 接口

public interface MyInterfaceStatic {
    //创建静态方法
	public static void methodStatic(){
		System.out.println("这是接口的静态方法! ");
}

Note:不能通过接口实现类的对象来调用接口当中的静态方法。正确用法:通过接口名称,直接调用其中的静态方法。

所以调用静态方法,无需创建对象!

标准格式:

接口名称.静态方法名(参数);

新建Demo1 进行静态方法调用

public class Demo1 {
	public static void main(String[] args) {
	//直接通过接口名称调用静态方法
	MyInterfaceStatic.methodStatic();
	}
}

6.接口常量定义和使用

接口当中也可以定义"成员变量",但是必须使用public static final三个关键字进行修饰。从效果上看,这其实就是接口的【常量】。

public static final 数据类型 常量名称 = 数据值;

Minecraft 1.12.2模组开发(十四) 建筑生成

在建筑生成一节我们介绍了如何在主世界生成自定义建筑

我们定义了一个 IStructure 的接口,其中使用的就是接口的常量定义
package com.Joy187.newmod.util;

import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.world.WorldServer;
import net.minecraft.world.gen.structure.template.PlacementSettings;
import net.minecraftforge.fml.common.FMLCommonHandler;

public interface IStructure {
                        //世界服务器
	public static final WorldServer worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().getWorld(0);
	                   //方块放置相关设置
	public static final PlacementSettings settings = (new PlacementSettings()).setChunk(null).setIgnoreEntities(false).setIgnoreStructureBlock(false).setMirror(Mirror.NONE).setRotation(Rotation.NONE);
}
之后我们创建了一个 实现类 ModWorldGenStructure ,
package com.Joy187.newmod.world;

import java.util.Random;

import com.Joy187.newmod.util.IStructure;
import com.Joy187.newmod.util.Reference;

import net.minecraft.block.state.IBlockState;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraft.world.gen.feature.WorldGenerator;
import net.minecraft.world.gen.structure.template.Template;
import net.minecraft.world.gen.structure.template.TemplateManager;

public class ModWorldGenStructure extends WorldGenerator implements IStructure{
	
	public static String structureName;
	public ModWorldGenStructure(String name) {
		this.structureName = name;
	}
	
	@Override
	public boolean generate(World worldIn, Random rand, BlockPos position) {
		this.generateStructure(worldIn, position);
		return true;
	}
	
	public static void generateStructure(World world,BlockPos pos) {
		MinecraftServer mcServer = world.getMinecraftServer();
		
		//调用中接口的常量
		TemplateManager manager = worldServer.getStructureTemplateManager(); 
		ResourceLocation location = new ResourceLocation(Reference.Mod_ID, structureName);	
		Template template = manager.get(mcServer,location);
		if(template != null) {
			IBlockState state = world.getBlockState(pos);
			world.notifyBlockUpdate(pos, state, state, 3);
			//调用中接口的常量
			template.addBlocksToWorldChunk(world, pos, settings);
		}
	}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值