JAVA学习资料之成员内部类

本文深入探讨Java中的内部类概念,包括静态内部类和非静态内部类的区别,如何创建及使用这两种内部类对象,以及内部类的一些特性如可以访问外部类成员、继承接口等。

在类的成员中,有变量variable,有的称之为属性property)和方法method,有的称之为函数function)。现在,又添了一个class)。这是个很有意思的成员。

静态内部类又称为“嵌套类(nested class)”。因为只属于外部类,静态内部类不依赖于外部类所生成的对象,所以还不算奇怪。在外部类之内的方法中创建内部类对象就和创建一般对象一样没有区别。而在外部类之外创建内部类对象时,要明确内部类的位置:外部类类名.内部类类名 引用=new 外部类类名.内部类构造器; ,这使外部类看起来很像包。

而非静态内部类就很奇怪了。因为在有权限的情况下,类成员变量和方法在类生成的对象中是可以访问的,于是我们可以认为这些成员随类被具体化了。而类是抽象的,在外部类生成的具体对象中肯定不能访问成员内部类,并且在外部类具体化的同时内部类是不会被具体化的。然后你可能会想到直接通过类名来利用内部类,就和静态内部类一样。那么,就请注意这个非静态内部类和其他非静态成员一样是依赖于对象的,而不是类(可别犯概念错误!)。再说,如果这样,静态和非静态还有什么差别啊?可是类的非静态成员内部类到底哪里去了(要知道,它也可以用public来修饰啊)?类和对象看似水火不容,而Java偏偏就是把它们结合在了一起。既然结合了,就必然有办法在外部类外通过外部类对象来利用非静态成员内部类(在外部类中创建它的对象,与普通类没啥区别,不谈了)。创建它的对象的方法以前从来没有见过:
外部类类名.内部类类名 引用=new 外部类构造器.new 内部类构造器;

外部类类名.内部类类名 引用=外部类对象引用.new 内部类构造器;
我们不能直接在外部类对象中访问到非静态内部类的构造器,但能通过new运算符访问到(这种用法很怪)。还要注意的是,在静态方法中不能创建非静态内部类的对象

在编译后,内部类会有自己专有的class文件,其命名方式是:外部类名称$内部类名称.class

另外,我还做了一些试验:
1.在成员内部类中可以访问到其外部类的其他数据成员
2.内部类可继承或实现接口
3.内部类还可以拥有内部类
4.存在内部接口,只能出现在最外部类中或静态内部类中
5.非静态内部类不能拥有静态成员,静态内部类中可以拥有静态成员(内部接口也算静态成员)

附:试验代码

 

class MyAttempt1

{

    private int i=12;

    interface gg{public void p();}

    static int hh(){return 0;}

    public class aa implements gg

    {

        public void p()

        {

            ee ff=new ee();

            ff.p();

        }

        public class ee implements gg

        {

            public void p()

            {

                System.out.println(i);

            }

        }

        //interface gg{public void p();} 出错,提示说内部类成员不能有静态声明

        //static int hh(){return 0;} 出错,提示说内部类成员不能有静态声明

    }

    public static void main(String[] args)

    {

        MyAttempt1 dd=new MyAttempt1();

        dd.bb();

    }

    private void bb()

    {

        aa cc=new aa();

        cc.p();

    }

}

 

class MyAttempt2

{

    private int i=12;

    //public static class aa implements gg 出错,提示说找不到符号

    public static class aa

    {

        public void p()

        {

            ee ff=new ee();

            ff.p();

        }

        public class ee implements gg

        {

            public void p()

            {

                //System.out.println(i); 出错,提示说无法从静态上下文中引用非静态变量i”

                System.out.println(hh());

            }

        }

        interface gg{public void p();}

        static int hh(){return 0;}

    }

    public static void main(String[] args)

    {

        MyAttempt2 dd=new MyAttempt2();

        dd.bb();

    }

    private void bb()

    {

        aa cc=new aa();

        cc.p();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值