我已经开始为OCJP7考试做准备了,我发现这一章看起来很复杂。
我们说我有这段代码:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class SEExample {
private static class Person {
private final int age;
private final int heightInCm;
public Person(int age, int heightInCm) {
this.age = age;
this.heightInCm = heightInCm;
}
public int getAge() {
return age;
}
public int getHeight() {
return heightInCm;
}
}
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person(14, 140),
new Person(15, 140),
new Person(16, 150),
new Person(17, 120));
List<Person> usingOneFilter = people
.stream()
.filter(p -> p.getAge() >= 16 && p.getHeight() >= 130)
.collect(Collectors.toList());
List<Person> usingTwoFilters = people
.stream()
.filter(p -> p.getAge() >= 16)
.filter(p -> p.getHeight() >= 130)
.collect(Collectors.toList());
}
}
您能否告诉我为什么我们可以以同样的方式访问class Outer1{
interface InnerInterface{
String x = "test";
}
class InnerClass{
String x = "test";
}
}
class Outer2{
static interface NestedInterface{
String x = "test";
}
static class NestedClass{
String x = "test";
}
}
class Main{
public static void main(String [] args){
String s1 = Outer1.InnerInterface.x;
String s2 = new Outer1().new InnerClass().x;
String s3 = Outer2.NestedInterface.x;
String s4 = new Outer2.NestedClass().x;
}
}
和Outer1.InnerInterface.x
?内部接口默认是静态的?我试图建立一些联系,使他们更清楚。
答案 0 :(得分:11)
嵌套类是其封闭类的成员。非静态嵌套 类(内部类)可以访问封闭的其他成员 类,即使它们被宣布为私有。静态嵌套类不会 可以访问封闭类的其他成员。作为会员 在OuterClass中,嵌套类可以声明为private,public, 受保护或包私有。 (回想一下,外类只能是 声明公开或包私有。)
无法实例化接口。因此,它们只有静态才有意义。将嵌套接口声明为静态是多余的。
此外,练习使用令人困惑的界面名称
InnerClass
和NestedClass
都是嵌套类。但是只有InnerClass
是一个内部类,因为&#34;内部类&#34;意味着&#34;非静态嵌套类&#34;。
同样地,人们可能期望InnerInterface
成为一个内部接口&#34;含义&#34;非静态嵌套接口&#34 ;;但这样的事情不存在。 InnerInterface
和NestedInterface
都是嵌套接口,它们都不是内部接口。
答案 1 :(得分:7)
是的,嵌套接口隐式static
。 Section 8.5.1 of the JLS州:
成员接口隐式
static
(第9.1.1节)。允许声明成员接口冗余地指定static
修饰符。
因此,您可以通过外部类x
和Outer1
以相同的方式通过嵌套接口访问Outer2
- 嵌套接口InnerInterface
和{ {1}}是NestedInterface
。
答案 2 :(得分:3)
您能否告诉我为什么我们可以以同样的方式访问
_.assign(Cat.prototype, { init : function(){ }} );
和Outer1.InnerInterface.x
?
因为它们都是Outer2.NestedInterface.x
个字段。
From Java Language Specification,Chapter 9. Interfaces,point 9.3 Field(Constant)声明:
接口主体中的每个字段声明都是隐式的
static
,public
和static
。
默认情况下,内部接口是静态的吗?
是
来自8.1.3 Inner Classes and Enclosing Instances:
成员接口(第8.5节)隐式
final
所以它们永远不会 被认为是内部阶级。
答案 3 :(得分:1)
你是对的。嵌套接口的关键字static
是不必要且冗余的。嵌套接口始终是静态的。
从逻辑的角度来看,接口定义绑定到外部类的特定实例也没有意义。