Java成员内部类的访问问题(一):外部类以外的类中创建内部类对象

        这几天学Java,遇到成员内部类的问题了。关于内部类访问外部类,网上已经有很多资料了,可是外部类以及外部类以外的类访问内部类的情况资料很少。今天我做了一个小实验,探究是否可以在外部类以外的类中执行创建内部类对象的语句。

一、外部类和内部类都为public,它们的构造方法也都为public

        首先,我们写一个类OuterClass,再在它的内部创建一个类InnerClass。我们先将InnerClass设为public。代码如下:

public class OuterClass {
    private int i;

    public OuterClass(int i) {
        this.i = i;
        System.out.println("Outer Class created!");
    }

    public class InnerClass {
        protected int j;
        protected int k;

        public InnerClass(int j, int k) {
            this.j = j;
            this.k = k;
            System.out.println("Inner Class created!");
        }
    }
}

        然后,我们写主程序:

public class Main {
    public static void main(String[] args) {
        OuterClass out = new OuterClass(1);
        OuterClass.InnerClass in = out.new InnerClass(2,3);
    }
}

        在以上程序中,OuterClass是外部类,InnerClass是内部类,主方法main所在的Main类就是“外部类以外的类”。

        运行以上程序,我们发现程序可以成功运行,且结果如下:

Outer Class created!
Inner Class created!

        如果我们将主程序修改成下面的样子:

public class Main {
    public static void main(String[] args) {
        OuterClass.InnerClass in = new OuterClass.InnerClass(2,3);
    }
}

        那么运行会报错:an enclosing instance that contains OuterClass.InnerClass is required

        这说明,在外部类和内部类及它们的构造方法都为public时,可以在外部类以外的类(Main类)中执行创建内部类(InnerClass类)对象的语句,语法如下:

外部类.内部类 内部类对象名 = 外部类对象名.new 内部类(内部类构造方法参数列表)

        但是,这样做的前提是:要先创建外部类对象。创建了外部类的对象,才能在其基础上创建内部类对象。

二、外部类为public,内部类为private,它们的构造方法都为public

        我们将InnerClass的访问修饰符改为private,修改后的代码如下:

public class OuterClass {
    private int i;

    public OuterClass(int i) {
        this.i = i;
        System.out.println("Outer Class created!");
    }

    private class InnerClass {
        protected int j;
        protected int k;

        public InnerClass(int j, int k) {
            this.j = j;
            this.k = k;
            System.out.println("Inner Class created!");
        }
    }
}

        主程序代码如下:

public class Main {
    public static void main(String[] args) {
        OuterClass out = new OuterClass(1);
        OuterClass.InnerClass in = out.new InnerClass(2,3);
    }
}

        尝试运行程序,会报错:OuterClass.InnerClass has private access in OuterClass

        所以,如果内部类为private,则不能从外部类以外的类创建内部类的对象。

三、外部类和内部类都为public,外部类的构造方法为public,内部类的构造方法为private

        外部类和内部类的代码:

public class OuterClass {
    private int i;

    public OuterClass(int i) {
        this.i = i;
        System.out.println("Outer Class created!");
    }

    public class InnerClass {
        protected int j;
        protected int k;

        private InnerClass(int j, int k) {
            this.j = j;
            this.k = k;
            System.out.println("Inner Class created!");
        }
    }
}

        主程序代码:

public class Main {
    public static void main(String[] args) {
        OuterClass out = new OuterClass(1);
        OuterClass.InnerClass in = out.new InnerClass(2,3);
    }
}

        运行程序,会报InnerClass(int,int) has private access in OuterClass.InnerClass的错误。

        所以,如果内部类的构造方法为private,就不能从外部类以外的类创建内部类的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qifeng_xiaozi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值