长沙北大青鸟大计教育
在线测试

八一八Java的内部类,你知道多少?

发布时间:2013-04-26

  Java内部类问题,在这给大家分享一下。 在说之前,我先列出几个问题:

  1.外部类(非主类)通过怎样的方式访问内部类?

  2.内部类能不能访问主类私有的属性,为什么?

  3.内部类能不能继承别的类和接口?

  4.内部类能不能是static的?

  5.在主类的方法里面可不可以定义内部类?

  6.初始化主类的时候是不是也把内部类给初始化了?为什么?

  7.怎样写一个匿名的内部类?

  我目前想到的就这些,在我给大家陈述之前,希望大家好好想想,再往下看:

  第一个问题:外部类是怎样引用内部类的?这个问题,我想,可能有的人就会这样写:

  这是内部类:InnerClass.

  1publicclassMainClass {

  2

  3 publicclassInnerClass{

  4 publicString name="name";

  5

  6 publicString getName() {

  7 returnname;

  8 }

  9

  10 publicvoidsetName(String name) {

  11 this.name=name;

  12 }

  13 }

  14}

  以下是引用:

  1publicclassCheckClass {

  2 publicstaticvoidmain(String[] args) {

  3 InnerClass innerClass=newInnerClass();

  4 System.out.println(innerClass.getName());

  5 }

  6}

  如果这样写的话,会报编译错误。那么为什么会报错呢?因为在Java的设计中,如果想访问一个类的内部类,你必须通过宿主类去取它,然后,再对它进行操作,Java就是想这样把内部类给封闭起来的,好吧,正确的写法,我给大家贴出来:

  以下是内部类的写法:

  1publicclassMainClass {

  2 publicInnerClass getInnerClass() {

  3 returnnewInnerClass();

  4 }

  5

  6 publicclassInnerClass {

  7 publicString name="name";

  8

  9 publicString getName() {

  10 returnname;

  11 }

  12

  13 publicvoidsetName(String name) {

  14 this.name=name;

  15 }

  16 }

  17}

  如果你想访问Java内部类,你必须先拿到它的宿主类,这样你才能对内部类进行操作:

  1 public class CheckClass {

  2 public static void main(String[] args) {

  3 MainClass mainClass = new MainClass();

  4 System.out.println(mainClass.getInnerClass().getName());

  5 }

  6 }

  这样的话,编译就不会报错了。

  好了,该回答第二个问题了,就是内部类能不能访问宿主类的私有属性?回答是可以的。如果,你会看JVM的源码的话,你就会看到,在编译内部类调用主类私有变量时,会把它们转换成一种特殊的符号,JVM会把这种符号解析成公有的,然后让内部类调用。代码很简单,我就不贴了。

在线申请

北大青鸟免费试听课程

 我已同意《隐私政策说明》
马上申请

学校地址: 长沙市天心区团结路6号

报名热线: 4008-0731-86 / 0731-82186801

Copyright © 2006 北大青鸟长沙大计教育
长沙市岳麓区大计职业技能培训学校有限公司版权所有

湘ICP备14017520号-3