当前位置: 首页 > 知识库问答 >
问题:

内部类和嵌套类

傅鸿波
2023-03-14

Oracle留档(在下面的链接)说:

非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的。

但在下面的示例中,我创建了一个对象objin(内部类),它无法访问其封闭外部类的任何方法或变量。下面是代码,你能解释一下吗?

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

package Package_1;
public class Outer {

    int k;
    public void Multiply()
    {
        System.out.println("inside outer class' method multiply");
    }

    public class Inner {
        int l;
        public void Division()
        {
            System.out.println("inside inner class' method Divison");
        }

    }
}

使用Main方法初始化

package Package_1;

public class D {

    public static void main(String[] args) {
        Outer objout = new Outer();
        objout.k = 5;
        objout.Multiply();

        Outer.Inner objin = objout.new Inner();
        objin.l = 7;
        objin.Division();          
    }
}

对于objin对象,我无法访问其封闭类中的Multiple方法。

共有3个答案

芮安顺
2023-03-14

文档并没有说您可以通过引用内部类来访问外部类的字段和方法。所以你不能这么做

objin.Multiply();

因为乘不是一种内在的方法。您可以做的是:

public class Inner {
    int l;
    public void Division()
    {
        System.out.println("I can access the field k in outer: " + k);
        System.out.println("I can access the method Multiply in outer (even if Multiply was private): ");
        Multiply();
        // which is a shortcut for
        Outer.this.Multiply();
    }
}

PS:请遵守Java命名约定。方法以小写字母开头。

田普松
2023-03-14

这就是规范所说的

public class Outer{
   private int x;
   private void method(){
   }
   public void publicMethod(){} 

   public class Inner{

      //has access to even private properties of x
      method(); //can be called

      //NOTE: Only has ACCESS and does not INHERIT those methods
   }

}

您尝试的是使用internal实例访问publicMethod(),该实例没有任何该名称的方法。

克鲁斯:

非静态嵌套类只能访问容器类的所有属性和方法,但不能继承这些方法。

代码〉客观。Multiply()不能工作,因为症结解释了Multiply()是在外层而不是内部上定义的,所以在内部上没有方法Multiply()

秋向阳
2023-03-14

从非静态嵌套类(内部类)的代码中,您可以访问封闭类的公共成员和私有成员。

这就是您在尝试执行objin时的想法。Multiply():您正在访问Multiply(),就好像它是内部类的成员一样,但它不是。请记住,您可以从内部类的代码中看到它,但它不会像是您的一样被公开。

 类似资料:
  • 本文向大家介绍深入理解Java嵌套类和内部类,包括了深入理解Java嵌套类和内部类的使用技巧和注意事项,需要的朋友参考一下  一、什么是嵌套类及内部类 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类

  • 问题内容: Go支持在函数内部嵌套结构,但除了lambda之外没有嵌套函数,这是否意味着无法在函数内部定义嵌套类? 因此,类在函数内部被削弱感到有点奇怪。 有什么提示吗? 问题答案: 实际上,无论您要声明 带有 接收器还是 不 带有接收器的函数都没有关系:不允许在Go中嵌套函数。 尽管您可以使用函数文字来实现以下目的: 在这里,我们创建了一个具有函数类型的变量,并将其分配给另一个函数。调用“外部”

  • 问题内容: 我正在为新网站构建 用户类 ,但是这次我在考虑构建它有点不同… C ++ , Java 甚至 Ruby (可能还有其他编程语言)都允许在主类内部使用嵌套/内部类,这使我们可以使代码更加面向对象和组织化。 在PHP中,我想这样做: 这在PHP中可行吗?我该如何实现? 更新 如果不可能,将来的PHP版本是否会支持嵌套类? 问题答案: 介绍: 嵌套类与其他类的关系与外部类略有不同。以Java

  • JVM为内部类成员和方法分配空间的方式有什么不同吗。请提供所有可用类型的嵌套类(静态、本地、非静态、匿名)在此上下文中的区别。我从其他各种渠道寻找,但没有弄清楚。

  • 使用Laravel 5.6,我试图从MySQL类别表中显示子类别的子类别。我想传递这个名字,并获得它的所有子类,而不管父类是什么。 类别表 期望结果 return App\Category::where('name','Child-1-P-2'))-

  • 目标 了解如何定义嵌套类和何时适合使用它们 了解使用嵌套类的副作用 了解 new 运算符在嵌套类中的特殊用法 了解如何和何时使用静态内部类和匿名内部类 在何处使用嵌套类 顾名思义,嵌套类(或内部类) 是在一个类中定义的另一个类。 public class EnclosingClass { . . . public class NestedClass { . . . } } 像成