Java内部和嵌套类

时间:2015-07-29 20:39:02

标签: java class

我已经开始为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?内部接口默认是静态的?我试图建立一些联系,使他们更清楚。

4 个答案:

答案 0 :(得分:11)

来自Oracle's Java Tutorial

  

嵌套类是其封闭类的成员。非静态嵌套   类(内部类)可以访问封闭的其他成员   类,即使它们被宣布为私有。静态嵌套类不会   可以访问封闭类的其他成员。作为会员   在OuterClass中,嵌套类可以声明为private,public,   受保护或包私有。 (回想一下,外类只能是   声明公开或包私有。)

无法实例化接口。因此,它们只有静态才有意义。将嵌套接口声明为静态是多余的。

此外,练习使用令人困惑的界面名称  InnerClassNestedClass都是嵌套类。但是只有InnerClass是一个内部类,因为&#34;内部类&#34;意味着&#34;非静态嵌套类&#34;。
同样地,人们可能期望InnerInterface成为一个内部接口&#34;含义&#34;非静态嵌套接口&#34 ;;但这样的事情不存在。 InnerInterfaceNestedInterface都是嵌套接口,它们都不是内部接口。

答案 1 :(得分:7)

是的,嵌套接口隐式staticSection 8.5.1 of the JLS州:

  

成员接口隐式static(第9.1.1节)。允许声明成员接口冗余地指定static修饰符。

因此,您可以通过外部类xOuter1以相同的方式通过嵌套接口访问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)声明:

  

接口主体中的每个字段声明都是隐式的   staticpublicstatic

  

默认情况下,内部接口是静态的吗?

来自8.1.3 Inner Classes and Enclosing Instances

  

成员接口(第8.5节)隐式final所以它们永远不会   被认为是内部阶级。

答案 3 :(得分:1)

你是对的。嵌套接口的关键字static是不必要且冗余的。嵌套接口始终是静态的。

从逻辑的角度来看,接口定义绑定到外部类的特定实例也没有意义。