java中使用嵌套的三种方法
2023-04-02 17:43:34
想了解新的关系在java中使用嵌套法,首先,让我们回顾过去,了解新的,了解接口的几个特性:
1、默认情况下,界面中定义的变量public static final 类型必须给出其初始值,因此实现类不能重新定义或改变其值
2、默认情况下,接口中的方法是 public abstract 类型的:
3、接口默认也是abstract:public abstract interface xx ===public interface xx
在在java中使用嵌套接口有三种方式:
一、嵌套接口在类中:
Java使你接口可以在类内部声明。声明结束后,接口将自动成为此类静态成员。无需使用static关键字声明界面。可以参考以下示例:
class EnclosingClass
{
interface Enclosedinterface
{
}
static interface Enclosedinterface
{
}
}
Enclosedinterface1和Enclosedinterface2是静态成员接口。它不等同于本地类,因为接口不能在块中声明。然而,接口可以在匿名类别的上下文中使用。嵌套接口通常不能从其包装类别之外访问。否则,它们可以声明为顶级接口。相反,它是从封闭类别中访问的,如下所示:
class EnclosingClass
{
interface Enclosedinterface
{
}
static interface Enclosedinterface
{
}
static class Enclosedclasss1 implements Enclosedinterface1, Enclosedinterface
{
}
class Enclosedclass2 implements Enclosedinterface1, Enclosedinterface
{
}
void m()
{
class Enclosedclasss3 implements Enclosedinterface1, Enclosedinterface
{
}
new Enclosedinterface1()
{
};
}
}
值得我们注意的是,静态成员类EnclosedClass1、非静态成员EnclosedClass2和本地EnclosedClass3实现了两个嵌套接口。然而,在匿名类别的上下文中只能实现一个接口。(有关匿名类别的更多信息,请参见Java中的静态类别和内部类别。)
Java的标准类库包括嵌套接口类。例如,InetAddress(java.在net包中)表示Internet协议地址,它声明了一个私人CachedAddresses和NameServiceAddresses静态成员类实现的私人接口。它还声明了由私人Platformnameservice和Hostsfilenameservice静态成员类实现的私人Nameservice接口。
二、嵌套接口在接口中
Java允许我们在界面内部声明界面。在这种情况下,嵌套接口是其封闭接口的静态成员,static关键字再次是多余的。而且,嵌套接口是隐式公共的。举个例子:
interface EnclosingInterface
{
interface Enclosedinterface // implicitly static and public
{
}
static interface Enclosedinterface // explicitly static and implicitly public
{
}
}
我们以封闭接口的名称和成员访问操作符为前缀,可以访问封闭接口。例如,指定EnclosingInterface.Enclosedinterface1访问Enclosedinterface1。
Java Collections Framework提供了对在另一个接口中嵌入一个接口的有用性的看法。考虑java.util.Map描述了一个映射接口(键-值对集合)。Mapap接口抽象成地图的含义。Hashmap和java.util.像TreeMap实现这样的Map描述了不同类型的地图实现。
Map声明Entry是其成员之一。Entry是描述键值对的嵌套接口。Entry之所以声明接口是Map,是因为两个接口之间的密切关系——每个项目都必须属于一个映射。Entry由java.util.Simplentry和SimplemutablentryAbstractmap类的静态成员类实现。通常,你会忽略这些静态成员并与他们互动.Entry。
三、嵌套类在接口中
Java的一种奇怪的语言功能是嵌套在接口中。与嵌套接口一样,嵌套类是隐藏的公共和静态的。例如,以下示例:
interface EnclosingInterface
{
class EnclosedClass
{
}
}
尽管这个代码看起来不错这很奇怪,但在接口内嵌套一个类是非常有用的,特别是当密封接口和密封类之间存在密切关系时。捕获这种关系可以提高源代码的可读性。如果类和接口有相同的名称,嵌套也可以帮助您避免两者之间的名称冲突。
举一个形象可寻址接口包含地址类别的例子。假设我们建模可搜索的实体,如信件、明信片和包裹。每个实体都将通过自己的类别进行描述,但它们都有可搜索到某个目的地的共性。每个类别都可以用重复的地址字段设计,或者我们这些详细信息可以抽象成公共超类。又或者,我们可以利用下面的Addresable界面。
Addressable.java
public interface Addressable
{
public class Address
{
private String boxNumber;
private String street;
private String city;
public Address(String boxNumber, String street, String city)
{
this.boxNumber = boxNumber;
this.street = street;
this.city = city;
}
public String getBoxNumber()
{
return boxNumber;
}
public String getStreet()
{
return street;
}
public String getCity()
{
return city;
}
public String toString()
{
return boxNumber + " - " + street + " - " + city;
}
}
public Address getAddress();
}
该Addresable接口将可找到的实体描述为包含地址。该地址由嵌套Adress类描述。Adress()方法由任何类别实现Adresable。
提供源代码Letter实现类Adresable。
Letter.java
public class Letter implements Addressable
{
private Addressable.Address address;
public Letter(String boxNumber, String street, String city)
{
address = new Addressable.Address(boxNumber, street, city);
}
public Address getAddress()
{
return address;
}
}
Letter存储单个address类型的字段Adresable.Address。嵌套类由Letter的构造函数实例化。实现的getadress()方法返回到此对象。现在考虑当我们向应用程序添加Postcard和Parcel类时会发生什么。下面所呈现的源代码Addresables应用程序,这表明Postcard、Parcel和Letter类型。
Addressables.java
public class Addressables
{
public static void main(String[] args)
{
Addressable[] addressables =
{
new Letter("100", "Main Street", "Town A"),
new Postcard("200", "Waterfront Drive", "Town B"),
new Parcel("300", "10th Ave", "Town C")
};
for (int i = 0; i < addressables.length; i++)
System.out.println(addressables[i].getAddress());
}
}
该main()方法首先创建Addresable对象数组。然后,它遍历这些对象,并调用getadress()每个对象。通过调用返回的Addresable.Address对象的tostring()方法Systemm.out.println()返回对象的字符串表示形式,然后输出表示形式。
编译=Postcard.java和Parcel.java如下:
javac *.java
操作应用程序如下所示:
java Addressables
输出:
100 - Main Street - Town A
200 - Waterfront Drive - Town B
300 - 10th Ave - Town C
嵌套接口(静态接口)具有静态方法
许多开发人员认为嵌套在接口中会违反面向对象的编程和接口的目的。然而,最好了解这个功能,因为它可能会在维护他人代码时遇到。此外,由于接口已发展成默认和静态方法,因此我们将类嵌套在接口中可能还有其他原因。例如,这是嵌套在静态接口中的本地类:
interface I
{
static void m()
{
class C
{
}
}
}
本文向大家介绍了嵌套技术和