怎么证明接口内所有方法都自动是public的

本文介绍了接口作为抽象类的特殊形式,其定义了类之间的公共行为规范,并通过Java反射技术验证了接口中的抽象方法及静态变量的公开特性。

接口是只是特殊的抽象类,它不包含普通方法,只包含抽象方法。而这些抽象方法就是多个类共同的公共行为规范,需要类去遵守,这些行为是与外部交流的通道,这就意味着接口通常定义的都是公共的用法,接口只关心这些类有没有遵守这些方法,而不去关心这些类的内部数据,也不关心这些类的方法实现细节。打个比方来说,接口就是一个公司的规章制度,部门就是类,那规章制度都是公开的要求大家遵守的,不可能把它私有起来不让别人看吧,那就没有意义了。

那怎么证明呢,可以用反射。

定义接口文件

package com.zhangqi.jvm;

import java.util.Date;

public interface ITest {
	
	double PI = 3.14;
	Date CREATE_TIME = new Date();
	
	void play();
	String getName();
}

接下来,测试方法来反射获取静态变量和方法。

package com.zhangqi.jvm;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest {

	public static void main(String[] args) throws ClassNotFoundException {

		// 加载com.zhangqi.jvm.ITest类文件
		Class<?> clazz = Class.forName("com.zhangqi.jvm.ITest");
		
		// 获取类中所有方法
		Method[]  methods = clazz.getDeclaredMethods();
		
		// 遍历每个方法,并输出该方法
		for (Method method : methods) {
			System.out.println(method.toString());
		}
		
		System.out.println("~~~~~~~~~~~~~~~~~~~~~");
		
		// 获取类中所有静态变量
		Field[] fields = clazz.getDeclaredFields();
		
		// 遍历所有常量
		for (Field field : fields) {
			System.out.println(field);
		}
	}
}

执行之后得到结果如下:

public abstract java.lang.String com.zhangqi.jvm.ITest.getName()
public abstract void com.zhangqi.jvm.ITest.play()
~~~~~~~~~~~~~~~~~~~~~
public static final double com.zhangqi.jvm.ITest.PI
public static final java.util.Date com.zhangqi.jvm.ITest.CREATE_TIME

  

转载于:https://www.cnblogs.com/boucher/p/5682140.html

<think>好的,我现在需要回答用户关于C#接口中属性默认访问修饰符的问题,特别是在Unity中的情况。首先,我得回忆一下C#接口的基本规则。根据引用[1]的内容,接口成员不能有修饰符,而且都是公有的。所以接口的属性默认应该是public的。不过用户提到的是Unity中的C#,这会不会有什么不同呢? 接下来,我需要确认引用中的信息是否准确。引用[1]明确指出接口不能包含字段、构造函数等,只能声明方法、属性、索引器和事件,并且所有成员都是公有的,不需要也不能加访问修饰符。比如例子中的IHelpHander接口方法没有修饰符,实现类Human将它们标记为public,这说明接口成员在实现时必须显式公开。 用户的问题是关于属性是否默认为public。根据C#语言规范,接口成员默认访问级别是public,因为接口定义的是公共契约,实现类必须公开这些成员。因此,在接口中定义的属性即使不写public,也会自动public的。例如,在接口中声明一个属性string Name { get; set; },实现时也必须用public修饰。 再考虑Unity的情况,Unity使用的C#版本可能影响这一点吗?一般来说,Unity遵循C#的语言规范,所以接口属性的默认访问级别应该还是public。引用[2]和[3]提到的是其他内容,如readonly和单例模式,但并未涉及接口属性,所以不影响当前问题。 总结起来,用户的问题答案是接口中的属性默认是public,且不能在接口中显式添加修饰符。实现时必须用public实现。在Unity中也是如此,因为这是C#本身的特性,Unity不会修改这一点。</think>在 C# 中,接口(`interface`)内定义的成员(包括属性、方法等)**默认访问修饰符为 `public`,且不允许显式声明修饰符**。这是由接口的契约性质决定的:接口要求实现类必须对外提供这些成员的可访问性。 --- ### 详细说明 1. **接口成员的默认修饰符** 根据引用[1]的描述: > *接口中不允许声明成员的修饰符,接口成员都是公有的* 这意味着接口内定义的属性(如 `string Name { get; set; }`)默认是 `public`,且不能添加 `private`、`protected` 等修饰符。 2. **实现接口时的要求** 实现接口的类必须将接口成员显式标记为 `public`。例如: ```csharp interface IExample { int Value { get; set; } // 默认 public,但无需显式声明 } class MyClass : IExample { public int Value { get; set; } // 必须显式使用 public } ``` 如果省略 `public`,编译器会报错:*“必须声明主体,因为它未标记为 abstract、extern 或 partial”*[^1]。 3. **Unity 中的表现** Unity 使用 C# 语言规范,因此上述规则完全适用。在 Unity 脚本中实现接口属性时,仍需显式添加 `public` 修饰符,例如: ```csharp public class Player : MonoBehaviour, IHealth { public int Health { get; set; } // 正确实现接口属性 } ``` --- ### 总结 - **接口属性默认是 `public`**,且不能显式声明其他修饰符。 - **实现类必须用 `public` 修饰符** 显式声明接口属性。 - Unity 中遵循与 C# 相同的接口规则。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值